NLP入门之N元语法模型

在上边咱们知道其实当今的天然语言处理的主流趋势是统计天然语言处理,而统计天然语言处理的基本目的就是结合语料库中的一些数据对于某些未知的数据进行处理,从而根据这些数据分布获得一些推论,你们想想,咱们在语料库里发现”你”和”吃饭了么”这两个词老是存在着一些附着关系,是否是咱们就有预测在一些未知的文章中也会有这样附着关系?
算法

在这一篇文章中,咱们将会介绍下n元语法模型和解决由于数据缺少的状况下引入的几种经常使用的平滑度算法,学习

1:n元语法模型3d

n元语法模型的基本的公式能够看做为下面的几率公式P:cdn

这个公式所表示的含义实际上是在产生第i个词的几率是由前边已经产生的从w1到wi-1的这个词几率来决定的,在这样的一个过程当中,咱们使用了先前词,也就是经过用先前词来去预测下一个将要出现的词,而后咱们根据大量的文本观测,咱们会知道这个词会不会愈来愈趋向于在这些词的后面.好比上边举例的”你””吃饭了么”,如今假设咱们的文本中有1000句话,如今你吃饭了么出现了20次,这样的话咱们就会获得相应的出现这个词的几率P(吃饭了么)=(20/1000)=(1/50).blog

固然,在实际的任务中没有那么多实际的文本历史供咱们参考,不少时候出现的词或者句子咱们以前都没有见过,这样的话咱们之前的经验就没有办法预测了,好比:咱们遇到了一个句子:”你吃饭不吃饭?”,这样的话就跟”你吃饭了么”在前半部分是同样,可是后边却有一个不同的结尾.那要怎么解决这个问题呢?是否是把之前的文本出现过的历史组合进行总结,而后进行学习,对于预期将要出现的词,会不会出现一个合理的预测呢?事件

这样的组合文本历史的可能出现的方法就是咱们常说的马尔科夫假设,这个假设其实说的就是上边所对应的问题,这个假设说的其实就是认为接下来要出现的词是由前边出现的词来影响的.若是按照上边的公式来讲,由于前边是由i-1个词语,那么若是咱们构造一个模型的话,全部的历史其实就是前边的i-1个词,这样的话咱们构造的模型就成为(n-1)阶马尔科夫模型,或者说n元语法模型(由于咱们要预测第n个词).it

这里要说一下这个n的取值问题,通常状况下咱们是不能把这个n取值过大的,要是过大的话,确定会有不少的等价类,太多的自由参数未必是一件好事(其实把数据划分红多个等价类有利有弊,一方面若是咱们把数据分割成多个类的话其实可让咱们有更多的辨别性,可是要是使用了太多的等价类,那么对于每一个类别来讲,他的训练数据很小,甚至有些部分没有训练数据,这样的话再去作目标特征的统计估计这时候就很不许确了,因此这时候如何去权衡,找到一个合适的类别数,是咱们的一个探索目标.)那么这时候咱们再去看看n的取值问题,通常状况下大多数经常使用的n的取值是n=2,3,4的状况,这个时候分别称为bigram(二元语法),trigram(三元语法),fourgram(四元语法).io

如今假设一个说话者的使用词有20000个,那么参数的数量以下图所示:class

从这个图上咱们看到,到四元语法模型就已经拥有很是巨大的参数了,因此构造更多的语法模型显然是不现实的.语法

2:构建n元语法模型

1;一般构建模型的第一步是处理语料

首先咱们须要对语料进行处理,由于根据n元语法要求,一个词的几率只跟前边的词的几率有关,由于要使全部的几率之和为1,所以咱们要在句首和句尾加上一个句首标记和句尾标记,这样的话咱们就能够计算,下边举一个例子:

p(I Love You)

在这样处理完句子以后,若是咱们获得了一个肯定的语料库,若是如今一个词出现了10次,好比:”good”后面有8次跟着”morning”,1次”boy”,一次”girl”,那么估计下一个词,咱们会出现哪种几率呢?

其实咱们能够考虑使用相对几率来估计:

P(morning)=0.8

P(girl)=0.1

P(boy)=0.1

P(other)=0(other不属于上述三个词汇)

这样归类以后,去给这些数据计算他们的几率了,再去归一化,这样就能够计算出来:

在这里咱们去用C(w1.......wn)来表示n元语法在给定文本中出现的次数,这样的话咱们就有下边的计算公式:

像这样的估计的处理方式,咱们叫作p(wn|w1.........wn-1)的最大似然估计(MLF)

之因此称为最大似然估计,是由于他选择的参数相对于训练数据给出了最高的几率(知足了正常随机约束),可是其实我在上网搜这个问题的时候,不少人说MLF是不太适合天然语言处理的,由于自己咱们的语料库规模会很大,咱们的数据会很稀疏,而且像上边那样的经常使用词几率这么高的状况是很是理想的状态,大部分词都是不经常使用的,那么这样就会出现一个问题,若是一个n元组正好在判别时没有了训练语料出现时,这时候的几率就会不好,就跟上边的词,good后边还能够跟不少的词,可是最大似然估计并不会认为会有其余的词跟在这个good后边.

那么应该怎么去解决这个问题,这个时候咱们就会想应该要有一种更好的估计方法,要是可以判别出在训练数据中没有出现的事件,而且可以给出必定的几率,这时候一些研究者给出了更好方法:

若是能够经过稍微减小已经观察到的事件几率的大小,而且能够把少许的几率分配到没有看到过的事件上,这时候每件事件都会发生而且可能有效的工做,这个就是咱们常说的折扣法,折扣的过程就叫作平滑(这难道是由于没有0值分布会比有0值分布更平滑?)

那么咱们应该如何进行平滑,平滑的经常使用方式有几种,在下一篇文章中咱们将讲述下几种经常使用的数据平滑方法.

初学NLP,不足之处请各位多多批评指正,在此谢过!

相关文章
相关标签/搜索