赞
踩
目录
自然语言处理的目的就是让计算机能处理语言,说简单点,就是让计算机听懂人话。计算机想处理语言,必须先分析语句和获得语义,这就需要分析词的词性、句子的句法规则等。最著名的成果就是乔姆斯基用有限状态自动机来刻画语言的语法,建立了自然语言的有限状态模型。
理想的NLP处理流程最底层是词法分析,包括分词、词性标注、专名识别等。
然后是句法分析,得到一个句法树,相当于获得了更多的词或短语之间的关系;之后是语义分析,会得到整个句子的逻辑关系;最后就是应用,比如知识抽取、问答系统等各种任务。
NLP大致技术细分为下图所示。
最底层是资源,自然语言处理模块少不了资源。
然后词汇级别的技术,词法层面分析是对词的处理,分词、词性标注、识别专有名词等。词与词之间会有一定的关系,这就是Ontology,它包括很多关系:上下位、同位等等,这些关系可以用于推理、泛化等。
之后是句子级别的技术,即语义层面分析。主要归纳为中心词提取、topic分析、意图识别和语义分析。变换层面分析更多的用在搜索上,主要是纠正句子。结构层面分析用的最多的是句法分析和组块分析。
最后就是各种应用任务了,其中搜索引擎、自动问答、人机对话是非常复杂的,几乎用到了所有NLP技术。文档分类和情感分析是不同程度的分类问题,机器翻译和摘要提取现在也在逐步尝试深度学习的方法。
专名识别就是识别句子中的专有名词,比如人名、地名、机构名、时间词、数字词、影视名等等。专名识别是一个序列标注问题,就是找词的边界。对于人名、地名、机构名这些结构边界比较清楚的情况,使用序列标注模型效果是非常好的,其他的类别比如音乐名、小说名等是十分不好识别的,因为它们没有什么规律可言,也就是说边界比较泛,所以就会比较困难。专名识别、分词和词性标注都是序列标注任务。
句法分析是NLP的关键技术之一,它的任务就是根据文法规则得到一个句子的句法结构。句法结构
一般是表示成树状形式。确定句子总各成分之间的关系是一项非常困难的事情,导致其准确率并不高,所以为了降低复杂度,大多是进行浅层句法分析,识别句子中相对简单的独立成分。
利用依存语法是进行句法分析的方法之一,也是目前研究最多的一种方法,依存语法是用词与词之间的依存关系描述语言的句法结构,也就是词与词之间是支配和被支配的关系,而且这种关系是有方向的,它主张句子中核心动词是支配其他成分的中心成分,而它本身却不受其他任何成分的支配,所有受支配成分都以某种依存关系从属于支配者。
依存句法分析有两大类方法。一种是基于图的方法,它把问题看成有向图中最大生成树的求解问题,它的优点是训练时使用的全局方法,可以搜索所有子树,缺点是不能利用太多历史信息(特征是局部性的)。一种是基于决策的方法,它将依存树的构建分解为一序列动作,由分类器根据当前状态来决定下一个分析动作,它的优点是速度快,可以较多地利用历史信息(特征是全局的),缺点在于使用的是局部贪心算法。基于决策的方法主要有arc-standard和arc-eager算法。
句法分析在标准测试集上已经有很不错的准确率了,尤其是英文上,但是中文准确率就要低一些,那是因为中文句法结构更复杂。在我们的实际项目中,使用句法分析的时候效果并不是很理想,因为真实场景和标准集数据分布有差异,而且要在真实场景下标注句法分析的训练语料是由门槛的,不像普通分类任务那样,而是需要一定的语言知识才可以,这也导致了句法分析的应用不是太广。
语义分析可以认为是一个终极目标,自然也是一个很难的问题。它和句法分析是不同的,句法分析是得到一个句子的句法树,而目前语义分析是将句子解析成一个逻辑表达式。语义分析的初衷是如果把句子表示成了逻辑表达式,那么计算机就可以解析了。但是尽管这样,表示成的逻辑表达式对计算机也挺困难的,因为不同的任务有不同的表达式,所以也只能在特定的场景中使用。语义解析的方法一般也是基于模板的方法和基于机器学习模型的方法。
知识库的建设是很重要的,也是很难的。因为人类的知识一直在增加,而且很难抽象成计算机能理解和表示的形式。知识一般分两种,一种是无结构化知识,无结构化知识很难表示也很难处理。另一种是结构化知识,是以实体为核心,表示成SPO三元组形式的。结构化的知识被冠了一个名字:知识图谱。结构化知识是较好表示的,也是目前能处理的,但是来源也很有限。需要从海量的网页(无结构化)中抽取出更多结构化知识,就需要很多的技术:基础的NLP、指代消解(也叫共指消解)、实体消解(也叫实体消歧)、实体/属性抽取、关系抽取等,大致用到的思想主要是两种:基于模板的挖掘方法和基于统计模型的方法。
基于模板的方法很好理解,也容易处理,就是事先准备一些高质量关系对组成一个种子关系集合,根据这些关系再挖掘出一些高质量关系模板,然后用这些模板在海量语料中匹配找出更多的关系对,有了关系对就可以再扩充关系模板,一直持续迭代,就可以得到最后的关系知识库。
基于模型的方法现在不少人尝试使用深度学习在抽取知识,如直接用一个端到端模型抽取出三元组。
如果S和P能事先挖掘出来,那么其实就是根据S和P来找出相应的O,这样就可以抽象成一个分类或者排序问题了,也就是说根据S和P找出一些候选文档片段,然后在这些片段中找出最可能的O。
指代消解以及实体消解都可以看成一种分类任务,也就是说基于上下文或者知识的分类任务。
要想做好对话系统,如下几个技术点少不了。
(1)语义理解。包括实体识别、句法分析和意图识别等。
(2)对话管理。包括对话状态追踪、上下文建模、指代消解和省略补全等。
(3)知识表示。包括语义分析和知识建设。
(4)用户管理。包括用户画像、长时记忆和短时记忆等。
从完成的任务来说,对话系统主要有这3个方面:问答型、任务型和闲聊型。
1.问答型
问答型更多的就是之前提到的问答系统,可以视为单轮的对话系统,它解决的更多的是知识型的问题。目前研究最多的是答案是一个实体的客观性知识的任务,对于答案是一句话或者一段话,或者是主观性的,甚至是个性化的问题,那就更是困难了。问答系统的另一个应用就是客服系统,即使用机器来辅助人回答高频经常被问到的问题,提高客服人员的效率。问答系统目前主要有如下几类方法。
(1)基于语义分析的方法
该方法的思路就是来一个Query之后首先语义分析出逻辑表达式,然后根据这个逻辑表达式知识库中推理查询答案。知识图谱的存储方案有两种:一种是基于图的RDF方案;一种是基于索引的方案。
(2)基于信息抽取的方法
这种方法的思想是来一个问题之后,首先是问题的各种分析,包括抽取关键词、关系词、焦点词以及问题的各种分类信息,然后从海量文档中检索出可能包含答案的文档段落,再在证据库中找到相关的证据支撑,最后根据许多模型对结果排序找到最终的答案。
(3)端对端的方法
这种方法是基于深度学习的模型,它首先将问题表征成一个向量,然后将答案也表征成向量,最后计算这两个向量的关联度,值越高那么就越可能是答案。它的核心就是在表征答案的时候如何把候选知识(无结构化段落或结构化子图)表征进来。
2.任务型
任务型对话系统更多的是完成一些任务,这类任务有个较明显的特点,就是需要用户提供一些明显的信息,然后有可能还要和用户确认等,最后帮用户完成一件事情。
系统会根据当前状态和相应的动作来决定下一步的状态和反馈,即求状态转移概率,这其实就是马尔科夫决策过程的思想(MDP)。
(1)生成式模型
生成式模型把对话状态抽象成有关系统柜action和用户SLU结果的贝叶斯网络,所以它的求解可以使用贝叶斯定理。
(2)判别式模型
判别式模型是把问题抽象成一个分类问题,根据之前对话的一些特征来预测新的state的概率
这其实就是个分类问题,当然也可以把slot打分看成序列标注问题,这也就可以使用CRF等序列标注模型来处理了。只要是分类模型或者序列标注问题,那么也就可以使用深度学习了。而且只要是有明确action的地方,也就可以融入强化学习的激励惩罚机制。
(3)规则系统
对话管理主要有两个关键因素:state和action。NLU模块会分析出句子意图和相关slot,意图和slot都是有置信度的,那么state其实就是意图和slot,action就是根据state的一些回复。对于某一个具体任务来说,需要询问的slot其实是可以预先知道的,那么缺哪些slot就询问哪些slot就可以了,不确定的slot和意图就和用户进行确认。
规则系统就是有一个配置文件,写一些规则,然后线上把意图和slot的相关字段传过来进行解析处理就可以了。
3.闲聊型
闲聊型的对话系统更多地是人和机器没有明确限定的聊天。闲聊型对话系统主要有3中方法:规则方法、生成模型和检索方法。
(1)规则方法
20世纪60年代的聊天机器人ELIZA就是使用纯规则方法,这种方法就是写一个较泛化的模板,然后回复一个或多个相应的模板。
规则系统关键是如何写一堆规则和线上的快速匹配。
(2)生成模型
生成模型是随着深度学习的热潮而提出的比较火热的方向。它首先使用一个RNN模型把输入句子“ABC”表示成一个向量,然后把这个向量作为另一个RNN模型的输入,最后使用语言模型生成目标句子“WXYZ”。这种方法的优点是省去了中间的模块,缺点是生成的大多是泛泛的无意义的回复、前后回复不一致,或者有句子不通顺的问题。
(3)检索方法
检索方法的思想是,如果机器要给人回复一句话,假设这句话或相似的话有人说过,只需把它找出来就可以了。这种方法就需要事先挖掘很多的预料。它最基本的流程就是首先进行NLU,然后从语料库中召回一些可能的回复,最后使用更精细和丰富的模型找出最合适的回复给用户。
如果把问答型、任务型和廖天星都融合到一个对话系统中,就如下图所示。
对话系统评价。对于问答型,现在能回答的更多的是实体,所以也很容易评价;对于任务型,从整体就是看该对话是否完成了用户的任务,所以也是可评价的;对于闲聊型,由于闲聊回复太多样,所以这个任务是很难自动评价的,它等同于图灵停机问题,被证明是不存在的,闲聊型任务更多的需要人工评价以及反馈。
思想的体现是行为,不管是动物阶段还是古猿阶段,那个时候的思想很简单,行为基本体现就是吃喝拉撒、打架、生殖后代。而现阶段的人的思想却是非常复杂的,他可以使用并建造工具,建立组织,研究万物包括人类自己,探索宇宙等等,而语言也是随着思想逐步“进化”来的,因为语言就是思想传递的媒介,也是人类特有的。
既然语言是人类思想的传递媒介,那么就可以使用任何符号来表示语言。
拿汉语来说,常用词不到1万个,这些词可以按照语法规则组成句子,而且句子长度不固定,这将会产生几乎无穷多个句子,如何量化(表示)这么多语义呢?所谓的大数据在这种组合爆炸面前就不成大数据了,这也是为什么现在深度学习表征语义没有语音图像出色的原因之一。
语言的贫乏也是有目共睹的,你肯定有一些情景很难用语言来描述的经历,如未知事物、一些主观感觉、气味、痛苦等描述性的东西,但是这些东西可以靠隐喻来弥补一部分,如用一些感受过的来形容没有感受过的。隐喻丰富了语言(理解时需要人的深层推理和抽象能力),但是这些隐喻对计算机又造成了另外一些困难。如何理解隐喻?
语言的贫乏自然造成了语义的歧义,同样的词要表示不同的意思,更难的是,语言中本身就包含很多粗糙歧义的字眼,然而人类的视觉系统中就存在一个“什么”系统和一个“哪里”系统,所以当面沟通,多数可能的歧义就会明朗起来。而且人们在生活中并不需要那么精确,但是对于计算机就要面临一个新的问题,如何解决歧义?
语言本身具有不完备性,计算机单纯理解人类的语言已经面临很大的困难了,虽然NLP好多任务准确率很高了,但是与人类应对语言的程度相比,还太初级,更不用说人类的其他能力,所以现在好多系统本质上还停留在“关键词”层面,因为没有更好的表示方法,尽管深度学习给了一种表示思路(浮点向量化),但是还很初级。
对于对话系统来说,除了刚才所说的单纯处理语言的难点外,还有很多难点。
(1)物理场景很难融合。沟通是有场景的,时间、地点、环境等等,目前的上下文处理和推理相对人类智能都很初级。人类可以很好地理解环境北京并且可以在交流的过程当中学习到知识并灵活应用,对于计算机却很难。
(2)知识很难融合。目前的知识建设、知识表示和知识推理都还比较初级,能解决的问题非常有限,人类有强大的表征知识的能力来应对,而对于计算机这种明确定义的体系却很困难。所以说,围绕语言的智能系统路还很漫长,也需要大家共同努力和进步。
对于人工智能来说,作者感觉现在的理念就是“计算即智能”,依靠许多数据,进而依靠机器的高性能来训练模型,目前基于图灵机的计算机是一套明确的确定的人为设定的编码规则,所以只要是明确需要计算量的单一任务计算机解决是迟早的事,因此许多单一任务组合成让人类更方便的产品(可称为“浅层智能”)在可预见的未来是可以做好的,但是任何进步都是从量变到质变的过程,所以要想达到这种浅层智能,也必须要经过基础产业升级(基础科学、基础通讯、基础硬件)、物联网和自动化等过程。然而人类的智能却非常高级,它是依靠小样本,根据人类大脑的推理和泛化能力(高维的相似度)来学习的,所以对于自学习、推理、记忆、思考、欲望、意识等不确定的、无法感知和测量的东西,计算机仍然毫无头绪。打造像人类这样的“高度智能”还是相当困难的。
人工智能还有很长的路要走,而且人工智能更是物理学、生物学、脑科学、机械学和计算机科学等多个学科共同发展、互相促进的结果。
技术必然一直在进步,它会让人类的生活越来越方便、高效和美好(当然理念创新、产品创新和商业模式创新都是社会进步的因素)。尽管我们向往的目标很美好,但是中间一定会经过一系列量变的阶段。要想达到前面说的“浅层智能”,少不了相应基础产业持续升级、互联网化和自动化这几个进程。社会是一点一点进步的,天下没有免费的午餐,没有人能一口吃成大胖子,就像现在的汽车工业也经过了马车、蒸汽汽车和内燃汽车等几个阶段发展起来的,所以我们不能好高骛远,应该脚踏实地,在现有技术和数据形态下结合产品设计解决好用户某些方面的需求,创造出真正的社会价值,让人们的生活逐步高效便捷。
作为技术工程师,无论做什么事情,什么方向,在工作中肯定遇到过不少问题,那么就应该带着问题去寻找和思考新的技术、新的解决方案,切不能盲目跟从。
总之,多学习,多思考!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。