N-Gram模型介绍

1.N-Gram的原理

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的应用很少见。

2.unigram model、bigram model、trygram model简单介绍及推理

unigram model

不考虑每个词的出现顺序,即P(A,B)=P(A)*P(B)

P(w1,w2,w3,…wn)= P(w1)P(w2)P(w3)…P(wn)

  • 举例:P(I am going home) = P(I) P(am) P(going) P(home)
  • 缺点:因为不考虑单词出现的顺序,所以会出现P(I am going home) = P(am going home I) ,无法判别真实的语句情况
P(w)计算

例: P(今天 是 周日) = P(今天)P(是)P(周日)
比如我们准备了一个拥有1W句话(10W个单词)的语料库,“今天”一共出现了103次,则P(今天)=0.00103,即P(w) = 词频/词库总数

Bi-Gram:bigram model

在一阶的马尔科夫条件下,P(w1,w2,w3,…wn)= P(w1)P(w2|w1)P(w3|w2)…P(wn|w_{n-1})

  • 举例:P(I am going home) = P(I) P(am|I) P(going|am) P(home|going)
P(w)计算

例: P(今天 是 周日 大伙 休息) = P(今天)P(是|今天)P(周日|是)P(大伙|周日)P(休息|大伙)
此时 P(是|今天) = P(今天 是)/P(今天)
即 P(wn|w_{n-1}) = P(w_{n-1}wn)/P(w_{n-1})

Tri-Gram:trygram model

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(w)计算

例: 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})

3.N-gram中的数据平滑方法

上面提到,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。

拉普拉斯平滑
  • Add-one Smoothing
    Add-one是最简单、最直观的一种平滑算法。既然希望没有出现过的N-Gram的概率不再是0,那就不妨规定任何一个N-Gram在训练语料至少出现一次(即规定没有出现过的N-Gram在训练语料中出现了一次),则: countnew(n-gram)=countold(n-gram)+1countnew(n-gram)=countold(n-gram)+1 于是,对于unigram模型而言,会有:
    在这里插入图片描述
    同理,对于bigram模型而言,可得:
    在这里插入图片描述
    如此一来,训练语料中未出现的n-Gram的概率不再为 0,而是一个大于 0 的较小的概率值。Add-one 平滑算法确实解决了我们的问题,但显然它也并不完美。由于训练语料中未出现n-Gram数量太多,平滑后,所有未出现的n-Gram占据了整个概率分布中的一个很大的比例。因此,在NLP中,Add-one给训练语料中没有出现过的 n-Gram 分配了太多的概率空间。此外,认为所有未出现的n-Gram概率相等是否合理其实也值得商榷。而且,对于出现在训练语料中的那些n-Gram,都增加同样的频度值,这是否欠妥,我们并不能给出一个明确的答案。
  • Add-k Smoothing
    由Add-one衍生出来的另外一种算法就是 Add-k。既然我们认为加1有点过了,不然选择一个小于1的正数 k。此时,概率计算公式就变成了:
    在这里插入图片描述
    通常,add-k算法的效果会比Add-one好,但是显然它不能完全解决问题。但是缺点是这个常数仍然需要人工确定,对于不同的语料库K可能不同。

4.内插与回溯

插值和回退的思想其实非常相像。设想对于一个trigram的模型,我们要统计语料库中 “like chinese food” 出现的次数,结果发现它没出现过,则计数为0。在回退策略中,将会试着用低阶gram来进行替代,也就是用 “chinese food” 出现的次数来替代。 在使用内插值法时,我们把不同阶别的n-Gram模型线形加权组合后再来使用。

内插法(Interpolation)

如下是一个三阶组合,假设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)与内插有点像,只是它会尽可能地用最高阶组合计算概率,当高阶组合不存在时,退而求其次找次低阶,直到找到非零组合为止。参考下式,这是一个递归运算。
在这里插入图片描述

5.语言模型(LM)评估

理想情况下:

  • 假设有两个语言模型A、B
  • 选定一个特定的任务比如拼写纠错
  • 把模型A,B都应用在此任务中
  • 最后可以计算出错误率,从而可以比较A和B的表现

缺点:

  1. 需要针对场景搭建整个模型,比较低效
  2. 可能模型在某个场景下准确率比较高,换一个场景后准确率可能就没那么高了。

所以需要一个更简便的评估方法:Perplexity
Perplexity = Negative Average Log Likelihood
一个语言模型表现更好好就是说它在测试集合表现更好,也就是说使得测试数据能有更高产生概率(assign a higher score to test data) 在这个基础上表征了这一特征,perplextiy越低则表示测试数据产生概率越高。
N-Gram模型介绍_第1张图片
Perplexity另一种表达:

在这里插入图片描述

参考资料:
[课程]贪心学院NLP训练营
[博客]自然语言处理NLP中的N-gram模型
[博客]N-gram的简单介绍
[博客]N-gram语言模型 & Perplexity & 平滑
[博客]语言模型评估

你可能感兴趣的:(机器学习,自然语言处理)