2017 年 11 月

第 33 卷,第 11 期

此文章由机器翻译

认知服务 - 使用认知服务从文本挖掘目标情绪分析

通过 Ashish Sahu

人类语言已经形成了许多世纪和,因此,往往具有复杂的规则以控制激动人心的表达式。作为的人类语言的专业人员,我们通常依赖于学习和各种社交约定主一个或多个语言和使用它们来表示自己在不同情况下。质量和知识来将反映在我们保留在各种设置,包括产品评论、 联机和脱机格式的调查响应以及类似的响应。它们遵循相同的语言规则,并提供测试和向前移动从事人类语言表达式机器学习模型迫切地机会。

现在,社交网络发挥很好调整常用的观点。我们参与展开讨论每一件事,快速我们想法和同意或同意相互的世界若要查看所有。这些体验还溢出到我们购物习惯,且通常我们保留我们对我们购买的操作和服务的视图,我们评审形式重试。

因为我们不能以物理方式查看和评估我们想要购买联机的内容,我们通常要保留到他人意见评估如何持久的还是可靠它们可能。这些检查可能附带提供最小方便对它们进行排序的星级评分。但是,星级实际上不会提供其他人的体验与产品或产品质量的准确反映-有时它们只是一项比预期更高版本附带。

这样将得到与只在一个选项-读取整个现有评审并作出猜测有关什么是准确和不有关产品问题。时,它可帮助,则很耗时且效率低下。现在,但是,文本分析和语言分析 Api,属于 Microsoft 认知服务,可帮助。

就像其他认知服务一样的文本分析和语言分析 Api 是托管的服务。没有你需要下载、 配置或训练之前开始使用这些人工智能 (AI) 软件的基于 Api 来执行了令人惊叹的操作。

文本分析 API 可以推导出的信息,例如所讨论的关键短语和表示文本中的观点的文本的语言。语言分析 API,与此相反,使便于理解语言的概念和自由格式文本中的操作。它执行的词性 (POS) 标记、 词汇切分和句子之间的分离,以及其他用途。挖掘从客户反馈信息并了解用户的意图和文本的结构,你可以使用此 API。

在本文中,我将展示如何这些 Api 工作和其中使用它们来从各种形式的文本遇到每日生成见解的方案。

文本分析有什么作用?

文本分析 API 是一套的生成使用 Azure 机器学习的服务。在撰写本文时,可以使用以下的 API 操作来执行前面所述的操作:

  • 检测语言确定发送到 120 支持的语言从 API 的文本的语言。
  • 关键短语输入文本中查找关键短语。
  • 观点检测到的观点分数越高,模型,其中表示正面的人气度 0 和 1 之间,返回一个数值分数的文本。
  • 检测主题发现主题或从集的批处理操作中的文本的短语。此操作标记为不推荐使用,并不会在本文中介绍。

文本分析 API 预先训练后执行这些操作,并且不需要任何培训数据。它可以处理大部分最购物门户上评审。为了帮助你更好地了解文本分析 API 的功能,看一看以下示例查看:

"此电话具有很好的电池。显示为尖锐和亮。但存储没有我需要的应用"。

这段摘录反映使用手机购物者的体验。让我们通过不同的 API 操作运行此示例中,并请参阅什么 //mysql.com。

与此同时,你可以使用任何实用工具 (如 Fiddler、 Postman 或 Curl) 选择对于这些测试以查看为您自己的结果。你还可以使用 API 测试控制台中,API 参考文档中可用。但,你需要知道然后才能测试运行这些 Api 的一些事项:

  1. 你需要订阅密匙。如果你没有 Azure 订阅,你可以从一个试用密钥bit.ly/2eLG8OT
  2. 该 API 需要接收采用以下格式的文本记录:
{
  "documents": [
    {
      "language": "string",
      "id": "string",
      "text": "string"
    }
  ]
}

此格式适用于的关键短语和观点操作。但是,你将需要删除对检测语言操作调用的"语言"字段。

我将从简单的测试,以确定示例文本的语言开始并且将格式化请求正文如下所示:

{
  "documents": [
    {
      "id": "1",
      "text": "This phone has a great battery. The display is sharp and bright. 
        But the store does not have the apps I need."
    }
  ]
}

我使用 Curl 实用程序,并且下面是我的请求的外观:

curl -v -X POST "https://westus.api.cognitive.microsoft.com/text/analytics/v2.0/languages"
-H "Content-Type: application/json"
-H "Ocp-Apim-Subscription-Key: my-trial-key"

