NLP task2 _ 自然语言处理中N-Gram模型的Smoothing算法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zyq11223/article/details/90209782

使用N-Gram模型时的数据平滑算法

背景:为什么要做平滑处理?
  零概率问题,就是在计算实例的概率时,如果某个量x,在观察样本库(训练集)中没有出现过,会导致整个实例的概率结果是0。在文本分类的问题中,当一个词语没有在训练样本中出现,该词语调概率为0,使用连乘计算文本出现概率时也为0。这是不合理的,不能因为一个事件没有观察到就武断的认为该事件的概率是0。

平滑技术
平滑技术是为了解决训练集的数据稀松问题。
零概率问题,就是在计算实例的概率时,如果某个量x,在观察样本库(训练集)中没有出现过,会导致整个实例的概率结果是0。在文本分类的问题中,当一个词语没有在训练样本中出现,该词语调概率为0,使用连乘计算文本出现概率时也为0。这是不合理的,不能因为一个事件没有观察到就武断的认为该事件的概率是0。
 一般的m阶马尔科夫链转移概率是这样训练的:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
参考:https://blog.csdn.net/zhengwantong/article/details/72403808

在之前的文章《自然语言处理中的N-Gram模型详解》里,我们介绍了NLP中的模型。最后谈到,为了解决使用N-Gram模型时可能引入的稀疏数据问题,人们设计了多种平滑算法,本文将讨论其中最为重要的几种。

  • Add-one (Laplace) Smoothing
  • Add-k Smoothing(Lidstone’s law)
  • Backoff
  • Interpolation
  • Absolute Discounting
  • Kneser-Ney Smoothing

Add-one (Laplace) Smoothing

Add-one是最简单、最直观的一种平滑算法。
在这里插入图片描述
在这里插入图片描述

Add-k Smoothing(Lidstone’s law)

由Add-one衍生出来的另外一种算法就是 Add-k。(根据上文中红色字体部分)既然我们认为加1有点过了,不然选择一个小于1的正数 k。此时,概率计算公式就变成了
在这里插入图片描述
通常,add-k算法的效果会比Add-one好,但是显然它不能完全解决问题。至少在实践中,k 必须人为给定,而这个值到底该取多少却莫衷一是。

回退(Backoff)

通常我们会认为高阶模型更加可靠,我们之前博文中给出的例子也表明,当能够获知更多历史信息时,其实就获得了当前推测的更多约束,这样就更容易得出正确的结论。所以在高阶模型可靠时,尽可能的使用高阶模型。但是有时候高级模型的计数结果可能为0,这时我们就转而使用低阶模型来避免稀疏数据的问题。

如果用公式来定义,即
在这里插入图片描述

插值(Interpolation)

插值和回退的思想其实非常相像。设想对于一个trigram的模型,我们要统计语料库中 “like chinese food” 出现的次数,结果发现它没出现过,则计数为0。在回退策略中,将会试着用低阶gram来进行替代,也就是用 “chinese food” 出现的次数来替代。

在使用插值算法时,我们把不同阶别的n-Gram模型线形加权组合后再来使用。简单线性插值(Simple Linear Interpolation)可以用下面的公式来定义:
在这里插入图片描述
在这里插入图片描述

Absolute Discounting

想想之前的Add-one,以及Add-k算法。我们的策略,本质上说其实是将一些频繁出现的 N-Gram 的概率匀出了一部分,分给那些没有出现的 N-Gram 上。因为所有可能性的概率之和等于1,所以我们只能在各种可能的情况之间相互腾挪这些概率。

既然我们打算把经常出现的一些N-Gram的概率分一些出来,其实也就等同于将它们出现的次数减去(discount)一部分,那到底该discount多少呢?Church & Gale (1991) 设计了一种非常巧妙的方法。首先他们在一个留存语料库(held-out corpus)考察那些在训练集中出现了4次的bigrams出现的次数。具体来说,他们首先在一个有2200万词的留存语料库中检索出所有出现了4次的bigrams (例如: “chinese food”,“good boy”,“want to”等),然后再从一个同样有2200万词的训练集中,分别统计这些bigrams出现的次数(例如:C(“chinese food”)=4,C(“good boy”)=3,C(“want to”)=3)。最终,平均下来,他们发现:在第一个2200万词的语料中出现4次的bigrams,在第二个2200万词的语料中出现了3.23次。下面这张表给出了 c 从0到9取值时(也就是出现了 c 次),统计的bigrams在留存集和训练集中出现的次数。
在这里插入图片描述
其实你应该已经发现其中的规律了。除了计数为0和为1的bigram之外,held-out set中的平均计数值,都大约相当于training set中的计数值减去0.75。

基于上面这个实验结果所诱发的直觉,Absolute discounting 会从每一个计数中减去一个(绝对的)数值 d。这样做的道理就在于,对于出现次数比较多的计数我们其实已经得到了一个相对比较好的估计,那么当我们从这个计数值中减去一个较小的数值 d 后应该影响不大。上面的实验结果暗示在实践中,我们通常会对从2到9的计数进行处理。

在这里插入图片描述

Kneser-Ney Smoothing

这种算法目前是一种标准的,而且是非常先进的平滑算法,它其实相当于是前面讲过的几种算法的综合。由于这个算法比较复杂,我们从一个直观上的例子来开始。

假设我们使用 bigram 和 unigram 的插值模型来预测下面这个句子中空缺的一个词该填什么

  • I used to eat Chinese food with ______ instead of knife and fork.

直觉上你一定能猜到这个地方应该填 chopsticks(筷子)。但是有一种情况是训练语料库中,Zealand 这个词出现的频率非常高,因为 New Zealand 是语料库中高频词。如果你采用标准的 unigram 模型,那么显然 Zealand 会比 chopsticks 具有更高的权重,所以最终计算机会选择Zealand这个词(而非chopsticks)填入上面的空格,尽管这个结果看起来相当不合理。这其实就暗示我们应该调整一下策略,最好仅当前一个词是 New 时,我们才给 Zealand 赋一个较高的权值,否则尽管在语料库中 Zealand 也是高频词,但我们并不打算单独使用它。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们前面提到Kneser-Ney Smoothing 是当前一个标准的、广泛采用的、先进的平滑算法。这里我们所说的先进的平滑算法,其实是包含了其他以 Kneser-Ney 为基础改进、衍生而来的算法。其中,效果最好的Kneser-Ney Smoothing 算法是由Chen & Goodman(1998)提出的modified Kneser-Ney Smoothing 算法。很多NLP的开发包和算法库中提供有原始的Kneser-Ney Smoothing(也就是我们前面介绍的),以及modified Kneser-Ney Smoothing 算法的实现。有兴趣的读者可以查阅相关资料以了解更多。

参考:https://blog.csdn.net/baimafujinji/article/details/51297802

猜你喜欢

转载自blog.csdn.net/zyq11223/article/details/90209782