N-gram是一种传统的统计语言模型,该模型基于这样一种假设:第 nnn 个词的出现只与前面 m−1m-1m−1 个词相关,而与其它任何词都不相关,整句的概率就是各个词出现概率的乘积。这些概率可以通过直接从语料中统计 mmm 个词同时出现的次数得到。常用的是二元的Bi-Gram和三元的Tri-Gram(即 m=2m=2m=2 或 m=3m=3m=3)。
预备知识
条件概率
P(B∣A)=P(AB)P(A) P(B | A) = \frac {P(AB)} {P(A)} P(B∣A)=P(A)P(AB)
乘法公式
P(AB)=P(A)P(B∣A)P(A1A2…An)=P(A1)P(A2∣A1)P(A3∣A2A1)…P(An∣An−1…A1) 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(w1w2…wn)=P(w1)P(w2∣w1)P(w3∣w2)…P(wn∣wn−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(wi∣wi−1wi−2…w1)P(w_i|w_{i-1}w_{i-2} \dots w_1)P(wi∣wi−1wi−2…w1),即:
P(wi∣wi−1wi−2…w1)=P(wiwi−1wi−2…w1)P(wi−1wi−2…w1)
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  want  to  eat  Chinese  food)=P(I)∗P(want∣I)∗P(to∣want)∗P(eat∣to)∗P(Chinese∣eat)∗P(food∣Chinese)=343713748∗10873437∗78612158603256∗19938∗120213=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.youkuaiyun.com/lengyuhong/article/details/6022053