--data-ascii "{
  "documents": [
    {
      "id": "1",
      "text": "This phone has a great battery. The display is sharp and bright. 
        But the store does not have the apps I need."
    }
  ]
}"

我将此请求后重新获取的结果显示在和图 1

图 1 语言导致

{
  "documents": [
    {
      "id": "1",
      "detectedLanguages": [
        {
          "name": "English",
          "iso6391Name": "en",
          "score": 1
        }
      ]
    }
  ],
  "errors": []
}

如你所见,结果是已评分的响应,并且检测到提交的文本记录的语言为英语。你是欢迎试用不同的语言,以查看它的工作原理。

接下来,我将通过关键短语终结点运行同一条记录。我需要更改具有更新的终结点和请求正文我 Curl 命令,如下所示:

curl -v --silent -X POST "https://westus.api.cognitive.microsoft.com/text/analytics/v2.0/keyPhrases"
-H "Content-Type: application/json" 
-H "Ocp-Apim-Subscription-Key: my-trial-key"
--data-ascii '{ 
  "documents": [
  { "language": "en",
    "id": "1",
    "text": "This phone has a great battery. The display is sharp and bright. 
      But the store does not have the apps I need."
  } 
  ] 
}'

响应所示图 2

图 2 键短语结果

{
  "documents": [
    {
      "keyPhrases": [
        "phone",
        "great battery",
        "display",
        "store",
        "apps"
      ],
      "id": "1"
    }
  ],
  "errors": []
}

如你所见,关键短语终结点已检测到从示例查看相应的短语。

现在让我们看看此审查表示 positivity 刻度上。我将通过观点终结点运行相同的文本,并请参阅什么再次。下面是我 Curl 命令:

curl -v --silent -X POST "https://westus.api.cognitive.microsoft.com/text/
  analytics/v2.0/sentiment"
-H "Content-Type: application/json" 
-H "Ocp-Apim-Subscription-Key: my-trial-key"
--data-ascii '{ 
  "documents": [
  { "language": "en",
    "id": "1",
    "text": "This phone has a great battery. The display is sharp and bright. 
      But the store does not have the apps I need."
  } 
  ] 
}'

并且此时间是以下结果:

{
  "documents": [
    {
      "score": 0.770478801630976,
      "id": "1"
    }
  ],
  "errors": []
}

结果更简单这一次,且您可以看到评审观点分数是.77 就,,范围为 0 到 1 即 77%。这表示文本主要正面的人气-你可以从文本推导出的。

现在,我已使用所有可用的操作运行此文本审查,我将组合使用它们来查看总体结果:

  • 文本:此电话具有很好的电池。显示为尖锐和亮。但存储没有我需要的应用。
  • 语言:英语
  • 关键短语: 电话、 极佳电池、 显示、 应用商店、 应用
  • 观点:77 百分比

此试验演示了文本分析认知服务可以为文本评审、 调查响应和输入的客户做些什么。但是,与语言分析服务结合使用,我可以 distil 甚至更深入的见解。

语言分析一下:相差多少?

文本分析 API 使用预先训练的模型来分析文本来检测语言、 关键短语和心声等的信息。与此相反,语言分析 API 使用高级语言分析工具来处理文本输入,并允许您了解个语句的结构。然后,此种了解可用于挖掘文本记录中的信息、 解释用户的命令和处理来自任何源的自由格式文本。

我不一个翻译,因此我将其保留解释此服务的细节信息到某人的作业。在本文中,我将仅涵盖此服务的基础知识,然后返回到本文中,这是从文本输入生成更深入地且有意义的见解的原始意图。

语言分析 API 使用 analysers 的概念来了解文本记录的结构。目前,支持三种类型:

  • 令牌
  • POS 标记
  • 角色群树

这些分析器来自宾夕法尼亚 Treebank,即允许语言的分析 API,若要了解给定输入文本中的单词的名词或者谓词批注、 已分析的文本集。例如,"I love Bing !"和"让我 bing 这为你"word 必应使用不同的容量。

让我们使用此示例了解语言分析的工作原理及其幻数。就像与文本分析,你将需要一个试用密钥如果你没有 Azure 订阅。

一旦您具有密钥,只需启动您的选择将请求发送到语言分析 API 的工具。使用此 API 有可用的两个操作:

  • 列出分析器返回 analysers 要为令牌、 POS 标记和角色群树分析文本的列表。
  • 分析文本分析您提供使用的分析器在请求中提供的文本输入。

图 3显示简单的 GET 请求到列表分析器终结点返回的内容。

图 3 到列表分析器终结点的简单的 GET 请求的结果

