2018 年 7 月

第 33 卷,第 7 期

认知服务 - 改进 LUIS 意图分类

通过Zvi Topol |2018 年 7 月

语言理解智能服务 (LUIS),它是 Microsoft 认知服务的一部分,提供了一种机器学习解决方案的自然语言理解。有许多用例中的为 LUIS,包括聊天机器人、 语音接口和认知搜索引擎。

简单地说,如果给定的文本用户输入,也称为语音样本,LUIS 返回背后语音样本,也就是说,哪些用户想要询问有关检测到的目的。它还检测不同的实体,对实际对象的引用 — 在查询文本中都出现。此外,它会输出每个意向和检测到的实体的置信度分数。这些是 1,该值指示最多关于该检测的置信度和 0 表示至少确信有关它的范围 [0,1] 中的数字。

先前的 MSDN 杂志 》 文章已介绍如何 LUIS 的详细信息中的基础知识。具体而言,我建议您参阅文章"启用自然语言交互使用 LUIS,"通过 Ashish Sahu (msdn.com/magazine/mt745095) 如何开始使用 LUIS 有关其他信息。

本文将精力集中于两个开源工具,Scattertext 和酸橙色,它可帮助你了解的检测和分类的意向,luis。(接下来,我将使用检测和分类互换使用。)

具体而言,我将介绍如何使用此类工具以您了解某些分类过程和解释为什么 LUIS 是不确定的有关其意向检测在某些情况下,通常在其中检测到给定的查询文本的顶部意图采用类似的情况下置信度得分,例如两个方法之间的 50-50 拆分。它是更有可能输出在这种情况下不正确的方法。

尽管 LUIS 当前支持某些故障排除功能,包括可帮助识别和语音样本是,有没有 word 级别可视化效果和分析工具确定应重新训练的学习活动可进一步帮助解决此类不确定性。Scattertext 和酸橙色可帮助在用来解决这一限制。

现在让我们看看将充当运行示例的简单金融科技用例。假设适用于银行,并且你已了解用户问题可分为两个类别的任务:

  • 有关其个人的问题银行帐户,如:
    "什么是我的存款帐户余额?"
    "什么是我的支票帐户中的最新事务?"
    "我想我节省语句以重新发送"
    "已收到我年 4 月的薪金尚未?"
    "何时最后一个单元格电话自动支付处理?"
    "什么是年度费率为我节省帐户?"
    "什么是我的支票帐户中的欠款?"
  • 问题或有关其他银行业务服务,包括房屋贷款、 汽车贷款等,如请求:
    "我想要寻求有关抵押费率"
    "谁可以我说出与有关房屋贷款?"
    "什么是为期一年存款帐户的年度速率?"
    "哪些条款是否提供抵押?"
    "由谁来负责房屋贷款?"
    "什么是年度费率储蓄帐户?"
    "如何抵押贷款的费率比较到其他银行?"

该计划是使用 LUIS 进行自然语言解读的用户请求。有关此转的一种方法是创建两个意向和定型 LUIS 以进行检测。

让我们来调用第一个类别的意向 PersonalAccountsIntent 和第二个类别的意向 OtherServicesIntent。然后,可以使用前面列出定型 LUIS 语音样本示例。它将创建一个自动调用未使用任何常规查询文本,它应该是非常不同于前两个意向的第三个"全部捕捉"意向。你还可以为 None 意向提供其他示例。

定型后,可以将模型发布到生产环境中。您还可以查看在 LUIS UI 中,不同的意图的置信度分数以及语音样本,如中所示图 1

使用其置信度得分 PersonalAccountsIntent 语音样本
图 1 PersonalAccountsIntent 语音样本使用其置信度得分

在仪表板提供了一些基本的摘要统计信息有关应用程序。如果看一下在仪表板图 1,您会注意到,PersonalAccountsIntent 最低置信度得分 0.59 并获取有关语音样本,"什么是年度费率为我节省帐户?" 在 0.44 时关闭此查询文本,将其归类为 OtherServicesIntent 是漂亮的置信度分数。这意味着,LUIS 不是非常确定如何对此意图进行分类。

