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(wi∣wi−1)=C(wi−1)+VC(wi−1,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(wi−1,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(wi−1wi)+1 为1啊, 物理意义就是, 词典库中有 V V V个词汇, w i − 1 w_{i-1} wi−1 后面接的单词在这 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(wi∣wi−1)=C(wi−1)+kVC(wi−1,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′(wn∣wn−1,wn−2)=λ1P(wn∣wn−1,wn−2)+λ2P(wn∣wn−1)+λ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