N-gram模型

原文链接: https://blog.csdn.net/lengyuhong/article/details/6022053

N-gram是一种传统的统计语言模型,该模型基于这样一种假设:第 n n n 个词的出现只与前面 m − 1 m-1 m1 个词相关,而与其它任何词都不相关,整句的概率就是各个词出现概率的乘积。这些概率可以通过直接从语料中统计 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(BA)=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(BA)P(A1A2An)=P(A1)P(A2A1)P(A3A2A1)P(AnAn1A1)

缺陷

上述的条件概率很少在实际中应用,因为它存在两个致命的缺陷:

  • 参数空间过大
  • 数据稀疏严重
    为了解决上述问题,我们引入马尔可夫假设:

一个词的出现仅仅依赖于它前面出现的有限的一个或者几个词。

如果一个词的出现仅依赖于它前面出现的一个词,那么我们就称之为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(w1w2wn)=P(w1)P(w2w1)P(w3w2)P(wnwn1)
同理可得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(wiwi1wi2w1),即:
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(wiwi1wi2w1)=P(wi1wi2w1)P(wiwi1wi2w1)
下面我们用bigram举个例子。假设语料库总词数为13748
N-gram模型_第1张图片
N-gram模型_第2张图片
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(wantI)P(towant)P(eatto)P(Chineseeat)P(foodChinese)=137483437343710871215786325686093819213120=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

你可能感兴趣的:(机器学习,nlp)