理想情况下,您希望你的意向为区分从另一个提供高的颇有自信地,即,具有非常高置信度得分的一种意图,而其他意向具有非常低的分数。如果重新访问这两个意向的语音样本列表,您将看到还有另一个非常类似查询文本的示例 ("什么是为期一年存款帐户的年度速率?"),以不同方式为 OtherServicesIntent 标记为。

使用此信息,可以微调您查询文本的示例使用不同的域和非重复的单词。

在这里,我介绍了每个意向的七个语音样本示例。但是,如果没有多个意图 (在撰写本文 LUIS 可以对多达 500 种不同意图进行分类) 和许多的每个意向的更多语音样本示例?

很明显,需要更多系统性的方法来解决这一挑战。接下来,我将介绍如何帮助 Scattertext 和酸橙色。

了解使用 Scattertext 意向分类

Scattertext 是 Jason Kessler 用 Python 编写的开放源代码工具。您会发现的源代码和教程,说明如何在bit.ly/2G0DLmp,和一篇标题为"Scattertext: 用于可视化的基于浏览器的工具如何主体不同,"用于说明在详细信息,该工具在bit.ly/2G05ow6.

Scattertext 应运而生,此工具可直观显示的差异和相似之处的文本的文章,也称为主体,两个集合之间,并且有可能会发现很有用; 的各种功能例如,它还支持表情符号。

在本文中,我将利用工具以生成可视化效果的差异和两个意向,PersonalAccountsIntent 和 OtherServicesIntent 的语音样本示例之间的相似之处。

若要安装 Scattertext,需要 Python 版本 3,请在本教程中执行的安装说明。我还建议您安装 Spacy,开放源自然语言处理库 (spacy.io) 和 Pandas (pandas.pydata.org),另一个开放源代码库,可使用内存中表格的数据。

现在,我需要查询文本示例送入 Scattertext。为此,我将创建 CSV 表包含两个列,一个用于语音样本,另一个用于意向。查询文本列将为新行字符分隔的一个字符串,包含查询文本示例。(如果您使用的 Excel,你可以使用 Alt + Enter 可在单个单元格中输入多行。) 意向列将包括意向,在这种情况下,PersonalAccountsIntent 和 OtherServicesIntent 的标签。因此,对于此示例的结果是一个 2 x 2 CSV 表。

你现在可以使用 Python 运行中的代码图 2。代码将 CSV 表加载到 Panda 数据帧,然后将它到 Scattertext,指定与类别 (意图) 和输出格式相关的几个参数。

图 2 Scattertext 可视化代码

import scattertext as st
import space
import pandas as pd
examples_data_location = 'example.csv'
two_df = pd.read_csv(examples_data_location, encoding = 'utf8')
nlp = spacy.en.English()
corpus = st.CorpusFromPandas(two_df,
                              category_col='intent',
                              text_col='utterance',
                              nlp=nlp).build()
html = st.produce_scattertext_explorer(corpus,
  category='PersonalAccountsIntent',category_name='PersonalAccountsIntent',
  not_category_name='OtherServicesIntent', width_in_pixels=1000)
open("MSDN-Visualization.html", 'wb').write(html.encode('utf-8'))

Scattertext 将生成包含可视化效果显示顶部的词语唯一的每个意向,以及它们由这两个意向共享的 HTML 页。此外,还有您可以查找特定词的搜索框中,如果找到,将突出显示可视化效果中。在内容很多可视化效果,这可能非常有用。图 3显示了此示例中的 Scattertext 输出。

Scattertext 可视化效果
图 3 Scattertext 可视化效果

通过计算每个意向的语音样本示例的单词频率并显示单词,使它能够更轻松地采用了 Scattertext works 确定意向之间差异和相似性。此时,计数只能包含一个单词表达式 (获得)。但是,如果您有包含多个字,例如"自动付费,"的表达式可以学习一些预处理,以指定你希望。例如,可以表示"自动支付"作为"auto_pay。"

中的可视化效果图 3显示两个目的 — OtherServicesIntent 在 X 轴和 Y 轴上的 PersonalAccountsIntent。显得更接近靠下右对齐的单词很有可能会出现在查询文本的示例为 OtherServicesIntent,例如"房屋贷款"和"比率,"而留在顶部出现的单词是那些更有可能出现在查询文本的示例PersonalAccountsIntent,如"我的"和"帐户。 在对角线上的单词很可能会出现在查询文本示例中为这两个目的,例如,"节省"操作"。

