1. 统计语言模型
首先一个句子的概率 P(S):
但是存在两个问题:
- 参数空间过大
- 数据稀疏严重,词同时出现的情况可能没有,组合阶数高时尤其明显。
2. n-gram模型
为了解决第一个问题引入马尔科夫假设(Markov Assumption):一个词的出现仅与它之前的若干个词有关:
然后利用极大似然估计(Maximum Likelihood Estimation,MLE)计算每一项的频数,例如:
3. 数据平滑处理
n-gram最大的问题就是稀疏问题(Sparsity):很多词语组合在语料库中都没有出现,根据极大似然估计得到的组合概率将会是0,从而整个句子的概率就会为0
。最后的结果是,我们的模型只能计算零星的几个句子的概率,而大部分的句子算得的概率是0,这显然是不合理的。
因此,我们要进行数据平滑(data Smoothing),数据平滑的目的有两个:
- 使所有的N-gram概率之和为1
- 使所有的n-gram概率都不为0。
数据平滑的本质是重新分配整个概率空间,使已经出现过的n-gram的概率降低,补充给未曾出现过的n-gram
。
主要有如下平滑处理方法:
3.1 拉普拉斯平滑(Laplace Smoothing)
Add-one
拉普拉斯平滑-Add-one,即强制让所有的n-gram至少出现一次,只需要在分子和分母上分别做加法即可(分母上的V是n-gram句子概率的乘积项的个数,相当于加了1的总个数)。这个方法的弊端是,大部分n-gram都是没有出现过的,很容易为他们分配过多的概率空间。
Add-K
在Add-one的基础上做了一点小改动,原本是加一,现在加上一个小于1的常数KKK。但是缺点是这个常数仍然需要人工确定,对于不同的语料库KKK可能不同。
3.2 古德图灵(Good-Turing)估计法
基本思想是:用观察计数较高的N元语法数
重新估计概率量的大小
,并把它指派给那些具有零计数或者较低计数的N元语法。
c*是Good-Turing平滑计数
,c是某个N元语法出现的频数
,Nc是出现次数为c的N-gram词组的个数
,是频数的频数,如下所示:
如何使用古德图灵估计法,举个例子
数据如下所示:
训练集合:T={<s>, what, is, it, what, is, small, ?}, |T|=8
验证集合:V={what, is, it, small, ?, <s>, flying, birds, are, a, bird, .}, |V|=12
不实用任何平滑技术来计算各单词的概率,在训练集合上,我们得到:
p(<s>) = p(it) = p(small) = p(?) = 1/8=0.125,
p(what) = p(is) = 2/8=0.25,
其他为0。
如果不经过平滑处理,则验证集上两句子的概率分别为:
p(what is it ?) =(0.25*2)*(0.125*2)≈ 0.001
p(it is flying .) = 0.125 * 0.25 *(0*2)= 0
现在用古德-图灵算法进行平滑处理,如下:
(1). 计算Nc,依次为
N(0)=6, N(1)=4, N(2)=2, N(i)=0 ,i>2。
也就是说:
首先测试集中的词有(<flying,birds,are,a,bird,.>)这6个不在训练集中的,所以N(0)=6。
测试集中的词有(<s>,it,small,<?>)这4个在训练集出现过1次,所以N(1)=4
测试集中的词有(what,is)这2个在训练集出现过2次,所以N(2)=2
测试集中的词有0个在训练集中出现次数大于2,所以N(i>2)=0。
(2). 重新估计各平滑后的值c*。
对于发生0次的事件:
c*(.)=c*(flying)=c*(birds)=c*(are)=c*(bird)=c*(a)=(0+1)*N(0+1)/N(0)=1*4/6≈0.667
对于发生1次的事件:
c*(it)=c*(s)=c*(small)=c*(?)=(1+1)*N(1+1)/N(1)=2*2/4=1
对于发生2次的事件:
c*(what)=c*(is)=(2+1)*N(2+1)/N(2)=3*0/2=0,保持原值c*(what)=c*(is)=N(2)=2
(3). 归一化的概率:
p`(it)=p`(s)=p`(small)=p`(?)=1/12 ≈0.083
p`(what)=p`(is)= 2/12 ≈0.167
p`(.)=p`(flying)=p`(birds)=p`(are)=p`(bird)=p`(a) = 0.667/12≈0.056
因此
p`(what is it?) = 0.167 * 0.167 * 0.083 * 0.083 ≈ 0.00001921
p`(it is flying.) = 0.083 * 0.167 * 0.056 * 0.056 ≈ 0.0000434681
古德图灵法属于减值法,还有其他几种减值法:Katz后退法、绝对减值法、线性减值法。