Pull Text Analytics data

Medallia’s Text Analytics engine works by associating topics, themes and sentiment to free text data.

Accessing TA data for a comment field

Comment fields can be expanded on to retrieve TA information. For every topic or theme, the Query API can return the ID, name, and region where the tag occurred. For sentiment taggings, the Query API returns the sentiment identified, and the region.

Example: Pulling TA data for field q_bp_cc_additional_channels_used_cmt

query textAnalyticsData {
  feedback(ids: "23391") {
    nodes {
      additionalChannels: fieldData(
        fieldId: "q_bp_cc_additional_channels_used_cmt"
      ) {
        ... on CommentFieldData {
          field {
            id
            name
          }
          values
          topics: ruleTopicTaggingsPage {
            nodes {
              topic {
                id
                name
              }
              regions {
                startIndex
                endIndex
              }
            }
          }
          themes: dataTopicTaggingsPage {
            nodes {
              topic {
                id
                name
              }
              regions {
                startIndex
                endIndex
              }
            }
          }
          sentiment: sentimentTaggingsPage {
            nodes {
              sentiment
              regions {
                startIndex
                endIndex
              }
            }
          }
        }
      }
    }
  }
}

Sample response

{
  "data": {
    "feedback": {
      "nodes": [
        {
          "additionalChannels": {
            "field": {
              "id": "q_bp_cc_additional_channels_used_cmt",
              "name": "Additional Channels Used Comment"
            },
            "values": [
              "Erin was very kind and quick to respond!"
            ],
            "topics": {
              "nodes": [
                {
                  "topic": {
                    "id": "663",
                    "name": "Staff - Attitude"
                  },
                  "regions": [
                    {
                      "startIndex": 0,
                      "endIndex": 4
                    },
                    {
                      "startIndex": 14,
                      "endIndex": 18
                    }
                  ]
                }
              ]
            },
            "themes": {
              "nodes": [
                {
                  "topic": {
                    "id": "5909",
                    "name": "Answer"
                  },
                  "regions": [
                    {
                      "startIndex": 32,
                      "endIndex": 39
                    }
                  ]
                },
                {
                  "topic": {
                    "id": "17819",
                    "name": "Kind Quick"
                  },
                  "regions": [
                    {
                      "startIndex": 23,
                      "endIndex": 28
                    },
                    {
                      "startIndex": 14,
                      "endIndex": 18
                    }
                  ]
                },
                {
                  "topic": {
                    "id": "5885",
                    "name": "Kind"
                  },
                  "regions": [
                    {
                      "startIndex": 14,
                      "endIndex": 18
                    }
                  ]
                },
                {
                  "topic": {
                    "id": "17322",
                    "name": "Answer Quick"
                  },
                  "regions": [
                    {
                      "startIndex": 32,
                      "endIndex": 39
                    },
                    {
                      "startIndex": 23,
                      "endIndex": 28
                    }
                  ]
                }
              ]
            },
            "sentiment": {
              "nodes": [
                {
                  "sentiment": "STRONGLY_POSITIVE",
                  "regions": [
                    {
                      "startIndex": 0,
                      "endIndex": 40
                    }
                  ]
                }
              ]
            }
          }
        }
      ]
    }
  },
  "errors": null,
  "_links": null,
  "_allowed": [
    "POST",
    "GET"
  ]
}

Matching taggings

To find topic, theme, or sentiment taggings matching specific filter criteria, use the nodes ruleTopicTaggingsPage, dataTopicTaggingsPage, and sentimentTaggingsPage. Each node is available when expanding on a comment field, like so:

Example: Find all sentiment taggings that match the criteria

query findTaggings($taFilter: TaggingFilter!) {
  feedback(ids: "23391") {
    nodes {
      matchingTaggings: fieldData(
        fieldId: "q_bp_cc_additional_channels_used_cmt"
      ) {
        ... on CommentFieldData {
          sentimentTaggingsPage(filters: [$taFilter]) {
            nodes {
              sentiment
              regions {
                startIndex
                endIndex
              }
            }
          }
        }
      }
    }
  }
}

The nodes take a filter as input; pass it as a variable for readability:

Use of variables in the filter for readability

{
  "taFilter": {
    "commentFields": [
      "q_bp_cc_additional_channels_used_cmt"
    ],
    "tagpools": ["26"],
    "topics": ["623"],
    "topicType": "RULE",
    "sentiments": [
      "STRONGLY_POSITIVE",
      "POSITIVE",
      "MIXED_OPINION",
      "NEGATIVE",
      "STRONGLY_NEGATIVE",
      "NO_OPINION"
    ]
  }
}

The filter must include either the ID of a given tag pool, or a list of topic IDs. Contact your Medallia representative to find these IDs.

The filter also determines whether the query returns data topics (themes) or rule topics (topics). It is not possible to filter on data and rule topics at the same time.

You must provide a list of sentiments.

Sample response

{
  "data": {
    "feedback": {
      "nodes": [
        {
          "matchingTaggings": {
            "sentimentTaggingsPage": {
              "nodes": [
                {
                  "sentiment": "STRONGLY_POSITIVE",
                  "regions": [
                    {
                      "startIndex": 0,
                      "endIndex": 40
                    }
                  ]
                }
              ]
            }
          }
        }
      ]
    }
  },
  "errors": null,
  "_links": null,
  "_allowed": [
    "POST",
    "GET"
  ]
}

Combine the results from the ruleTopicTaggingsPage, dataTopicTaggingsPage, and sentimentTaggingsPage nodes to get all matching taggings.

Finding records with a comment

For every comment field in the system there is a field that tracks the number of characters in the comment. If the field is called q_bp_cc_additional_channels_used_cmt the length will be stored in the field comment_length_q_bp_cc_additional_channels_used_cmt. All comments are concatenated in the field a_comments, so to find all records that have a comment across comment fields, filter on a_comment_length.

To find comments with a comment, simply filter on the length of the comment being greater than 0:

filter: {
          fieldIds: "a_comment_length"
          gt: "0"
        }