特定词频繁出现在这两个意向的语音样本示例学习可以帮助您优化查询文本示例,以提高分类置信度和准确性。

若要执行此操作的一种方法是通过添加更多不同的单词或甚至重新表述每个意向的语音样本示例,其中包括单词经常在这种以便呈现它们更明显。

使用 Scattertext 的优点是可以从工具中获取值,即使对于小型数据集,每个意向的七个语音样本示例我玩具的示例。很明显,更多语音样本示例每意图,更复杂变得若要查找的差异和它们之间的相似之处。Scattertext 可以帮助您快速直观的方式在喜欢的差异和相似之处。

它也是值得注意可以以类似的方式都使用 Scattertext 时通过一次比较的意图对具有两个以上的意图。

解释使用酸橙色的意向分类

现在让我们看一下名为浅或本地可解释不限模型的说明,可用于解释意向分类的开放源代码工具。您会发现的源代码和教程,说明如何在bit.ly/2I4Mp9z,标题为学术研究论文和"我为什么应信任您?:说明预测的任何分类器"(bit.ly/2ocHXKv)。

以 Python 编写酸橙色,可以在运行代码之前在本教程中按照安装说明图 4

图 4 使用酸橙色来分析查询文本

import requests
import json
from lime.lime_text import LimeTextExplainer
import numpy as np
def call_with_utterance_list(utterance_list) :
  scores=np.array([call_with_utterance(utterance) for utterance in
    utterance_list])
  return scores
def call_with_utterance(utterance) :
  if utterance is None :
    return np.array([0, 1])
  app_url ='your_url_here&q='
  r = requests.get(app_url+utterance)
  json_payload = json.loads(r.text)
  intents = json_payload['intents']
  personal_accounts_intent_score =
    [intent['score'] for intent in intents if intent['intent'] ==
    'PersonalAccountsIntent']
  other_services_intent_score = [intent['score'] for intent in intents if
    intent['intent'] == 'OtherServicesIntent']
  none_intent_score = [intent['score'] for intent in intents if
    intent['intent'] == 'None']
  if len(personal_accounts_intent_score) == 0 :
      return np.array([0, 1])
  normalized_score_denom = personal_accounts_intent_score[0]+
    other_services_intent_score[0]+none_intent_score[0]
  score = personal_accounts_intent_score[0]/normalized_score_denom
  complement = 1 - score
  return (np.array([score, complement]))
if __name__== "__main__":
  explainer = LimeTextExplainer(class_names=['PersonalAcctIntent', 'Others'])
  utterance_to_explain = 'What are annual rates for my savings accounts'
  exp = explainer.explain_instance(utterance_to_explain,
    call_with_utterance_list, num_samples=500)
  exp.save_to_file('lime_output.html')

暗黄可以解释为不同的形式,包括图像和文本分类器。我使用酸橙色,输出有关各种查询文本中单词的 word 级别见解的文本版本。范围广泛的分类器时我使用 LUIS 作为我的所选的分类器,可以填充到酸橙色;它们实质上是被视为黑框。

酸橙色文本版本的工作原理大致按如下所示:它随机通过删除任意数量的单词,然后调用 LUIS 上每个创建多个修改或输入查询文本的示例。样本数由参数 num_samples,控制在图 4设置为 500。对于示例查询文本,已修改查询文本可以包括如"是每年的帐户"和"哪些年费率为我节省费用。"的变体

暗黄使用 LUIS 从返回的置信度分数以适合分类置信度得分上的单个单词的效果,然后根据一个线性模型。此估计值可帮助你识别置信度得分是可能会更改,如果要从查询文本中删除单词,然后运行分类器如何再次 (如我所示更高版本)。

分类器的唯一主要要求是输出的分类标签的置信度得分。通过不同的类别的置信度得分概率分布,作为处理,因此应该在范围 [0,1] 和总和为 1。LUIS 输出在该范围内定义的意向和其他的置信度得分 None 意向,但这些不保证总和为 1。因此,当使用酸橙色,我将规范化 LUIS 分数以总和为 1。(这是在函数 call_with_utterance。)

中列出的代码图 4酸橙色用于生成说明有关查询文本的预测,"什么是年度费率为我节省帐户?" 然后会生成 HTML 可视化效果,所示图 5

