N-gram是一种传统的统计语言模型,该模型基于这样一种假设:第 n n n 个词的出现只与前面 m − 1 m-1 m−1 个词相关,而与其它任何词都不相关,整句的概率就是各个词出现概率的乘积。这些概率可以通过直接从语料中统计 m m m 个词同时出现的次数得到。常用的是二元的Bi-Gram和三元的Tri-Gram(即 m = 2 m=2 m=2 或 m = 3 m=3 m=3)。
预备知识
条件概率
P ( B ∣ A ) = P ( A B ) P ( A ) P(B | A) = \frac {P(AB)} {P(A)} P(B∣A)=P(A)P(AB)
乘法公式
P ( A B ) = P ( A ) P ( B ∣ A ) P ( A 1 A 2 … A n ) = P ( A 1 ) P ( A 2 ∣ A 1 ) P ( A 3 ∣ A 2 A 1 ) … P ( A n ∣ A n − 1 … A 1 ) P(AB) = P(A)P(B|A) \\ P(A_1A_2 \dots A_n) = P(A_1)P(A_2|A_1)P(A_3|A_2A_1)\dots P(A_n|A_{n-1} \dots A_1) P(AB)=P(A)P(B∣A)P(A1A2…An)=P(A1)P(A2∣A1)P(A3∣A2A1)…P(An∣An−1…A1)
缺陷
上述的条件概率很少在实际中应用,因为它存在两个致命的缺陷:
- 参数空间过大
- 数据稀疏严重
为了解决上述问题,我们引入马尔可夫假设:
一个词的出现仅仅依赖于它前面出现的有限的一个或者几个词。
如果一个词的出现仅依赖于它前面出现的一个词,那么我们就称之为bigram,即:
P
(
T
)
=
P
(
w
1
w
2
…
w
n
)
=
P
(
w
1
)
P
(
w
2
∣
w
1
)
P
(
w
3
∣
w
2
)
…
P
(
w
n
∣
w
n
−
1
)
P(T) = P(w_1w_2 \dots w_n) = P(w_1)P(w_2|w_1)P(w_3|w_2) \dots P(w_n|w_{n-1})
P(T)=P(w1w2…wn)=P(w1)P(w2∣w1)P(w3∣w2)…P(wn∣wn−1)
同理可得trigram。
举例
在实践中用的最多的就是bigram和trigram了,而且效果很不错。高于四元的用的很少,因为训练它需要更庞大的语料,而且数据稀疏严重,时间复杂度高,精度却提高的不多。
使用最大似然估计可以很方便的得到
P
(
w
i
∣
w
i
−
1
w
i
−
2
…
w
1
)
P(w_i|w_{i-1}w_{i-2} \dots w_1)
P(wi∣wi−1wi−2…w1),即:
P
(
w
i
∣
w
i
−
1
w
i
−
2
…
w
1
)
=
P
(
w
i
w
i
−
1
w
i
−
2
…
w
1
)
P
(
w
i
−
1
w
i
−
2
…
w
1
)
P(w_i|w_{i-1}w_{i-2} \dots w_1) = \frac {P(w_iw_{i-1}w_{i-2} \dots w_1)} {P(w_{i-1}w_{i-2} \dots w_1)}
P(wi∣wi−1wi−2…w1)=P(wi−1wi−2…w1)P(wiwi−1wi−2…w1)
下面我们用bigram举个例子。假设语料库总词数为13748
P
(
I
  
w
a
n
t
  
t
o
  
e
a
t
  
C
h
i
n
e
s
e
  
f
o
o
d
)
=
P
(
I
)
∗
P
(
w
a
n
t
∣
I
)
∗
P
(
t
o
∣
w
a
n
t
)
∗
P
(
e
a
t
∣
t
o
)
∗
P
(
C
h
i
n
e
s
e
∣
e
a
t
)
∗
P
(
f
o
o
d
∣
C
h
i
n
e
s
e
)
=
3437
13748
∗
1087
3437
∗
786
1215
860
3256
∗
19
938
∗
120
213
=
0.000154171
\begin{aligned} P(I \; want \; to \; eat \; Chinese \; food) &= P(I) * P(want | I) * P(to | want) * P(eat | to) * P(Chinese | eat) * P(food | Chinese) \\ &= \frac {3437} {13748} * \frac {1087} {3437} * \frac {786} {1215} \frac {860} {3256} * \frac {19} {938} * \frac {120} {213} \\ &= 0.000154171 \end{aligned}
P(IwanttoeatChinesefood)=P(I)∗P(want∣I)∗P(to∣want)∗P(eat∣to)∗P(Chinese∣eat)∗P(food∣Chinese)=137483437∗34371087∗12157863256860∗93819∗213120=0.000154171
注意
这里有一个问题要说,那就是数据稀疏的问题。假设词表中有20000个词,如果是bigram那么可能的N-gram就有400000000个,如果是trigram,那么可能的N-gram就有8000000000000个!那么对于其中的很多词对的组合,在语料库中都没有出现,根据最大似然估计得到的概率将会是0,这会造成很大的麻烦。在算句子的概率时一旦其中的某项为0,那么整个句子的概率就会为0。因此,我们要进行数据平滑(data Smoothing)。数据平滑的目的有两个:
- 使所有的N-gram概率之和为1
- 使所有的N-gram概率都不为0
转载自:https://blog.csdn.net/lengyuhong/article/details/6022053