我们自然语言处理和语言学方面的不同就在于,我们来源于大量的语料库统计资料。之前所看到的的语言学方面的篇章分析,大多都是基于几十篇的文章得出的结果,并不是太有说服力,仅仅是高频统计。所以,我们这一章先来介绍一下语料库,然后介绍相关的语言模型。
语料库就是存放语言材料的数据库。做机器学习,最重要的是语料,有了大量的训练样本,才能够学习到更加真实的模型。
语料库语言学与自然语言处理也是同兴衰的。
在20世纪50年代中期以前,语料库语言学还停留在非计算机阶段。包括项研究儿童学习语言方式、音系研究、方言学与语料库技术的结合等。
在20世纪50年代中期到20世纪80年代初期,这个方面,由于乔姆斯基的《句法理论》等一系列主做的发表,从根本上改变了语料库语言学的发展状况。它指出了当时语言学的研究的2点错误:
首先,是语料研究方向有错。他认为,语言研究的主要目标是建立一种能够反映说话人心理现实的语言认知模式,即语言能力模式而语言的运用知识语言能力的外在证据,不能准确暗影语言能力,而语料更是外在化的话语汇集,因此基于语料的经验模式只能对语言能力做出部分解释,所以不能是语言学家从事研究的得力工具。
其次,是语料的不充分性。也就说,他认为语料库根本没有办法表示出整个语言的所有情况和特性。
这两点,在接下来的20年里都被认为是正确的,因此大部分人就不再研究语料库了,只有少数语言学家进行了研究,最终取得了不错的成果,也为语料库的复兴奠定了基础。
在20世纪80年代到如今。我们也都知道,随着基于统计的机器学习的兴起,大量的语料库资源得以充分运用,因此,第二代语料库才开始逐渐复兴起来。
语料库的划分依据有很多,主要分为下面7种分类:
常用的语料库大多可以在LDC(语言数据联盟)那看到,但是它大部分是收费或者授权的,因此语料库的获取还是比较困难的。
就本人接触的语料库来讲,主要是CTB和RST-TB两种语料库,当然还有很多其他语料库,正规非正规的,包括搜狗语料库等,在数据堂里也能找到很多免费的或者收费的应用级语料库。
但其实,当前更多的应用都是基于语料库之上的知识库。语料库各条目之间不一定有相互联系,基本上是属于独立同分布的。但是知识库里的内容是相互联系的,目前常用的有WordNet、FrameNet、EDR、同义词林、HowNet、CLKB、Wikipedia、Dbpedia、Freebase、knowledge-graph等,等到用到的时候可以再详细去了解。
这一章我们介绍语言模型。不过要说的是,这里的语言模型基本上是基于字词的,但是其思想也是要掌握的,如果以后到句子、段落、篇章的时候,这些思想都是十分有用的。
语言模型(LM)在自然语言处理中占有重要地位,而且像n元语法模型是一个简单但是比较有效的模型。只能说比较有效,但是想要提高到非常高的地步,还需要继续改进才行。
我们正常人的思维,肯定是这样想的,一句话的每个单词,都会与之前所有出现的词相关,甚至是与后面出现的词也相关(双向RNN)。
而一个语言模型通常构建为字符串s的概率分布p(s),这里p(s)试图反应的是字符串s作为一个句子出现的频率。对于一个由l个基元(基元就是基本单元,这里一般指字、词、短语,没有再大的了)构成的句子s=w1w2⋅⋅⋅wl其概率计算公式可以表示为:
上面就是n元语法,它只考虑前n-1个词与当前词的关系,而且n的取值一般是1,2,3,…,7等这种比较小的数。之所以这样做,当然是为了简化计算,因为如果我们考虑的前n个词过多的话,那么我们的自由参数都是几何式增长,计算机一是训练不来,二是根本没有这么多语料可供我们使用。
一元文法就是n=1,也就是只考虑当前词,这样的话,就相当于是统计词频了。没有什么太大的价值。
二元文法则是n=2,这就有价值了,我们称为是一阶马尔科夫链。因为有一个概率是我们能够看到的,但是会影响最终结果的:
如果是这样子,那么它就是这样一个样子,需要在头和尾分别添加一个开头标记和结尾标记w0和wl的内容。
三元文法则是n=3,这是平时用得比较多的,我们称为二阶马尔科夫链。同样的,它的样子我们也可以写出来:
但有时候,如果数据太过稀疏的话,我们可能要考虑数据平滑了。
或者说可以使用下面式子来近似:
评价一个语言模型的性能通常就是使用交叉熵或者困惑度来进行,
一个n元文法,总结来讲,可以使用如下公式来统一:
那么对于句子(t1,t2,⋅⋅⋅,tlT)构成的测试集T,可以通过T中所有句子的概率乘积来计算测试集的概率P(T)。
那么交叉熵H_p(T)的定义为Hp(T)的定义为
这里的WT是以词为单位度量的文本T的长度。这一个式子可以作如下解释:
利用与模型有关的压缩算法对数据集合中的W_T个词进行编码,每一个编码所需要的平均比特位数。
而困惑度只能是这样的:
交叉熵和困惑度都是越小越好,一般的困惑度为50~1000之间。
上面我们说过了N元文法最大的缺陷就是容易引起数据稀疏,也就是说,有可能一些情况的概率是0,那么解决办法就是数据平滑。我们这里简要介绍一下几种数据平滑方法。
加法平滑是非常常用而又特别简单的平滑方法,其重要含义,就是给所有的可能都增加一个基础概率,这个基础概率就是让每种可能均分那么一点概率。数学表达式如下:
上面的加法平滑,实际上是改变了已出现的概率情况,它把每个概率都减少了不同的值,但并没有按比例减少。下面这种古德——图灵估计法则是按比例减少已出现的概率,然后再均分给那些没有出现的概率的情况。
这种方法是当某一事件在样本中出现的概率大于k时,运用最大似然估计经过减值来估计其概率。当某一事件的频率小于k时,使用低阶的语法模型作为代替高阶语法模型的后备,然后再使用归一化来进行处理。
这种方法,我们在上面也提过了,例如对于三元语法:
这样处理就是Jelinek-Mercer平滑方法。
绝对减值法,就是对于已有概率的事件,减去相同的量,然后再把这匀出来的概率均分给未见的情况。
这种平滑方法是对于已有概率的事件,按比例减去不同的量,然后再把这匀出来的概率均分给未见的情况。
N元模型的缺点我们都十分明确,也就是它只考虑了与前n-1个词有关,但这显然和实际情况不符。
为此,需要进行语言模型自适应,这里提供3种模型。
基于缓存的语言模型的原理就是,之前出现过的词,再出现的概率会更大,这个编程过程中的“局部性原理”差不多。因此我们需要建立一个缓存区,记录下之前出现过的词语。因此模型就变成了这样:
λ可以通过EM算法求得。
但同样的,未考虑缓存区内的顺序,因此有改进:
其中α为衰减率,β为归一化常数
当然,还有其他改进模型,我就不一一举例。
基于混合的语言模型是为了解决可能训练语料不是同源的,但是为了保证测试效果比较好而做出的这种办法。
它的想法是,对于每一个来源相同的子语料Si,训练出不同的子模型Mi,然后通过求和得出最终模型:
基于最大熵的语言模型则是通过一组不同约束的模型,从中选择熵最大的模型。
例如可以是距离为1的标准二元模型,或者是距离为2的二元模型。然后再通过线性插值,使用后备方法进行数据平滑。
事实上,在网上关于这方面的描述还是很少的。大多集中于科研论文中。因此难度还是挺大的。可能只有专攻计算语言学的,才会细致的研究这方面内容吧。
如何让机器人理解我们人类的语言(3)
如何让机器人理解我们人类的语言(2)
如何让机器人理解我们人类的语言(1)
本文技术博客同步更新,欢迎关注:刘炫320的博客_CSDN博客-算法编程习题解答(java版),机器学习习题集,leetcode领域博主
页面更新:2024-05-23
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号