[
  {
    "id": "4fa79af1-f22c-408d-98bb-b7d7aeef7f04",
    "languages": [
      "en"
    ],
    "kind": "POS_Tags",
    "specification": "PennTreebank3",
    "implementation": "cmm"
  },
  {
    "id": "22a6b758-420f-4745-8a3c-46835a67c0d2",
    "languages": [
      "en"
    ],
    "kind": "Constituency_Tree",
    "specification": "PennTreebank3",
    "implementation": "SplitMerge"
  },
  {
    "id": "08ea174b-bfdb-4e64-987e-602f85da7f72",
    "languages": [
      "en"
    ],
    "kind": "Tokens",
    "specification": "PennTreebank3",
    "implementation": "regexes"
  }
]

我将使用前面所述的分析器来分析此文本:"I Love Bing !让我 Bing 这为你,"请求正文的格式,如下所示:

{
  "language" : "en",
  "analyzerIds" : ["4fa79af1-f22c-408d-98bb-b7d7aeef7f04", 
    "22a6b758-420f-4745-8a3c-46835a67c0d2", 
    "08ea174b-bfdb-4e64-987e-602f85da7f72"],
  "text" : "I love Bing! Let me bing this for you" 
}

下面是我 Curl 命令:

curl -v --silent -X POST https://westus.api.cognitive.microsoft.com/ 
  linguistics/v1.0/analyze
-H "Content-Type: application/json" 
-H "Ocp-Apim-Subscription-Key: my-trial-key" 
--data-ascii ' {
  "language" : "en",
  "analyzerIds" : ["4fa79af1-f22c-408d-98bb-b7d7aeef7f04", 
    "22a6b758-420f-4745-8a3c-46835a67c0d2", 
    "08ea174b-bfdb-4e64-987e-602f85da7f72"],
  "text" : "I love Bing! Let me bing this for you" 
}'

对此请求的响应所示图 4

图 4 分析示例文本

[
  {
    "analyzerId":"4fa79af1-f22c-408d-98bb-b7d7aeef7f04",
    "result":[
      [
        "PRP",
        "VBP",
        "VBG",
        "."
      ],
      [
        "VB",
        "PRP",
        "JJ",
        "DT",
        "IN",
        "PRP"
      ]
    ]
  },
  {
    "analyzerId":"22a6b758-420f-4745-8a3c-46835a67c0d2",
    "result":[
      "(TOP (S (NP (PRP I)) (VP (VBP love) (NNP Bing)) (. !)))",
      "(VP (VBD Let) (S (NP (PRP me)) (VP (VBG bing) (NP (DT this)) 
      (PP (IN for) (NP (PRP you))))))"
    ]
  },
  {
    "analyzerId":"08ea174b-bfdb-4e64-987e-602f85da7f72",
    "result":[
        {
          "Len":12,
          "Offset":0,
          "Tokens":[
            {
              "Len":1,
              "NormalizedToken":"I",
              "Offset":0,
              "RawToken":"I"
            },
            {
              "Len":4,
              "NormalizedToken":"love",
              "Offset":2,
              "RawToken":"love"
            },
            {
              "Len":4,
              "NormalizedToken":"Bing",
              "Offset":7,
              "RawToken":"Bing"
            },
            {
              "Len":1,
              "NormalizedToken":"!",
              "Offset":11,
              "RawToken":"!"
            }
          ]
        },
      {
        "Len":24,
        "Offset":13,
        "Tokens":[
          {
            "Len":3,
            "NormalizedToken":"Let",
            "Offset":13,
            "RawToken":"Let"
          },
          {
            "Len":2,
            "NormalizedToken":"me",
            "Offset":17,
            "RawToken":"me"
          },
          {
            "Len":4,
            "NormalizedToken":"bing",
            "Offset":20,
            "RawToken":"bing"
          },
          {
            "Len":4,
            "NormalizedToken":"this",
            "Offset":25,
            "RawToken":"this"
          },
          {
            "Len":3,
            "NormalizedToken":"for",
            "Offset":30,
            "RawToken":"for"
          },
          {
            "Len":3,
            "NormalizedToken":"you",
            "Offset":34,
            "RawToken":"you"
          }
        ]
      }
    ]
  }
]

结果是基于每个请求的 POS 标记、 角色群树和在此示例中的令牌中发送分析器隔离式的。

如你所见,POS 标记是文本的为每个输入,虽然角色群树分析器返回输入的树状结构标记为标记和文字文本中单词的只是文本的标记。令牌分析器返回最可读的结果,其中它包括在记录中的位置以及文本输入中有关每个单词的信息。

