自然语言处理算法汇总
Posted 超级人工智能
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自然语言处理算法汇总相关的知识,希望对你有一定的参考价值。
一、NLP基础
所谓“自然语言”,寓意自然进化而来的语言。为了区分一些人造语言:像C++、Java等。在人类社会中,语言扮演着重要的角色,是我们区别于其他动物的根本标志,没有语言,思维就失去了载体,沟通交流更是无源之水。在一般情况下,用户不熟悉机器语言,所以自然语言处理技术可以帮助这样的用户和机器交流。从建模的角度看,为了方便计算机处理,自然语言可以被定义为一组规则或符号集合,我们组合集合中的符号来传递各种信息。NLP技术可以被用于很多领域:机器翻译(比如百度在线翻译http://fanyi.baidu.com/?aldtype=16047#auto/zh)、情感分析、智能问答(比如图灵机器人http://www.tuling123.com/experience/exp_virtual_robot.jhtml?nav=exp)、文摘生成、文本分类、舆论分析、知识图谱等。
1、发展历程
早期的自然语言处理具有鲜明的经验主义色彩,主流仍然是基于规则的理性主义方法。这种情况一直持续到20世纪80年代才发生变化,90年代后,基于统计的自然语言处理开始大放异彩,大规模语料库的运用,对基于规则的方法起到了很大补充。进入21世纪,2006年,以Hinton为首的几位科学家经历了几十年的努力,终于成功设计出第一个多层神经网络算法——深度学习。一种将原始数据通过一些简单但是非线性的模型转变成更高层次、更加抽象表达的特征学习方法,一定程度上解决了人类处理“抽象概念”这个亘古难题。目前,深度学习在机器翻译、问答系统等多个自然语言处理任务中均取得了不错的成绩,未来,深度学习无疑会发挥越来越重要的作用。
2、相关体系
句法语义分析:针对目标句子,进行各种句法分析,如分词、词性标记、命名实体识别及链接、句法分析、语义角色识别和多义词消歧等。
关键字提取:抽取目标文本中的主要信息,比如从一条新闻中抽取关键信息。主要是了解是谁、何时、何地、对谁、做了何事、产生了什么结果。涉及实体识别、时间抽取、因果关系抽取等技术。
文本挖掘:主要包含了对文本的聚类、分类、信息抽取、摘要、情感分析以及对挖掘的信息和知识的可视化、交互式的呈现界面。
机器翻译:将输入的源语言文本通过自动翻译转化为另一种语言的文本。机器翻译从最早的基于规则到二十年前的基于统计的方法,再到今天的基于深度学习(编解码)的方法,逐渐形成了一套比较严谨的方法体系。
信息检索:对大规模文档进行索引。可简单对文档中的词汇,赋予不同的权重来建立索引,也可以使用算法来建立更深层的索引。查询时,首先对输入进行分析,然后在索引里面查找匹配的候选文档,再根据一个排序机制把候选文档排序,最后输出排序得分最高的文档。
问答系统:针对某个自然语言表达的问题,由问答系统给出一个精准的答案。需要对自然语言查询语句进行语义分析,包括实体链接、关系识别,形成逻辑表达式,然后到知识库中查找可能的候选答案并通过排序机制输出最佳答案。
对话系统:系统通过多回合对话,跟用户进行聊天、回答、完成某项任务,主要涉及用户意图识别、通用聊天引擎、问答引擎、对话管理系统等技术。此外,为了提现上下文相关,要具备多轮对话能力。同时,为了提现个性化,对话系统还需要基于用户画像做个性化回复。
语料库:巧妇难为无米之炊,语料库就是NLP的米,一些常用的语料库有以下几种。中文维基百科:https://dumps.wikimedia.org/zhwiki/维基百科是最常用且权威的开放网络数据集之一,作为极少数的人工编辑、内容丰富、格式规范的文本语料,各类语言的维基百科在NLP等诸多领域应用广泛。维基百科提供了开放的词条文本整合下载,可以找到你需要的指定时间、指定语言、指定类型、指定内容的百科数据。搜狗新闻语料库:http://download.labs.sogou.com/resource/ca.php来自新闻网站国内、国际、体育、社会、娱乐等18个频道的新闻数据。IMDB情感分析语料库:https://www.kaggle.com/tmdb/tmdb-movie-metadata互联网电影资料库(Internet Movie Database )是一个关于电影演员、电影、电视节目、电视明星和电影制作的在线数据库。还有豆瓣读书相关语料、邮件相关语料等。
3,探讨NLP的几个层面
第一层面,词法分析。包括汉语分词和词性标注。
第二层面,句法分析。对句子结构进行分析,一方面为了帮助句子的含义,另一方面也为更高级的自然语言处理任务提供支持(比如机器翻译、情感分析等),目前主要存在三种比较流行的分析方法:短语结构句法体系、依存结构句法体系和深层文法句法分析。
第三层面,语义分析。语义分析的目的是理解句子表达的真实语义,但是语义应该采用什么表示形式一直困扰着研究者,至今这个问题也没有统一的答案。语义角色标注是目前比较成熟的浅层语义分析技术。出于机器学习模型复杂度、效率的考虑,自然语言处理系统通常采用级联的方式,分词、词性标注、句法分析、语义分析分别训练模型。实际使用时,给定输入句子,逐一使用各个模块进行分析,最终得到所有结果。
NLP是人工智能计算机领域中的一个重要分支。人工智能概念在1955年达特茅斯特会议上提出,而后经历了三次浪潮,但在20实际七十年代第一次AI浪潮泡沫破灭之后,这一概念迅速沉寂,相关研究者都不愿提起自己是研究人工智能的,转而研究机器学习、数据挖掘、自然语言处理等各个方向。2008年左右,由于数据的爆炸式增长、计算机算力大幅提升、深度学习实现端到端的训练,深度学习引领人工智能进入第三次浪潮。人们也将如日中天的深度学习方法引入到NLP领域,并在机器翻译、问答系统、文本摘要等方向取得了很好的成绩。
4,深度学习为何能取得很好的效果?
海量数据:经过之前互联网的发展,很多应用积累了足够多的数据可以用于学习。当数据量很大时,传统的SVM模型、CRF模型,由于模型过浅,无法对海量数据中高唯纬非线性映射做建模,也就无法带来性能提升。而以CNN、RNN为代表的深度模型性能,可以随着模型复杂度增大而增强,更好贴近数据的映射关系,达到更优的效果。
算法革新:特别是深度学习word2vec的出现,使得我们可以将词语超表示为低纬向量,相对于独热编码方式,既缓解了语义鸿沟问题,又降低了输入维度。另一方面,深度学习模型非常灵活,使得之前很多任务,可以使用端到端的方式直接训练。深度学习在NLP中取得了巨大的成绩,当然随之而来的也是诸多挑战。语音和图像属于自然信号,而自然语言是人类知识的抽象浓缩表示,所以意味着深度学习并不能解决NLP中的所有问题。人在表达的过程中,由于背景知识的存在会省略非常多的东西,使得自然语言的表达更加简洁,文本所携带的信息也有一定的局限性,在NLP处理过程中也会碰到非常多的困难。
二、汉语分词
在语言理解中,词是最小的能够独立活动的有意义的语言成分。将词确定下来是理解自然语言的第一步,只有跨过了这一步,中文才能像英文那样过渡到短语划分、概念抽取以及主题分析,再到语言理解和智能计算的地步。
1、基于规则
正向最大匹配:假定分词词典中的最长的词是有i个汉字字符,则从被处理文档的当前字串选择前i个字作为匹配字段,查找字典,如果有这样一个词,则匹配成功,匹配字段被作为一个词切分出来。如果字典中没有这样一个词,则匹配失败,将匹配字段中的最后一个字去掉,对剩下的字串进行同样的匹配处理。这样进行下去直到匹配成功。然后取下一个i字段进行匹配处理。
逆向最大匹配:其原理与正向最大匹配类似,只是从被处理文档的末端开始匹配扫描,每次从最末端取i个字符,若匹配失败,则去掉匹配字段最前面的一个字继续。由于汉语中偏正结构(定语+中心词,状语+中心词)比较多,因此从后向前的逆向匹配方法,精度要高于正向匹配。
双向最大匹配:将正向最大匹配法和逆向最大匹配法得到的结果进行比较,然后按照最大匹配的原则,选取词数切分比较少的一个作为结果。
2、基于统计
随着大规模语料库的建立和统计机器学习方法的发展,基于统计的中文分词算法逐渐成为主流。其主要思想是把每个字作为基本单元,按照统计规律,如果相邻两个字在不同文本中出现的次数越多,那么这些字成词的概率就更高。
语言模型:语言模型用数学语言表述就是,为长度为m的字符串确定其概率分布P(w1,w2,...,wm),其中w1到wm依次表示文中的词语。一般采用链式法则计算其概率值,
P(w1,w2,...,wm)=P(w1)P(w2|w1)P (w3|w2,w1)...P(wi|wi-1,wi-2,...,w2,w1)...P(wm|wm-1,wm-2,...,w2,w1),这个式子当文本过长时,计算难度很大,一般取n元模型,即当前词的n个上下文来计算,因此有
P(wi|wi-1,wi-2,...,w2,w1)≈P(wi|wi-1,wi-2,...,wi-(n-))
当n=1时称作一元模型,此时,整个句子概率等于各个词的概率乘积,言下之意是句子中的各个词相互独立,这显然会丢失词序信息,一般取n>=2。
HMM模型:隐马尔科夫模型是将分词作为字在字符串中的序列标注任务来实现的,其基本思路是,每个字在构造一个特定的词语时都占据着一个特定的构词位置,称为词位,规定每个字最多只有四个构词位置,词首B、词中M、词尾E、单独成词S,这时分词结果就可以直接表示成逐字标注的形式。对这个模型做独立性假设和齐次性假设,可以得到一个典型的马尔可夫模型。如下,
用λ=λ1λ2,...,λn代表输入的句子,n为句子长度,λi表示字,o=o1o2,...,on代表输出的标签,那么理想的输出为:
max=maxP(o1o2,...,on|λ1λ2,...,λn)
在分词任务上,o为BMSE这四种标注,λ为句子中的汉字(包括标点等非中文字符)。引入独立性假设,即每个字的输出仅仅与当前字有关,于是得到:
P(o1o2,...,on|λ1λ2,...,λn)=P(o1|λ1)P(o2|λ2),...,P(on|λn)
此时又有一个问题,正常来说,B后面只能是M或者E,然而基于独立性假设,我们很可能得到BBB、BEM等输出,显然不合理。
通过贝叶斯公式得到:P(o|λ)=P(o,λ)/P(λ)=P(λ|o)P(o)/P(λ),其中P(λ)是常数,因此最大化P(o|λ)等价于最大化P(λ|o)P(o)。
针对P(λ|o)P(o)作马尔可夫假设,得到:
P(λ|o)=P(λ1|o1)P(λ2|o2),...,P(λn|on)
同时,P(o)=P(o1)P(o2|o1)P(o3|o2,o1)...P(on|on-1,on-2,...,o1)
作齐次性假设(即每个输出仅仅与上一个输出有关),得到:
P(o)=P(o1)P(o2|o1)P(o3|o2)...P(on|on-1)
于是,
P(λ|o)P(o)≈P(λ1|o1)P(o2|o1)P(λ2|o2)P(o3|o2)...P(λn|on)P(on|on-1)
在HMM中,P(λk|ok)为发射概率,P(ok|ok-1)为转移概率。设置
P(ok|ok-1)=0可以排除类似BBB、EM等不合理的标注组合。
在HMM中,求解maxP(λ|o)P(o)常用Veterbi算法。
其他统计分词算法:除了HMM模型,分词算法还有很多,比如CRF,深度学习中的CNN、LSTM等,相比于机械分词法,这些统计分词方法不需要维护词典,能较好地处理歧义和未登录词,是目前分词的主流方法,但分词效果很依赖语料的质量,且计算量大得多。
3、混合分词
汉语分词库——Jieba:目前开源的分词工具很多,以Jieba分词为例,采用基于规则和统计的结合方法。其提供了三种分词模式,精确模式、全模式、搜索引擎模式。感兴趣可以实际使用试试。对于一般的分词任务,可以很好满足。
三、词性标注、命名实体识别(NER)
Jieba分词工具中的词性标注,采用词典和HMM的结合方法,具有不错的效果,这里不做详细介绍。
与自动分词、词性标注一样,命名实体识别也是自然语言处理中的一项基础任务,是信息抽取、信息检索、机器翻译、问答系统等多种语言处理技术中必不可少的一环。命名实体识别(named entities recognition,NER)研究的命名实体一般分为3大类(实体类、时间类、数字类)和7小类(人名、地名、组织机构名、时间、日期、货币、百分比)。
条件随机场的主要思想主要来自与HMM,不同的是,条件随机场是在给定观察的标记序列下,计算整个标记序列的联合概率,而HMM是在给定当前状态下,定义下一个状态的分布。
在CRF中,需要给定特征函数,先给出完整的线性链CRF参数化形式:
其中,Z(x)为规范化因子:
特征函数分为两类,第一类是定义在
Y
第二类是定义在
Y
CRF++是一款基于C++高效实现CRF的工具,CRF++也提供了python使用接口,感兴趣可以实际试试。
限于篇幅,下一篇继续介绍:关键字提取、句法分析、向量化、情感分析以及机器学习深度学习在NLP中的具体运用。
参考文献:
[1]涂铭.刘祥.刘树春《python自然语言处理实战核心技术与算法》机械工业出版社
[2]郑捷.《NLP汉语自然语言处理原理与实践》电子工业出版社
以上是关于自然语言处理算法汇总的主要内容,如果未能解决你的问题,请参考以下文章