天然语言处理的一个基本问题就是为其上下文相关的特性创建数学模型,即统计语言模型(Statistical Language Model),它是天然语言处理的基础。app
假定S表示某个有意义的句子,由一连串特定顺序排列的词ω1,ω2,...,ωn组成,这里n是句子的长度。如今,咱们想知道S在文本中出现的可能性,即S的几率P(S),则P(S)=P(ω1,ω2,...,ωn)。函数
利用条件几率的公式:spa
P(ω1,ω2,...,ωn)=P(ω1)•P(ω2|ω1)•P(ω3|ω1,ω2)•••P(ωn|ω1,ω2,...,ωn-1) (1.1)3d
因为条件几率P(ωn|ω1,ω2,...,ωn-1)难以估算,可利用马尔可夫假设:假设任一个词ωi出现的几率只同它前面的词ωi-1有关,则公式(1.1)可简化为:blog
P(S)=P(ω1,ω2,...,ωn)=P(ω1)•P(ω2|ω1)•P(ω3|ω2)•••P(ωn|ωn-1) (1.2)
事件
公式(1.2)对应的统计语言模型是二元模型(Bigram Model)。假设一个词由前面N-1个词决定,对应的模型称为N元模型。ip
接下来的问题是如何估计条件几率P(ωi|ωi-1),根据它的定义:资源
$ P(\omega_i|\omega_{i-1})=\frac{P(\omega_{i-1},\omega_i)}{P(\omega_{i-1})} $ (1.3)数学
估计联合几率P(ωi-1,ωi) 和边缘几率P(ωi-1) ,可利用语料库(Corpus),只要数一数ωi-1,ωi这对词在统计的文本中先后相邻出现的次数#(ωi-1,ωi),以及ωi-1自己在一样的文本中出现的次数#(ωi-1),而后用两个数分别除以语料库的大小 #,便可获得二元组的相对频度:io
$ 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})\approx\frac{\#(\omega_{i-1},\omega_i)}{\#(\omega_{i-1})} $ (1.6)
假定文本中的每一个词ωi和前面的N-1个词有关,而与更前面的词无关,这样当前词ωi的几率只取决于前面N-1个词P(ωi-N+1,ωi-N+2,...,ωi-1)。所以:
P(ωi|ω1,ω2,...,ωi-1)=P(ωi|ωi-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)来解决这个问题。
第1章中所述的模型训练方法存在必定问题。好比对于二元模型(1.2),就是拿两个数字,(ωi-1,ωi)在语料中同现的次数#(ωi-1,ωi)和(ωi-1)在语料中同现的次数#(ωi-1),计算一下比值便可。但问题是,若是同现的次数#(ωi-1,ωi)=0,是否就意味着条件几率P(ωi|ωi-1)=0?反之,若是#(ωi-1,ωi)和#(ωi-1)都只出现了一次,可否得出P(ωi|ωi-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_i\hspace{2pt}seen}P(w_i|w_{i-1})}{\sum_{w_i\hspace{2pt}unseen} f(w_i)} $ (2.6)
这种平滑的方法,最先由前IBM科学家卡茨(S.M.Katz)提出,故称卡茨退避法(Katz backoff)。相似地,对于三元模型,几率估计公式以下:
(2.7)
用低阶语言模型和高阶语言模型进行线性插值来达到平滑的目的,这种方法称为删除差值(Deleted Interpolation),详见下面的公式。该公式中三个λ均为正数且和为1。线性插值效果比卡茨退避法略差,故如今较少使用。
P(ωi|ωi-2,ωi-1)=λ(ωi-2,ωi-1) • f(ωi|ωi-2,ωi-1)+λ(ωi-1) • f(ωi|ωi-1) +λ(ωi) (2.8)
一、训练语料和模型应用的领域要一致。
二、训练数据一般越多越好。
三、训练语料的噪音高低也会影响模型的效果。
一、吴军 :《数学之美(第二版)》