ngram模型中文语料实验step by step(3)-ngram模型的光滑处理
由于语料不可能覆盖掉所有的情况,比如语料中有“小明读了一本书”, 那么“小李读了一本书”没有在语料中出现按照MLE最大似然估计其概率就是0,这显然是不合常理的。所以我们需要对模型进行光滑处理,就是要分一部分概率给语料中没有出现的部分。
问题是如何分配,应该分配多少呢。(下面的课件来自nhu的NLP课程)
一个极端的情况,这样add one广顺 其实会认为未知事物概率更大,看到我们训练中的数据的可能性很小。
可以看到对于大的词典,我们分配给未知事物的概率太大了。为了减少未知事物分配的概率,我们可以将add 1改为add lamda, 0 < lamda < 1,如下面的公式B是词典的大小,N是语料总token数目。
那么lamda应该取多大呢?
留存估计
<<统计自然语言处理基础>>p129。即我们观察在训练语料中出现了r次的ngram在更多文本比如一个预留的测试文本中出现的频率估计。比如再训练语料中出现2次的ngram有N2个,那么这些type在测试文本中出现了一共T2次,那么平均每一个type出现次数是T2/N2,概率估计就是T2/(N2*T),T是留存文本中的总token数目。比如训练语料中出现为0的所有type,考察在测试文本中的出现次数按照上面的方法我们可以估算应该分配给未出现type的概率大小。可以参考P127表6.4。
一些常见的广顺方法
我们认为左边的情况显然应该更rare,因为分布更加集中,而右边更加均匀,那么nove events的概率更大些。
written-bell光顺的主要思路是用T/N+T(T不包括N0)作为对所有未出现事物总的概率的估计。对于一个先前没有看到的事件,使用在语料中看到这样一个新事物的概率代替。
Good-Turing光顺
使用回退
下面是《有点意思,拼音输入法》中的解释
一般的back-off模型的表示如下:Ps(Wi|h) = Pd(Wi|h) -- C(h,Wi) > 0
bow(h).Ps(Wi|h') -- C(h,Wi) == 0
- h'是h去掉其第一个词,对trigram (A,B,Wi)来说,h为(A,B),h'为B。
- Pd(Wi|h) < Pml(Wi|h),对最大似然估计进行打折(discount),可使用多种不同的打折方法。
- bow(h)被称为back-off weight(回退权重),对于给定的h,bow(h)是一个常数,并且可以通过下面的方法来确定Ps(W1|h)+Ps(W2|h)+...+Ps(Wn|h) = sum_i (Ps(Wi|h)) = 1
- 上面这个式子是递归的,如果(h',Wi)出现次数为0,还会继续回退,也许会回退到Wi,甚至回退到平均分配(如果Wi也未出现)
- 如果h在训练中没有见到,则P(Wi|h) = P(Wi|h')
Katz的back-off模型使用的是Good-Turing方法。Kneser-Ney是另一种back-off模型,其平滑效果要好于Katz方法。Stanley Chen和Joshua Goodman专门写过一篇论文,详细比较了各种平滑方法的优劣,有兴趣可以去读一读。
![image image](https://images.cnblogs.com/cnblogs_com/rocketfan/201101/201101041635384881.png)
可以看到打折还是相同的打折,给未知事物和原有打折方法一样的概率分配,但是具体分配到某个未知事物的时候不再是平均分配了,是和上层语境有关的,即和回退到上层的概率有关系的(the baby > the zygote),上层概率大的分配的也多(see the baby > see the zygote)。