# 理解意图和实体

提示

技术手段很重要,但在对话机器人这个领域里面起到决定性作用的是开发一个好的基础性的 NLU 组件。

# 意图

所谓意图,是指一个句子(用 chatbots 的话术来讲就是用户会话)核心要表达的意思。比如下面几个句子,几种不同的说法都是表达了饿了这个意思,我们把它命名为 i_am_hungry:

  • I am hungry
  • I need to eat something
  • I am starving
  • My kingdom for a pizza

如何让我们的模型学到识别句子中 i_am_hungry 意图的能力呢?很简单,通过创建一个包含各种不同意图的 数据集,然后训练模型去区分不同的意图即可。

下面是一个简单的示例,展示了一个大约 150 条数据,包含 2 个不同意图的数据集:

我们说意图代表了一个句子的意思,那么一个程序是怎样理解一个句子的呢?简单的讲我们可以认为存在一种方法,这种方法可以把字词的意思用数字(其实是向量)的方式来表示,更具体的解释在这里,其中最最核心的概念是这些代表字词的向量是可以拿来做有意义的比较的(就是说字词之间的距离是可以被计算的),向量之间的距离越小,就说明这些向量代表的字词含义越接近。

Rasa 里面默认是通过 Spacy 管道来调用它默认 预训练好的 词向量,当然你也可以采用 Tensorflow 的管道,后者会在你的数据集上重新训练、生成一套词向量,这也就意味着你需要更多的数据来做训练,但同时也意味着该方案可以有效的提高你的对话机器人的识别准确率和域词典(domain vocabulary)的准确率,并且在识别拼写错误方面获得更灵活的处理能力。

提示

目前为止, Botfront 仅支持 Tensorflow 的管道,新版的 Spacy 里面其实已经通过 huggingface 的 Transformers 插件同时支持了 Tensorflow 和 PyTorch 管道。

一般来讲,一个意图代表了一个动作或者一种期望。

# 实体

所谓实体是指会话中的一些位置元素,比如下面这个例子中,我们要做一个汇率计算助理,要计算汇率我们需要知道用户希望用持有的货币和用户需要兑换的货币。

最佳实践

这里我们有两个实体,分别是 currency_buycurrency_sell,分别被赋予了不同的值,给实体命名一个通俗易懂的名字非常重要。

一个反例

像下例中这样,把实体的名字命名成跟它代表的值一样是一个非常常见的错误。

最后一点需要注意的是,意图识别和实体抽取是两个不同的任务,换句话说,会话中包含相同的实体并不能说明这些会话就有相同的意图。