统计语言模型(Statistical Language Model)

自然语言处理的一个基本问题就是为其上下文相关的特性建立数学模型,即统计语言模型(Statistical Language Model),它是自然语言处理的基础。

1 用数学的方法描述语言规律

假定S表示某个有意义的句子,由一连串特定顺序排列的词ω1,ω2,...,ωn组成,这里n是句子的长度。现在,我们想知道S在文本中出现的可能性,即S的概率P(S),则P(S)=P1,ω2,...,ωn)。

利用条件概率的公式:

P1,ω2,...,ωn)=P1)•P21)•P312)•••Pn1,ω2,...,ωn-1)                             (1.1)

由于条件概率Pn1,ω2,...,ωn-1)难以估算,可利用马尔可夫假设:假设任一个词ωi出现的概率只同它前面的词ωi-1有关,则公式(1.1)可简化为:

P(S)=P1,ω2,...,ωn)=P1)•P21)•P32)•••Pnn-1)                                                  (1.2)

公式(1.2)对应的统计语言模型是二元模型(Bigram Model)。假设一个词由前面N-1个词决定,对应的模型称为N元模型。

接下来的问题是如何估计条件概率Pii-1),根据它的定义:

$ P(omega_i|omega_{i-1})=frac{P(omega_{i-1},omega_i)}{P(omega_{i-1})} $          (1.3)

估计联合概率Pi-1,ωi) 和边缘概率Pi-1) ,可利用语料库(Corpus),只要数一数ωi-1,ωi这对词在统计的文本中前后相邻出现的次数#(ωi-1,ωi),以及ωi-1本身在同样的文本中出现的次数#(ωi-1),然后用两个数分别除以语料库的大小 #,即可得到二元组的相对频度:

$ f(omega_i,omega_{i-1})=frac{#(omega_{i-1},omega_i)}{#} $                                 (1.4)

$ f(omega_{i-1})=frac{#(omega_{i-1})}{#} $                                                                 (1.5)       

根据大数定理,只要统计量足够,相对频度等于频率,因此:

$ P(omega_i|omega_{i-1})approxfrac{#(omega_{i-1},omega_i)}{#(omega_{i-1})} $   (1.6)             

2 统计语言模型的工程诀窍

2.1 高阶语言模型

假定文本中的每个词ωi和前面的N-1个词有关,而与更前面的词无关,这样当前词ωi的概率只取决于前面N-1个词Pi-N+1,ωi-N+2,...,ωi-1)。因此:

Pi1,ω2,...,ωi-1)=Pii-N+1,ωi-N+2,...,ωi-1)                                                 (2.1)

公式(2.1)的这种假设称为N-1阶马尔可夫假设,对应的语言模型称为N元模型(N-Gram Model)。实际应用最多的是N=3的三元模型。

为什么N取值一般都这么小呢?主要有两个原因。首先,N元模型的大小(空间复杂度)几乎是N的指数函数,即0(|V|N),这里|V|是一种语言词典的词汇量,一般在几万到几十万。而使用N元模型的速度(时间复杂度)也几乎是一个指数函数,即0(|V|N-1)。因此,N不能很大。当N从1到2,再从2到3时,魔性的效果上升显著。而当模型从2到4时,效果的提升就不是很显著了,而资源的耗费却显著增加。

最后还有一个问题,三元或四元甚至更高阶的模型是否能覆盖所有的语言现象呢?答案显然是否定的。这就是马尔可夫假设的局限性,这时要采取其他一些长程的依赖性(Long distance Dependency)来解决这个问题。

2.2 模型的训练、零概率问题和平滑方法

第1章中所述的模型训练方法存在一定问题。比如对于二元模型(1.2),就是拿两个数字,(ωi-1,ωi)在语料中同现的次数#(ωi-1,ωi)和(ωi-1)在语料中同现的次数#(ωi-1),计算一下比值即可。但问题是,如果同现的次数#(ωi-1,ωi)=0,是否就意味着条件概率Pii-1)=0?反之,如果#(ωi-1,ωi)和#(ωi-1)都只出现了一次,能否得出Pii-1)=1的绝对性结论?这就涉及到统计的可靠性问题。

解决该问题,一个直接的办法就是增加数据量,但即便如此,仍会遇到零概率或统计量不足的问题。因此,如果用直接的比值计算概率,大部分条件概率依然是零,这种模型我们称之为“不平滑”。

1953年古德(I.J.Good)在图灵(Alan Turing)的指导下,提出在统计中相信可靠的统计数据,而对不可信的统计数据打折扣的一种概率估计方法,同时将折扣的那一部分概率给予未出现的事件(Unseen Events),古德和图灵还给出了重新估算概率的公式,称为古德-图灵估计(Good-Turing Estimate)。

下面以统计词典中每个词的概率为例,来说明古德-图灵估计公式。

假定在语料库中出现r次的词有Nr个,特别地,未出现的词数量为N0。语料库大小为N。那么,很显然

                                                                                                               (2.2)

出现r次的词在整个语料库中的相对频度(Relative Frequency)则是rNr/N。现在假定当r比较小时,它的统计可能不可靠。因此在计算那些出现r此的词的概率时,要用一个更小一点的次数dr(而不直接使用r),古德-图灵估计按照下面的公式计算dr

dr=(r+1)•Nr+1/Nr                                                                                                             (2.3)

显然:

                                                                                                           (2.4)

一般来说,出现一次的词的数量比出现两次的多,出现两次的比出现三次的多,这种规律称为Zipf定律(Zipf's Law),即Nr+1<Nr  。因此,一般情况下,dr<r,而d0>0。在实际的自然语言处理中,一般对出现次数超过某个阈值的词,频率不下调,只对出现次数低于这个阈值的词,频率才下调,下调得到的频率总和给未出现的词。

基于这种思想,估计二元模型概率的公式如下:

                                  (2.5)

 其中,T是一个阈值,一般在8~10左右,函数fgt()表示经过古德-图灵估计后的相对频度,而

$ Q(w_{i-1})=frac{1-sum_{w_ihspace{2pt}seen}P(w_i|w_{i-1})}{sum_{w_ihspace{2pt}unseen} f(w_i)} $   (2.6)

这种平滑的方法,最早由前IBM科学家卡茨(S.M.Katz)提出,故称卡茨退避法(Katz backoff)。类似地,对于三元模型,概率估计公式如下:

                                 (2.7)

用低阶语言模型和高阶语言模型进行线性插值来达到平滑的目的,这种方法称为删除差值(Deleted Interpolation),详见下面的公式。该公式中三个λ均为正数且和为1。线性插值效果比卡茨退避法略差,故现在较少使用。

Pii-2,ωi-1)=λ(ωi-2,ωi-1) • fii-2,ωi-1)+λ(ωi-1) • fii-1) +λ(ωi)                                                    (2.8)

2.3 语料的选取问题

1、训练语料和模型应用的领域要一致。

2、训练数据通常越多越好。

3、训练语料的噪音高低也会影响模型的效果。

参考

1、吴军 :《数学之美(第二版)》

原文地址:https://www.cnblogs.com/yxdz-hit/p/7899594.html