NLU定义
自然语言理解(NLU)就是要获得一个计算机能用来计算的语义框架
文字本身就是人类用来承载语义的工具,语义框架就是对其含义的抽象,语言的表示是多样的,但是背后的语义是不变的,明确的语义框架就可以由计算机处理。
应用
NLU目前应用比较成熟的领域大概有两大类
1、人机对话
2、搜索与推荐系统
对话系统中的NLU模块
人机对话中,NLU是对话系统的重要组成部分,用户每次的输入都要NLU模块的处理。主要解决以下任务:
1、意图的识别,识别用户想要干啥
2、实体识别,对信息进行标注以用于后续多轮对话填槽
3、情感识别 闲聊机器人可能需要识别用户的情绪以影响给用户的回复
这里以谷歌的dialogflow为例
目前对话系统最普遍的就是语料丢进去直接进行意图分类
目前的对话系统丢入10条以上的数据就可以有个初步的识别效果。后期需要进行进一步训练达到精确识别。
虽然无法看到背后的技术原理,猜测应该是基于神经网络的模型,能快速提取特征实现分类任务,而且和实体识别一块儿完成
基于模板的意图识别(百度UNTI)
对话模板是对话系统按具体语法、句式做出的示范,教它在某一个特定语法、句式中理解对话意图,哪个词是重要信息,对应的词槽、特征词是什么。
例如: [D:sys_loc][D:sys_time]天气如何,上述标注表示可以将所有满足[城市]+[时间]+天气如何这一规则的query解析,这样的模板句式命中天气询问的意图。
基于模板的意图识别是传统的手动设计特征的方式做识别。但目前随着深度学习预训练模型的完善,识别意图所以依赖的数据大大减少,基本上都趋于使用通过语料训练的模式。
不论是用什么方式,意图识别最终解决的是一个分类问题,只是告诉系统这属于 【订酒店】还是【问天气】
实体识别与槽填充
“实体”是 Dialogflow 用于从自然语言输入中识别和提取有用数据的一种机制。例如:北京→city 包子→food ;
在任务型对话中,对于任务完成必要的实体信息我们称为槽位(比如询问天气总得知道哪里、什么时候),识别这种实体信息的过程叫填槽;一般系统会本身附带通用的实体,比如时间、地点等;在具体的任务中有些实体信息需要我们自己定义。一般有两种方式
1、通过同义词词典做匹配
本质上是关键词匹配;命中关键词即识别实体
系统还提供了词典自动扩充的功能,推测是基于词向量相似,自动将语义表示相似的词也放入词典进行识别。
2、通过上下文标注
将自己定义的实体在语料中进行标注,让系统通过标注学习识别该实体;
这样的标注通常处于语句环境中,上下文具有一定的相似性,就比较容易将这类特征的实体识别出来;
比如 我这里的 @cityto 与 @cityfrom 都是城市实体,系统并不容易区分;通过多次在语句中标注后根据上下文做识别。比如它会总结出 前后位置、从、去这些特征的影响从而确定槽位的识别。
通过意图识别与槽填充,可以将用户的query表示为结构化的语义;比如
北京明天天气怎么样? → 【v.city】【v.date】天气怎么样? 通过这样的表示就可以更精确的识别意图、提取语义信息,并且为后续的DM系统做准备
情感识别
情感识别应用于闲聊机器人的情感化回复,系统可以针对用户的情绪给出响应回答。在客服领域可以根据用户情绪给予积极、中立、乐观等情绪角色的回答
情感识别是典型的分类任务。上述生成任务中对情感的分类高达6种,越丰富细腻的情感机器识别率越低。一般应用时可能只有三种: 积极、消极、中立 ;准确率高点,90%以上。
这是百度大脑的情感识别功能
这类情感识别任务可以应用到社交网络以及评论领域去做用户群体倾向的分析;
情感分类之前有用关键词做匹配去识别,但是问题在于语言表达有时候出现的双重否定句。目前通过深度学习网络去做这类分类会比较准确。能够进一步更细腻的情感分类。
推荐系统的NLU应用
挖坑待填
(笔者正寻求NLP、人机对话方向产品职位 微信:cheng390552021)