在上边我们知道其实当今的自然语言处理的主流趋势是统计自然语言处理,而统计自然语言处理的基本目的就是结合语料库中的一些数据对于某些未知的数据进行处理,从而根据这些数据分布得到一些推论,大家想一想,我们在语料库里发现”你”和”吃饭了么”这两个词总是存在着一些附着关系,是不是我们就有预测在一些未知的文章中也会有这样附着关系?
在这一篇文章中,我们将会介绍下n元语法模型和解决因为数据缺乏的情况下引入的几种常用的平滑度算法,
1:n元语法模型
n元语法模型的基本的公式可以看作为下面的概率公式P:
这个公式所表示的含义其实是在产生第i个词的概率是由前边已经产生的从w1到wi-1的这个词概率来决定的,在这样的一个过程中,我们使用了先前词,也就是通过用先前词来去预测下一个将要出现的词,然后我们根据大量的文本观测,我们会知道这个词会不会越来越趋向于在这些词的后面.比如上边举例的”你””吃饭了么”,现在假设我们的文本中有1000句话,现在你吃饭了么出现了20次,这样的话我们就会得到相应的出现这个词的概率P(吃饭了么)=(20/1000)=(1/50).
当然,在实际的任务中没有那么多实际的文本历史供我们参考,很多时候出现的词或者句子我们之前都没有见过,这样的话我们以前的经验就没有办法预测了,比如:我们遇到了一个句子:”你吃饭不吃饭?”,这样的话就跟”你吃饭了么”在前半部分是一样,但是后边却有一个不一样的结尾.那要怎么解决这个问题呢?是不是把以前的文本出现过的历史组合进行总结,然后进行学习,对于预期将要出现的词,会不会出现一个合理的预测呢?
这样的组合文本历史的可能出现的方法就是我们常说的马尔科夫假设,这个假设其实说的就是上边所对应的问题,这个假设说的其实就是认为接下来要出现的词是由前边出现的词来影响的.如果按照上边的公式来说,因为前边是由i-1个词语,那么如果我们构造一个模型的话,所有的历史其实就是前边的i-1个词,这样的话我们构造的模型就成为(n-1)阶马尔科夫模型,或者说n元语法模型(因为我们要预测第n个词).
这里要说一下这个n的取值问题,一般情况下我们是不能把这个n取值过大的,要是过大的话,肯定会有很多的等价类,太多的自由参数未必是一件好事(其实把数据划分成多个等价类有利有弊,一方面如果我们把数据分割成多个类的话其实可以让我们有更多的辨别性,但是要是使用了太多的等价类,那么对于每个类别来说,他的训练数据很小,甚至有些部分没有训练数据,这样的话再去做目标特征的统计估计这时候就很不准确了,所以这时候如何去权衡,找到一个合适的类别数,是我们的一个探索目标.)那么这时候我们再去看看n的取值问题,一般情况下大多数常用的n的取值是n=2,3,4的情况,这个时候分别称为bigram(二元语法),trigram(三元语法),fourgram(四元语法).
现在假设一个说话者的使用词有20000个,那么参数的数量如下图所示:
从这个图上我们看到,到四元语法模型就已经拥有非常巨大的参数了,所以构造更多的语法模型显然是不现实的.
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,不足之处请各位多多批评指正,在此谢过!