N-Gram是基于一个假设:第n个词出现与前n-1个词相关,而与其他任何词不相关。(这也是隐马尔可夫当中的假设。)整个句子出现的概率就等于各个词出现的概率乘积。各个词的概率可以通过语料中统计计算得到。假设句子T是有词序列w1,w2,w3…wn组成,用公式表示N-Gram语言模型如下:
P(T)=P(w1)*p(w2)*p(w3)***p(wn)=p(w1)*p(w2|w1)*p(w3|w1w2)***p(wn|w1w2w3…)
一般常用的N-Gram模型是Bi-Gram和Tri-Gram。分别用公式表示如下:
一元Bi-Gram: P(T)=p(w1|begin)*p(w2|w1)*p(w3|w2)***p(wn|wn-1)
二元Tri-Gram: P(T)=p(w1|begin1,begin2)*p(w2|w1,begin1)*p(w3|w2w1)***p(wn|wn-1,wn-2)
除此之外,还有four-gram、five-gram等,不过n>5的应用很少见。
不考虑每个词的出现顺序,即P(A,B)=P(A)*P(B)
P(w1,w2,w3,…wn)= P(w1)P(w2)P(w3)…P(wn)
例: P(今天 是 周日) = P(今天)P(是)P(周日)
比如我们准备了一个拥有1W句话(10W个单词)的语料库,“今天”一共出现了103次,则P(今天)=0.00103,即P(w) = 词频/词库总数
在一阶的马尔科夫条件下,P(w1,w2,w3,…wn)= P(w1)P(w2|w1)P(w3|w2)…P(wn|w_{n-1})
例: P(今天 是 周日 大伙 休息) = P(今天)P(是|今天)P(周日|是)P(大伙|周日)P(休息|大伙)
此时 P(是|今天) = P(今天 是)/P(今天)
即 P(wn|w_{n-1}) = P(w_{n-1}wn)/P(w_{n-1})
trygram model类似于bigram model,不过trygram会计算每个单词的前两个单词,P(w1,w2,w3,…wn)= P(w1)P(w2|w1)P(w3|w1w2)…P(wn|w_{n-2}w_{n-1})
例: P(今天 是 周日 大伙 休息) = P(今天)P(是|今天)P(周日|今天是)P(大伙|是周日)P(休息|周日大伙)
此时 P(周日|今天 是) = P(今天 是 周日)/P(今天 是)
即 P(wn|w_{n-2}w_{n-1}) = P(w_{n-2}w_{n-1}wn)/P(w_{n-2}w_{n-1})
上面提到,N-gram的NN越大,模型 Perplexity 越小,表示模型效果越好。这在直观意义上是说得通的,毕竟依赖的词越多,我们获得的信息量越多,对未来的预测就越准确。然而,语言是有极强的创造性的(Creative),当NN变大时,更容易出现这样的状况:某些n-gram从未出现过,这就是稀疏问题。 n-gram最大的问题就是稀疏问题(Sparsity)。
例如,在bi-gram中,若词库中有20k个词,那么两两组合(C220kC20k2)就有近2亿个组合。其中的很多组合在语料库中都没有出现,根据极大似然估计得到的组合概率将会是0,从而整个句子的概率就会为0。最后的结果是,我们的模型只能计算零星的几个句子的概率,而大部分的句子算得的概率是0,这显然是不合理的。
因此,我们要进行数据平滑(data Smoothing),数据平滑的目的有两个:一个是使所有的N-gram概率之和为1,使所有的n-gram概率都不为0。它的本质,是重新分配整个概率空间,使已经出现过的n-gram的概率降低,补充给未曾出现过的n-gram。
插值和回退的思想其实非常相像。设想对于一个trigram的模型,我们要统计语料库中 “like chinese food” 出现的次数,结果发现它没出现过,则计数为0。在回退策略中,将会试着用低阶gram来进行替代,也就是用 “chinese food” 出现的次数来替代。 在使用内插值法时,我们把不同阶别的n-Gram模型线形加权组合后再来使用。
如下是一个三阶组合,假设p(wn|wn−1wn−2)=0p(wn|wn−1wn−2)=0,而p(wn|wn−1)>0p(wn|wn−1)>0且p(wn)>0p(wn)>0,则加权平均后的概率不为0,从而达到平滑的效果。
回溯法(backoff)与内插有点像,只是它会尽可能地用最高阶组合计算概率,当高阶组合不存在时,退而求其次找次低阶,直到找到非零组合为止。参考下式,这是一个递归运算。
理想情况下:
缺点:
所以需要一个更简便的评估方法:Perplexity
Perplexity = Negative Average Log Likelihood
一个语言模型表现更好好就是说它在测试集合表现更好,也就是说使得测试数据能有更高产生概率(assign a higher score to test data) 在这个基础上表征了这一特征,perplextiy越低则表示测试数据产生概率越高。
Perplexity另一种表达:
参考资料:
[课程]贪心学院NLP训练营
[博客]自然语言处理NLP中的N-gram模型
[博客]N-gram的简单介绍
[博客]N-gram语言模型 & Perplexity & 平滑
[博客]语言模型评估