什么是N-gram?
为了解决自由参数数目过多的问题,引入了马尔科夫假设:随意一个词出现的概率只与它前面出现的有限的n个词有关。基于上述假设的统计语言模型被称为N-gram语言模型,也叫n元文法模型。
关于N的取值?
1)当n=1时,即一个词的出现与它周围的词是独立,这种我们称为unigram,也就是一元语言模型,此时自由参数量级是词典大小V。
2)当n=2时,即一个词的出现仅与它前面的一个词有关时,这种我们称为bigram,叫二元语言模型,也叫一阶马尔科夫链,此时自由参数数量级是V^2。
3)当n=3时,即一个词的出现仅与它前面的两个词有关,称为trigram,叫三元语言模型,也叫二阶马尔科夫链,此时自由参数数量级是V^3。
一般情况下只使用上述取值,因为从上面可以看出,自由参数的数量级是n取值的指数倍。
假设使用词为20000个,则
从模型的效果来看,理论上n的取值越大,效果越好。但随着n取值的增加,效果提升的幅度是在下降的。同时还涉及到一个可靠性和可区别性的问题,参数越多,可区别性越好,但同时单个参数的实例变少从而降低了可靠性。
n元语法模型的基本的公式可以看作为下面的概率公式P:
这里需要说明,2-gram模型的分母实际表示的就是w_i-1出现的次数。各x-gram的分子表示的就是相应词语序列的出现次数。
举个例子:
0-Gram:
语料库(词库):[经常,有,有意见,意见,分歧]
待分词的句子:经常有意见分歧
分词为:经常|有意见|分歧、经常|有|意见|分歧,则
S1=经常|有意见|分歧
S2=经常|有|意见|分歧
P(S1)=P(经常)*P(有意见)*P(分歧)
p(S2)=P(经常)*P(有)*P(意见)*P(分歧)
假设:根据词库出现的个词/总词语数为该词的概率,即1000个词出现100个经常,则P(经常)=0.1
然后比较:P(S1)与p(S2)大小即可,概率更大的则为最终结果
1-Gram(同上语料库和带分词句子):
S1=经常|有意见|分歧
S2=经常|有|意见|分歧
P(S1)=P(经常)*P(有意见|经常)*P(分歧|有意见)
p(S2)=P(经常)*P(有|经常)*P(意见|有)*P(分歧|意见)
比较大小即可
2-Gram(同上条件):
P(S1)=P(经常)*P(有意见|经常)*P(分歧|经常有意见)
p(S2)=P(经常)*P(有|经常)*P(意见|经常有)*P(分歧|有意见)
有一点大家可能比较疑惑,就是我知道这么求,但是我不知道P(经常)这种词语的概率啊。
确实一旦给我们各种词语的概率,P(S1)和条件中的各种条件概率都是非常容易求的,那么这些概率是怎么来的呐?
是利用从大规模语料库中通过统计得到的各种概率信息。
目前大家应该都了解了N-Gram怎么计算了吧?但是,其中还有很多关键的问题,例如有时候词库里的词并没有在文章中出现,假设“经常”没有出现过,则P(经常)=0,因为分子是出现的次数,所以必然为0,那么P(S1)=0*其他数=0,这明显是不合理的;其次假设P(S3)=0.00001*0.00001*0.00001*...*0.00001,那么P(S3)很容易超出了float的范围,变成unfloat,这也是不行的。总结起来就是:
- 某项为0
- 大量极小的想乘后过小
这就牵扯到平滑的问题了。平滑的方法有很多,这里具体介绍两种比较常见的平滑方法。
加δ平滑
这种平滑方式的思想非常简单,即假设每一个 n-gram 都至少出现δ次,对于每一个 n-gram,其计数为 实际出现次数 +
δ,特别地,对不存在的 n-gram 的计数是δ。
(常见的δ取1或者0.5)
使用log进行平衡
P(S)=log(w1)+log(W2)+...+log(Wn)的形式(以n=0为例),这样加法可以避免第二个缺点以上情况,因为极小的数值进行log后会变成非常大的负值,可以比较P(S)谁最小->即概率最大
来源:CSDN
作者:任泓洁的小生活
链接:https://blog.csdn.net/RHJlife/article/details/104750155