暗黄输出"什么是年度费率为我节省帐户?" 查询文本
图 5 酸橙色输出的"什么是年度费率为我节省帐户?" 查询文本

在中图 5可以看到查询文本,此处侧重于 PersonalAccountsIntent 而不是两个意向,OtherServicesIntent 和 None 的预测的概率。(请注意,概率是非常接近,但不完全相同作为置信度分数的输出由 LUIS 由于规范化)。 此外可以看到最重要的词来进行分类为 PersonalAccountsIntent (这些是顶部的蓝色条的字,还会以语音样本文本中的蓝色突出显示),其目的。条的权重指示应从查询文本删除单词对分类置信度分数的影响。因此,例如,"我的"是最明显的效果,在这种情况下检测查询文本的意图的单词。如果我要从查询文本中删除它,则置信度得分也会随着 0.30,通过减少从 0.56 到 0.26 之间。这是生成的酸橙色的估算值。事实上,当删除词管理和维护"什么是年度费率储蓄帐户?"到 LUIS 语音样本,结果是 PersonalAccountsIntent 置信度得分是 0.26 之间,并且意图现在信心十足地分类为 OtherServicesIntent,评分的有关 0.577 (请参阅图 6)。

图 6 结果"什么是年度费率为我节省帐户?" 查询

{
  "query": "what are annual rates for savings accounts",
  "topScoringIntent": {
    "intent": "OtherServicesIntent",
    "score": 0.577525139
  },
  "intents": [
    {
      "intent": "OtherServicesIntent",
      "score": 0.577525139
    },
    {
      "intent": "PersonalAccountsIntent",
      "score": 0.267547846
    },
    {
      "intent": "None",
      "score": 0.00754897855
    }
  ],
  "entities": []
}

其他重要的词为"帐户"和"节省"的"my"以及提供类似于 Scattertext 所提供的见解。

具有大量负权重两个重要的字词是"年度"和"速率"。 这意味着从查询文本中删除它们会增加查询文本被归类为 PersonalAccountsIntent 置信度得分。Scattertext 介绍了"比率"是在查询文本示例中为 OtherServicesIntent,更常见,因此这不是大惊奇。

但是,新增了某些东西需要学习从酸橙色-word"年"作为对于意图在这种情况下也不属于 PersonalAccountsIntent,在确定 LUIS 很重要,并且将其删除预计要增加的置信度分数通过 0.27 PersonalAccountsIntent。实际上,删除之前将馈送将语音样本每年,我可以获得更高版本的置信度得分的 PersonalAccountsIntent 意向,即 0.71 (请参阅图 7)。

图 7 结果"什么是费率为我节省帐户?" 查询

{
  "query": "what are rates for my savings accounts",
  "topScoringIntent": {
    "intent": "PersonalAccountsIntent",
    "score": 0.71332705
  },
  "intents": [
    {
      "intent": "PersonalAccountsIntent",
      "score": 0.71332705
    },
    {
      "intent": "OtherServicesIntent",
      "score": 0.18973498
    },
    {
      "intent": "None",
      "score": 0.007595492
    }
  ],
  "entities": []
}

这样一来,酸橙色可帮助你识别该驱动器分类置信度得分的重要的词。因此,它可以提供见解,以帮助您微调你查询文本的示例以提高意向的分类准确性。

总结

我已表明,开发基于 NLU,应用程序时的某些语音样本意向预测可能会相当困难和更好地了解如何对查询文本示例进行微调以提高分类准确度有所帮助。

了解 word 级差异和相似性语音样本之间的任务可以生成渐进的过程中的具体指南。

我介绍了两个开源工具,Scattertext 和酸橙色,通过标识会影响意向预测的关键词提供 word 级别指导。Scattertext 直观显示差异和相似之处的查询文本示例中的单词频率而酸橙色标识重要影响意向分类置信度得分的词。

我希望这些工具将帮助您生成更好地基于 NLU 的产品使用 LUIS。


Zvi Topol一直在各种行业垂直领域,包括市场营销分析、 媒体和娱乐和工业物联网数据科学家就。他已传递,并会导致多个机器学习和分析项目包括自然语言和语音接口、 认知搜索、 视频分析、 推荐器系统和市场营销决策支持系统。他可以致电zvitop@gmail.com

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


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