自然语言理解是人工智能的核心难题之一,也是目前智能语音交互和人机对话的核心难题。维基百科有如下描述[1]:
Natural language understanding (NLU) is a subtopic of natural language processing in artificial intelligence that deals with machine reading comprehension. NLU is considered an AI-hard problem.
对于AI-hard的解释如下:
In the field of artificial intelligence, the most difficult problems are informally known as AI-complete or AI-hard, implying that the difficulty of these computational problems is equivalent to that of solving the central artificial intelligence problem—making computers as intelligent as people, or strong AI.
简言之,什么时候自然语言能被机器很好的理解了,strong AI也就实现了~~
之前写过一篇文章自然语言理解,介绍了当时NLU的系统实现方案,感兴趣的可以再翻一番,里面介绍过的一些内容不再赘述。那篇文章写于2015年底,过去一年多,技术进展非常快,我们的算法也进行了大量升级,核心模块全部升级到深度学习方案。本文主要结合NUI平台中自然语言理解的具体实现,详细的、系统的介绍意图分类和属性抽取两个核心算法。如下图所示,第一个框中是意图分类,第二个框中是属性抽取。
对于整个NUI平台的介绍可以参考孙健/千诀写的从“连接”到“交互”—阿里巴巴智能对话交互实践及思考。
为什么自然语言理解很难?本质原因是语言本身的复杂性。自然语言尤其是智能语音交互中的自然语言,有如下的5个难点:
一方面,自然语言不完全是有规律的,有一定规律,也有很多例外;另一方面,自然语言是可以组合的,字到词,词到短语,短语到从句、句子,句子到篇章,这种组合性使得语言可以表达复杂的意思。以上两方面共同导致了语言的多样性,即同一个意思可以有多种不同的表达方式,比如:
在缺少语境约束的情况下,语言有很大的歧义性,比如:
我要去拉萨
语言在输入的过程中,尤其是通过语音识别转录过来的文本,会存在多字、少字、错字、噪音等等问题,比如:
错字
多字
少字
别称
不连贯
噪音
语言是对世界的符号化描述,语言天然连接着世界知识,比如:
大鸭梨
七天
总参
天气预报
晚安
上下文的概念包括很多内容,比如:
U:买张火车票
A:请问你要去哪里?
U:宁夏
这里的宁夏是指地理上的宁夏自治区
U:来首歌听
A:请问你想听什么歌?
U:宁夏
这里的宁夏是指歌曲宁夏
意图分类是一种文本分类。主要的方法有:
基于规则(rule-based)
传统机器学习方法
深度学习方法
这里重点介绍基于CFG的方法[2],该方法最早出现于CMU Phoenix System中,以下是一个飞机票领域的示例:
按照上面的文法,对于“从北京去杭州的飞机票”,可以展成如下的树:
我们在第一版的系统中,采用的基于SVM的方法,在特征工程上做了很多工作。第二版中切换到深度学习模型后,效果有很大提升,此处略过,直接介绍深度学习方法。
深度学习有两种典型的网络结构:
基于这两种基本的网络结构,又可以衍生出多种变形。我们实验了以下几种典型的网络结构:
单纯的CNN分类效果无法超越复杂特征工程的SVM分类器,尤其是在像音乐、视频等大量依赖世界知识的领域中。比如怎么把如下的世界知识融入到网络中去:
这背后更大的背景是,深度学习在取得巨大成功后,慢慢开始显露出瓶颈,比如如何表示知识、存储知识,如何推理等。其中一个探索方向就是试图把联结主义和符号主义进行融合。纯粹的基于联结主义的神经网络的输入是distributed representation,把基于符号主义的symbolic representation融合到网络中,可以大大提高效果,比如:
基于规则(rule-based)
传统机器学习方法
深度学习方法
这里主要介绍基于JSGF(JSpeech Grammar Format)的方法:
JSGF is a BNF-style, platform-independent, and vendor-independent textual representation of grammars for use in speech recognition.
其基本的符号及其含义如下:
<>,非终结符
|,or
[], 可选项
(),分组
*,零个或多个
{}, 标签
比如对于如下的示例:
public = ;
=
匹配到这条路径后,可以根据标签,把“空调”抽取到device这个属性槽上。
经典算法为CRF,略过。
用于序列标注的深度学习模型主要有[7]:
也有一些多任务联合训练的模型,比如[8]、[9]。
同样的,在input上,将distributed representation和symbolic representation做了融合。
在实际的系统中,基于规则的方法和基于深度学习的方法并存。基于规则的方法主要用来快速解决问题,比如一些需要快速干预的BUG;基于深度学习的方法是系统的核心。
[1] https://en.wikipedia.org/wiki/Natural_language_understanding
[2] Ward & Issar, CMU Phoenix System, 1996
[3] Yoon Kim, Neural Networks for Sentence Classification, EMNLP, 2014
[4] Suman Ravuri and Andreas Stolcke, Recurrent Neural Network and LSTM Models for Lexical Utterance Classification, InterSpecch, 2015
[5] Siwei Lai, Liheng Xu, Kang Liu, Jun Zhao, Recurrent Convolutional Neural Networks for Text Classification, AAAI, 2015
[6] Chunting Zhou, Chonglin Sun, Zhiyuan Liu, Francis C.M. Lau, A C-LSTM Neural Network for Text Classification, arXiv, 2015
[7] Grégoire Mesnil, et. al, Using Recurrent Neural Networks for Slot Filling in Spoken Language Understanding, TASLP, 2015
[8] Xiaodong Zhang, HoufengWang, A Joint Model of Intent Determination and Slot Filling for Spoken Language Understanding, IJCAI, 2016
[9] Bing Liu, Ian Lane, Joint Online Spoken Language Understanding and Language Modeling with Recurrent Neural Networks, arxiv, 2016