1.3.4 自然语言理解
自然语言理解(Natural Language Understanding, NLU)是一个比较宽泛的领域。这里的NLU是指分析用户语言中表达的意图(intent)和相关实体(entity)的技术。NLU模块主要对用户的问题在句子级别进行分类和意图识别(intent classification);同时在词级别找出用户问题中的关键实体,并且进行实体槽填充(slot filling)。
举一个简单的例子,用户说“我想吃羊肉泡馍”,NLU模块就可以识别出用户的意图是“寻找餐馆”,而关键实体是“羊肉泡馍”。有了意图和关键实体,就方便了DM模块对后端数据库进行查询。若有信息缺失,则继续多轮对话,从而补全其他缺失的实体槽。
从NLP和机器学习的角度看,意图识别是一个很传统的文本分类问题,实体槽填充是一个很传统的命名实体识别问题。这两者都需要标注数据。
一个标注数据的例子包含“greet”“affirm”“restaurant_search”“medical”等几种不同的意图;在“restaurant_search”中有“food”这种实体,而在“medical”中有“disease”这种实体。实际上,我们需要比这个多得多的标注数据才可以训练出可用的模型。下面是Rasa中NLU数据的格式。
看上去这和使用规则的AIML数据非常相像。然而NLU数据实际用到了以这些标注数据训练出的模型更复杂的机器学习模型,表现能力和泛化能力大大增强。只要列出了“拉面”和“麻辣烫”,如果出现“凉皮”“糖葫芦”等词,良好的NLU系统就会成功地将它们标识为食物。
输入的文本首先要经过分句、分词、词性标注等基础自然语言预处理。对某些应用来讲,指代消解是非常重要的步骤。将原有的指代词甚至零指代补全成完整名称,可以消除很多NLU数据的歧义。
然后要进行特征处理和模型训练。在传统上,有很多人工造出来的“number_of_tokens”“symbols_in_between”“bag_of_words_in_between”等特征,通过线性分类、支持向量机等机器学习分类模型,以及隐马尔可夫模型、条件随机场等机器学习序列标注模型来进行意图识别与实体识别。还有一种方法是在大量语料上使用word2vec进行非监督训练,将词的特征隐含在词向量中,通过深度学习的模型来进行意图识别与实体识别。
模型训练方法有比较高的召回率,即可以覆盖更多不同的用户输入。同时,我们可以结合上面提到的规则模块,将一些高精确度的规则整合成为特征的一部分来帮助我们训练机器学习的模型。一种NLU的架构方案如图1-7所示。
图1-7 一种NLU的架构方案
读者在后面会看到Rasa在NLU模块中是如何高效而开放地实现NLP的。