NLP-统计语言模型的平滑方法
一、引言
在NLP-统计语言模型中简要介绍了统计语言模型的原理和实现方法,以bigram为例,计算了
的概率,这是比较理想的情况,而现实与理想的差距是我们预测了一万种可能,却还有一万零一种可能的存在。而我们企图用已经存在的语料数据来覆盖未来有可能出现的测试数据,未免有些天真。
文章图片
还是以NLP-统计语言模型中的假设语料来举例
而我需要计算句子的概率时:
- 我 喜欢 大自然
- 自然语言 是 如何 形成 的 呢
- 如何 处理 数据 是 很 重要 的
- 越来越多 的 人 喜欢 自然语言 处理
在语料库中喜欢的后面并没有出现过看电影,也就意味着,直接导致了的可能性为0,这显然是不科学的,所以就需要一些平滑的处理方法,用以过渡上述情况。
二、add-k smoothing add-k smoothing 是一种比较简单的方式,为了防止出现概率为0的情况,对求概率的公式做了一点手脚,如下:
为什么是呢,因为要确保概率的总和为1,具体过程此处不做推导。
add-k smoothing 是一种行之有效的方式,但其中也隐含着一种价值观:
没有出现的词未来出现的可能性相等,对于所有概率为0的情况,都是在分子和分母上做了同样的操作,那么就导致了这些情况的概率都一致,是否还有更加“公平”的一些方式呢?有,来看看interpolation smoothing。
三、interpolation smoothing interpolation smoothing的思想在于求上不得而求其中,其中不足余下来补,为了更好的说明interpolation 以trigram为例,假设我们要求,会等于0,那么求,再不济还可以求,综合上面三种情况,给每种情况分配不同的权重得:
此方法综合unigram、bigram和trigram甚至可以更多,这样就确保了语料库未出现词组合的概率的不一致,相对来说,公平了些。
四、good-turing smoothing good-turing的核心思想在于,对于没有出现的过的事件,不能认为该事件出现的概率为0,所以我们从已经发生的事件概率总量1中分配一个很小的比例给该事件。
这是一种很有前瞻性的格局,但是把概率分出去一分部以后,那未出现的事件+已经出现的事件的概率总和就会大于1,所以就需要把已经发生的事件的概率稍微调小一点,确保概率的总合为1,具体怎么调整呢,先摆出公式再来解释:
为了说明公式,先来认识一个概念:
假设语料库的大小为N,对于没有出现过的词,概率原本为0,那么分一个语料库中低频事件的概率给它,比如,把语料库中只出现只出现过一次的事件的概率给它:
【NLP-统计语言模型的平滑方法】对于已经出现过的词,需要调整概率
至于公式为何是这样,吴军老师在《数学之美》中讲解较好,感兴趣的可以前去参考,此处不做过多解释,本文着眼于如何利用成果解决问题。
看了公式可能有点蒙圈,还是根据语料库来解释一下
设语料来举例
假设现在要根据语料库计算计算的概率,而计算刚好没有出现过,那么
- 自然语言 是 如何 形成 的 呢
- 如何 处理 自然语言 是 很 重要 的
- 是 又 如何
此时,原先出现过的词的概率需调整
突然发现了神奇的一幕,调整以后概率还变大了,这是因为举例的语料库太小,很多地方不合理,在较大的语料库中是不会出现这种情况的,拿汉字来说,常用的汉字的比例在总汉字中的比例是很小的,也就是c越大,越小,那么一般情况下(具体证明参考齐夫定律),即概率调整后是减少的。
五、总结 本文简单介绍一些在统计语言模型中需要的一些平滑过渡的方法,总体而言就是考虑未登录词的情况,方法并非绝对,如果读者还有更多的方法欢迎介绍。
推荐阅读
- 【生信技能树】R语言练习题|【生信技能树】R语言练习题 - 中级
- 一起来学习C语言的字符串转换函数
- C语言字符函数中的isalnum()和iscntrl()你都知道吗
- C语言浮点函数中的modf和fmod详解
- C语言中的时间函数clock()和time()你都了解吗
- 杭电oj——2030汉字统计
- C语言学习|第十一届蓝桥杯省赛 大学B组 C/C++ 第一场
- 概率论/统计学|随机变量 的 分布函数 与 概率密度函数 的区别
- C语言解方程的根和判断是否是闰年
- C语言的版本比较