N-gram模型遗留下来的问题就是数据稀疏该怎么办,我们首先来想想这个问题,主要是由于数据稀疏造成的,那么很自然的增加语料库就可以较好的解决这个问题,但是大多数情况下,我们是没办法增加自己的语料库,只能通过算法来帮助我们达到目的。那么,不管是哪一种数据平滑的方法,整体的思想都是“劫富济贫”,为什么这么说呢?我们首先来看看一幅数据分布图(在宗成庆老师的自然语言处理这本书中有)。
其中 Nr 表示的是出现r次的单词的个数,可以看到出现一次的单词非常多,出现两次的单词次之,但是实际上,出现一次的单词不应该获取较大的概率。 数据平滑的方式:
1)+1法。
这种方法的思想相对来说就比较地朴素了,根据名字,就很直观,就是在每次 进行概率计算的时候,假如某个单词或者词组的频率是,那么就是用+1来代替进行计算。
2)减值法\折扣法(discounting)
这种方法整体的思想,就是把已知时间的概率拿出来一部分分配给未知概率事件。 也就是说通过某种方法,使得已知事件的概率之和是小于1的,然后把缺省的那一部分 拿出来分配给未知概率事件。
Good Turing估计(古德-图灵法)
感慨一句,话说这个命名的方法,真的是相当直白啊,没错,就是古德在其老师图灵的指导下提出的这个方法。整体的思想依然是基于“劫富济贫”的思想,也就是说把非0事件的概率按照公式消减出现的次数,然后把剩余的概率均匀分给0概率事件。
首先我们假设N是整个训练样本单词总数,表示的是出现r次的单词的个数,那么显然有:
$$ N = \sum_{r=1}^{\infty}n_r*r$$
又因为:
$$ N = \sum_{r=0}^{\infty}n_rr^*=\sum_{r=0}^{\infty}n_{r+1}(r+1)$$
所以,
这样,我们可以做出这样的调整,也就是说不直接使用r来计算,而是使用 来表示r,也就是,如下式:
那么,出现r次的单词的概率就是: ,而不是
我们说,在进行任何的平滑操作之前,我们首先需要保证所有事件的概率之和是等于1的,但是显然我们进行调整之后应该就不是一了,
因为: 于是,我们就可以直接把均匀分配给未知的事件。
虽然这个算法好像蛮简单的,但是当初看书的时候是一直不明白,一直无法理解,所以到最后,未出现的事情的概率到底是怎么计算的呢,我主要纠结的点就是,到底是用dr那个计算,还是说最后的均分来估计未出现词的概率,现在自己重新写了一遍,恍然大悟,不能使用dr计算为0的事件,因为很显然的一个事情就是,当n=0时,无意义啊!
这里需要注意的就是,正式因为<1,
因此在进行计算的时候,是需要进行归一化处理的:
okay,正所谓,光说不练假把式,大家如果还是觉得不理解,可以看看,来源于[宗成庆老师课件][1]的例子 [1]:www.nlpr.ia.ac.cn/cip/ZongRep…
Back-Off 估计(Katz 后退法)
这种方法的思路跟古德图灵法很相似,整体思路也是消减分0概率事件,然后把多余的概率分配给非0事件,但不是均匀分布,而是按照低阶分配。
以上就是几种数据平滑的方式,内容同步在我的博客中,欢迎大家评论交流。
开启掘金成长之旅!这是我参与 「掘金日新计划 · 2 月更文挑战」的第 15 天,点击查看活动详情