本文中,我将使用角色群树和令牌分析器将文本评审细分根据句子分隔信息和一起单词的单独记录。

如果你想要了解有关语言分析 API 和相关的概念,我建议你阅读该完整的 API 文档在bit.ly/2eTc2Nj

现在让我们返回的文本分析 API 使用的原始示例:"此电话具有很好的电池。显示是尖锐和亮但存储没有我需要的应用"。

没有在示例中这一次的细微更改因为我已删除对原始示例在第二个句子末尾的段,并使用过的"但"若要组合的第三个句一起单词。你将看到我有这样的用途。

我现在将调用分析文本操作与以下请求正文的语言分析 api:

{
  "language" : "en",
  "analyzerIds" : ["22a6b758-420f-4745-8a3c-46835a67c0d2", "08ea174b-bfdb-4e64-987e-602f85da7f72"],
  "text" : "This phone has a great battery. 
    The display is sharp and bright but the store does not have the apps I need." 
}

我正在发送的角色群树和令牌分析器仅与此请求。图 5显示的结果。

图 5 使用分析文本的语言分析 API 的操作

[
  {
    "analyzerId": "22a6b758-420f-4745-8a3c-46835a67c0d2",
    "result": [
      "(TOP (S (NP (DT This) (NN phone)) (VP (VBZ has) 
        (NP (DT a) (JJ great) (NN battery))) (. .)))",
      "(TOP (S (S (NP (DT The) (NN display)) (VP (VBZ is) (ADJP 
        (JJ sharp) (CC and) (JJ bright)))) (CC but) (S 
        (NP (DT the) (NN store)) (VP (VBZ does) (RB not) 
        (VP (VB have) (NP (NP (DT the) (NNS apps)) (SBAR (S 
        (NP (PRP I)) (VP (VBP need)))))))) (. .)))"
    ]
  },
  {
    "analyzerId": "08ea174b-bfdb-4e64-987e-602f85da7f72",
    "result": [
      {
        "Len": 31,
        "Offset": 0,
        "Tokens": [
          {
            "Len": 4,
            "NormalizedToken": "This",
            "Offset": 0,
            "RawToken": "This"
          },
          {
            "Len": 5,
            "NormalizedToken": "phone",
            "Offset": 5,
            "RawToken": "phone"
          },
          {
            "Len": 3,
            "NormalizedToken": "has",
            "Offset": 11,
            "RawToken": "has"
          },
          {
            "Len": 1,
            "NormalizedToken": "a",
            "Offset": 15,
            "RawToken": "a"
          },
          {
            "Len": 5,
            "NormalizedToken": "great",
            "Offset": 17,
            "RawToken": "great"
          },
          {
            "Len": 7,
            "NormalizedToken": "battery",
            "Offset": 23,
            "RawToken": "battery"
          },
          {
            "Len": 1,
            "NormalizedToken": ".",
            "Offset": 30,
            "RawToken": "."
          }
        ]
      },
      {
        "Len": 76,
        "Offset": 32,
        "Tokens": [
          {
            "Len": 3,
            "NormalizedToken": "The",
            "Offset": 32,
            "RawToken": "The"
          },
          {
            "Len": 7,
            "NormalizedToken": "display",
            "Offset": 36,
            "RawToken": "display"
          },
          {
            "Len": 2,
            "NormalizedToken": "is",
            "Offset": 44,
            "RawToken": "is"
          },
          {
            "Len": 5,
            "NormalizedToken": "sharp",
            "Offset": 47,
            "RawToken": "sharp"
          },
          {
            "Len": 3,
            "NormalizedToken": "and",
            "Offset": 53,
            "RawToken": "and"
          },
          {
            "Len": 6,
            "NormalizedToken": "bright",
            "Offset": 57,
            "RawToken": "bright"
          },
          {
            "Len": 3,
            "NormalizedToken": "but",
            "Offset": 64,
            "RawToken": "but"
          },
          {
            "Len": 3,
            "NormalizedToken": "the",
            "Offset": 68,
            "RawToken": "the"
          },
          {
            "Len": 5,
            "NormalizedToken": "store",
            "Offset": 72,
            "RawToken": "store"
          },
          {
            "Len": 4,
            "NormalizedToken": "does",
            "Offset": 78,
            "RawToken": "does"
          },
          {
            "Len": 3,
            "NormalizedToken": "not",
            "Offset": 83,
            "RawToken": "not"
          },
          {
            "Len": 4,
            "NormalizedToken": "have",
            "Offset": 87,
            "RawToken": "have"
          },
          {
            "Len": 3,
            "NormalizedToken": "the",
            "Offset": 92,
            "RawToken": "the"
          },
          {
            "Len": 4,
            "NormalizedToken": "apps",
            "Offset": 96,
            "RawToken": "apps"
          },
          {
            "Len": 1,
            "NormalizedToken": "I",
            "Offset": 101,
            "RawToken": "I"
          },
          {
            "Len": 4,
            "NormalizedToken": "need",
            "Offset": 103,
            "RawToken": "need"
          },
          {
            "Len": 1,
            "NormalizedToken": ".",
            "Offset": 107,
            "RawToken": "."
          }
        ]
      }
    ]
  }

