1.3 n-gram平滑算法:Good-Turning拉普拉斯平滑

Posted 炫云云

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1.3 n-gram平滑算法:Good-Turning拉普拉斯平滑相关的知识,希望对你有一定的参考价值。


上一节请看:

1.1 文本表示——词袋法:one-hot、TF-IDF、n-gram、神经概率语言模型

1.2 Bigram计算句子的概率、python实现_炫云云-CSDN博客

为什么需要平滑操作

假设有一个预料集

我 喜欢 喝 奶茶
我 喜欢 吃 巧克力
我 喜欢 健身
天啦撸,一起同过窗 要出 第三季 了

这个时候要计算“我喜欢喝咖啡”的概率

假设我们用bi-gram模型来计算,也就是说
    P ( 我 喜 欢 喝 咖 啡 ) = P ( 我 ) P ( 喜 欢 ∣ 我 ) P ( 喝 ∣ 喜 欢 ) P ( 咖 啡 ∣ 喝 ) = ( 3 / 16 ) ∗ ( 1 ) ∗ ( 1 / 3 ) ∗ ( 0 ) = 0   P(我喜欢喝咖啡) = P(我)P(喜欢|我)P(喝|喜欢)P(咖啡|喝) = (3/16) * (1) * (1/3) * (0) = 0   P()=P()P()P()P()=(3/16)(1)(1/3)(0)=0
但是我们都容易感觉出来,“我喜欢喝咖啡”是符合语言习惯的句子,也就是说,虽然现在的语料库中没有这个句子,但是将来也有可能出现,但是我们算出的这个句子出现的概率是0,这不符合常识。因为语料库中没有出现“喝”后面接“咖啡”,只能说明这个句子未来出现的概率比较小,但是不排除它会出现,毕竟“我喜欢喝”这个前缀的概率该是很大的,“喝 咖啡”没有出现,只能说明“喝”后面接“咖啡”的概率很小,但是就将这个句子的概率定为0是不科学的。那么,该如何做才能使得没出现的搭配也能有一个小的概率呢?

拉普拉斯平滑

Add-one smoothing

公式:
P ( w i ∣ w i − 1 ) = C ( w i − 1 , w i ) + 1 C ( w i − 1 ) + V P\\left(w_{i} \\mid w_{i-1}\\right)=\\frac{C\\left(w_{i-1}, w_{i}\\right)+1}{C\\left(w_{i-1}\\right)+V} P(wiwi1)=C(wi1)+VC(wi1,wi)+1
这里的 V V V是词典库的大小, 注意, 是词典库的大小, 不是训练的预料集分词之后的词语个数。例如, 对于上面那个预料集, 分词之后有16个单词,但是词典库的大小是12个。所以 V V V是12哦。

分母加1可以理解, 为了让那些出现频次为0的 C ( w i − 1 , w i ) C\\left(w_{i-1}, w_{i}\\right) C(wi1,wi) 算出来的概率不为0, 从而避免了因为它使得整个句子的概率为0了。

可是为什么分子要加 V V V呢,为了使得 ∑ w i C ( w i − 1 w i ) + 1 C ( w i − ) + V \\sum_{w i} \\frac{C\\left(w_{i-1} w_{i}\\right)+1}{C\\left(w_{i-}\\right)+V} wiC(wi)+VC(wi1wi)+1 为1啊, 物理意义就是, 词典库中有 V V V个词汇, w i − 1 w_{i-1} wi1 后面接的单词在这 V \\mathrm{V} V 个词汇之中的概率要为1, 也就是加起来为1。

add-k Smoothing

公式:
P ( w i ∣ w i − 1 ) = C ( w i − 1 , w i ) + k C ( w i − 1 ) + k V P\\left(w_{i} \\mid w_{i-1}\\right)=\\frac{C\\left(w_{i-1}, w_{i}\\right)+k}{C\\left(w_{i-1}\\right)+k V} P(wiwi1)=C(wi1)+kVC(wi1,wi)+k
只是由加1变成了加 k k k而已啦。add-one smoothing和add-k smoothing都是拉普拉斯平滑

good-turning smooth

问题

但是其实上面介绍的两个平滑还是会有一个问题没有解决

下面举一个例子

假设我们有语料库

在 這個 浴室 
厨房 和 餐厅
餐厅
植物园

如果通过add-one smoothing,我们计算 P ( 餐 厅 ∣ 在 , 這 個 ) P(餐厅|在,這個) P(,) P ( 植 物 园 ∣ 在 , 這 個 ) P(植物园|在,這個) P(,)的值是一样的,因为他们的频次都是0,所以值都是(0+1)/(1+ 7) = 1/8。但是我们直观感觉,在餐厅 肯定要比在植物园的概率要大得多,那么这种感觉是怎么来的呢?因为餐厅出现的次数大于植物园。所以我们计算tri-gram模型的概率的时候,如果能够考虑bi-gram和unigram的概率,那么就能避免上述情况了。

公式也很简单,如下:
P ′ ( w n ∣ w n − 1 , w n − 2 ) = λ 1 P ( w n ∣ w n − 1 , w n − 2 ) + λ 2 P ( w n ∣ w n − 1 ) + λ 3 P ( w n ) P^{\\prime}\\left(w_{n} \\mid w_{n-1}, w_{n-2}\\right)=\\lambda_{1} P\\left(w_{n} \\mid w_{n-1}, w_{n-2}\\right)+\\lambda_{2} P\\left(w_{n} \\mid w_{n-1}\\right)+\\lambda_{3} P\\left(w_{n}\\right) P(wnwn1,wn2)=λ1P(wnwn1,wn2)+λ2P(wnwn1)+λ3P(wn)
其中 λ 1 , λ 2 , λ 3 \\lambda_{1}, \\lambda_{2}, \\lambda_{3} λ1,λ2,λ3 是可以变化的参数, 且满足 λ 1 + λ 2 + λ 3 = 1 \\lambda_{1}+\\lambda_{2}+\\lambda_{3}=1 λ1+λ2+λ3=1

在介绍Good-Turning Smoothing之前,我们可以先看一个有趣的例子:

假设你在钓鱼,已经抓到了18只鱼:10条鲤鱼,3条黑鱼,2条刀鱼,1条鲨鱼,1条草鱼,1条鳗鱼…

  • Q1:下一个钓到的鱼是鲨鱼的概率是多少?
  • Q2:下一条鱼是新鱼种(之前没有出现过)的概率是多少?
  • Q3:既然如此,重新想一下,下一条抓到鱼为鲨鱼的概率是多少?

我们在看到Q1时,可以很简单的算出Q1结果为 1/18.

但是到了Q2,此时概率是无法计算的,所以我们便可以在此引出Good-Turning。在Good-Turning方法论中,我们会假设未出现过的鱼种的概率与出现一次的鱼种的概率相同,即 N 0 = N 1 N_0 = N_1 N0=N1 ( N c N_c Nc表示出现 c c c次的元素的总数),在上面的例子中 N 10 = 1 , N 3 = 1 , N 2 = 1 , N 1 = 3 N_{10}=1,N_{3}=1,N_{2}=1,N_{1}=3 Nn-gram语言模型LM

n-gram语言模型LM

自然语言处理中的N-Gram模型详解

NLPN-Gram自然语言处理模糊匹配编辑距离

用srilm生成语言模型

第二篇:n-gram 语言模型