如你所见,角色群树分析器到两个句子中断的文本记录,并指示一起 word"但"标记抄送结果中。如前所述,我特意在第二个句子末尾句点字符中的原始文本为了删除突出显示的语言分析 API 这一功能。

最好一起使用

此小实验演示分成三个单独的句子,现在可以通过使用文本分析 API 来获取有关输入客户更深入的见解处理原始示例非常可靠方式。你可能会认为简单字符串分析和拆分将提供类似的结果脱机,但的变得更容易被认为比完成-为此采取我的单词。

现在,在同样的方式我可以执行语言分析 API 的输出,然后使用简单的字符串操作例程,在任何编程语言中,将分开评论插入各个部分。对原始示例可以分为以下三个部分:

  • 此电话具有很好的电池
  • 显示是尖锐和亮
  • 存储没有我需要的应用

让我们运行使用单独的文本分析 API 这三个部分,看到什么再次和如何这能让你将更好地查看。我现在将使用关键短语和文本分析 API 的观点操作,并显示转换为目标的强大反映在输入的文本的观点分析此 API 的输出。

我还需要删除标点符号和任何连词以获取最佳的分析。我更改要到关键短语终结点,然后执行到观点终结点首先传递的令牌逐个我 Curl 脚本。图 6显示我结果。

图 6 使用文本分析 API 输出的语言分析 API

{
  "documents": [
    {
      "keyPhrases": [
        "great battery"
      ],
      "id": "1"
    }
  ],
  "errors": []
}
{
  "documents": [
    {
      "score": 0.814330127882407,
      "id": "1"
    }
  ],
  "errors": []
}
{
  "documents": [
    {
      "keyPhrases": [
        "display"
      ],
      "id": "1"
    }
  ],
  "errors": []
}
{
  "documents": [
    {
      "score": 0.94089591967051,
      "id": "1"
    }
  ],
  "errors": []
}
{
  "documents": [
    {
      "keyPhrases": [
        "store",
        "apps"
      ],
      "id": "1"
    }
  ],
  "errors": []
}
{
  "documents": [
    {
      "score": 0.255424793209646,
      "id": "1"
    }
  ],
  "errors": []
}

如果我编译为用户友好格式这些结果,下面是如下所示:

  • 此电话具有极佳 batteryKey 短语: 极佳 batterySentiment:81%
  • 显示为清晰和 brightKey 短语: displaySentiment:94%
  • 存储没有应用我 needKey 短语: 应用商店、 appsSentiment:25%

在讨论本文前面的文本分析 API 时,我将通过 API 运行完整的审查,并看到评审具有 77%正面的人气。但是,使用语言的 API 运行评审、 将其分解到其各个单独的标记,然后处理,将其与文本分析 API 提供每个的 phone 问题和目标的观点分析的各个方面获得更逼真评估其中。

也会被清除一种更好的应用选择此电话,将带来了这样的审查远大于初始 77%总体 positivity。

总结

我最近是跨标志行、"数据是新的电力"。 就像电力变得的第二个工业 revolution 血液,数据是在刚前] AI revolution 血液。作为开发人员,在收集数据的所有时间,在各种窗体中。一种越来越重要形式的数据是客户输入的作为评审购物和旅行门户,在调查响应、 反馈和建议同时关闭-和 online,等等。它也变得越来越常见客户捐赠公开提供这种反馈,使其更为重要,认真对待此信息。组织希望确保向其客户侦听并采取适当措施以修正在遇到与产品和服务的任何问题。文本分析和语言分析认知服务是你需要为你的客户执行司法工具。


Ashish Sahu* 是高级技术推广员在 Microsoft 印度与开发人员体验一起使用,帮助 Isv 和初创企业克服技术挑战,采用最新技术,并不断发展到下其解决方案级别。他可以致电 ashish.sahu@microsoft.com。*

衷心感谢以下 Microsoft 技术专家对本文的审阅:Sandeep Alur


在 MSDN 杂志论坛讨论这篇文章