N-Gram 模型

如果语料足够大,比如互联网,你可以利用算式2-2进行计算并且估计出概率值。利用这种直接用词频统计的方法来估计概率值对某些例子可以取得较好的效果,然而即使用互联网这么庞大的语料库对另一些例子也不能很好的估计。因为语言是具有创造性的,它会不停地被创造出来,我们也总是没法覆盖所有的语料。另外对例子的简单扩展也可能在网上找不到任何例子, 比如”王小二/想/去/公园”,导致统计次数为零。

同样的,如果我们想计算整个序列的概率如“想/去/公园”,就需要知道所有含有三个词的序列中有多少是“想/去/公园”这样的序列,这样可以将“想/去/公园”的序列数目除以所有含有三个词的序列数目得到概率,这样感觉也很困难。因此引入了一个比较聪明的办法来估计序列W的概率。将n个单词 表示为 ,我们用 来表示 的联合概率。现在我们开始计算  ,可以使用链式法则进行分解:

(2-3)     

应用链式法则得到如下:

(2-4)     

从链式法则可以看出计算序列的联合概率与给定前序词序列计算某一个词的条件概率之间的关系,算式2-4说明计算序列的联合概率可以将每个词的条件概率相乘得到,但是链式法则实际上好像也帮不上忙,因为在给定前序词序列的前提下我们不知道如何计算某一个词的条件概率值 。如前所述,不能通过计算跟在一个长序列后的词的出现次数来估计概率值,因为语言具有创造性,新的说法时刻都在产生,某种新的说法还可能从来都没有出现过。n-gram模型并不能计算整个前序词序列的概率,而只是计算最后几个词的近似概率。

Bigram模型仅仅计算条件概率值 ,来替代计算 。举前面的例子:

P(公园|想/去)      (2-5)

我们可以用

P(公园|去)     (2-6)

来近似估计。当我们用bigram模型来预测下一个词的条件概率时,我们在作如下的近似估计:

 (2-7)

某一个词的概率仅仅依赖于它前一个词的概率,这个假设称为马尔可夫(Markov)假设。马尔可夫模型是一种概率模型,假设我们不用回顾太远的历史就可以预测未来事件发生的概率。Bigram往前看一个词,Trigram往前看两个词,而N-Gram往前看n-1个词。

因此,采用n-gram估计一个词序列中下一个词概率的通用算式为:

(2-8)

结合算式2-4和2-7,计算整个词序列的算式可以转换为:

(2-9)        

那么如何来估计bigram或者n-gram概率呢?很容易想到的一种方法就是极大似然估计(maximum likelihood estimation),即从语料中获取要统计的词频,并将其归一化到(0,1)。

举例来说,给定词y的前序词x, 我们来计算bigram概率值,首先我们统计bigram的词频C(xy),然后将其除以以x开头的bigram词频总和进行归一化:

(2-10)

我们还可以对上式进行简化,因为以开头的所有bigram的总和与的unigram(即词频)值是相同的,  算式2-10可转换为:

(2-11)

让我们再看一个有三句话组成的小语料的例子。我们首先对每句话进行扩充,加上句首标记和句尾标记,为了能够让每个单词都有bigram的上下文,如下:

对这个小语料进行bigram概率统计如下:

n-gram的通用的极大似然估计算式如下:

(2-12)

算式2-12类似于算式2-11,通过将观察词序列的出现次数除以它的前缀次数获得。这个比率称为相对词频。通过相对词频来估计词序列概率是极大似然估计的一个例子。极大似然估计即在给定模型M的基础上极大近似地估计了训练集( )。举个例子,假设Chinese这个词在拥有一百万词的语料库(如布朗Brown语料库)里出现了400次。那么从其他也拥有一百万词的语料库随机挑选一个词为Chinese的概率是多少呢?极大似然估计的概率值为 或者0.0004。0.0004并不是Chinese这个词在所有情况下出现概率的最佳估计值,它可能可以说明在其他语料库或者上下文中Chinese这个词并不常用。但是这个概率值使得Chinese这个词在一个一百万词的语料中有极大的可能性会出现400次左右。

让我们再看个小例子,比上面仅仅只有3句话14个词的语料大一点。我们使用的例子来自已经失效的伯克利酒店项目中的语料,这个项目是基于加州伯克利地区的酒店数据库来回答酒店相关问题的一个问答系统。下面是一些用户提问的样本(总样本量为9332个句子,可以从网上获得):

图2-1显示了伯克利酒店项目中一个语料片段的bigram数目。图表中的大部分统计数据都为0,事实上我们选取得词样本都是在语境中彼此相邻的,如果我们随机选取词样本,统计数据将会变得更加稀疏。

图2-1 8个词样本bigram统计数目(伯克利酒店项目包含9332个句子,词样本数V=1446),统计数为0的单元格灰色表示。

图2-2 伯克利酒店项目8个词样本bigram概率值,概率值为0的单元格灰色表示。

图2-2显示了归一化后的bigram概率(即将图2-1中每个单元格的统计值除以unigram值),unigram取值如下:

一些其他有用的概率值如下:

现在我们可以统计将词的bigram概率值相乘来计算句子的概率值了。如“I want English food”或者“I want Chinese food”。算式如下:

             

如何计算“I want Chinese food”的概率值留给读者作为练习。那么我们从bigram模型中统计出了哪些语言现象呢?上述的bigram概率值提示了一些句法规则,比如eat后面跟名词或者形容词,to后面跟动词,还提示了一些人物活动的场景,如一些概率值较高的句子都是以I单词开始,还有一些更多的是给了文化上的提示如人们寻找Chinese Food比寻找English Food的概率值更高。

为了方便讲解,上文我们讲述了bigram模型,对于trigram和4-gram模型也都是通用的,trigam往前看2个词,4-gram往前看3个词。对于高维的n-gram模型,需要在句子的开头和结尾添加伪词作为第一个词或者最后一个词的上下文。举个例子,对于trigram模型来说,我们可以在句子开头添加两个伪词方便计算第一个词的概率值,如P(I|)。

我们喜欢用log的形式来表示语言模型的概率值,因为概率值总是小于或等于1的数,我们将越多的概率值相乘,那么我们得到的值就越小。将足够多的n-gram概率值相乘会带来下溢效应。用概率值的log值来替代,值就不会变的那么小。log空间上相加等同于概率值的相乘,所以我们将概率值取log相加。如果我们最终需要转换为实际的概率值,那么只要将log 空间进行指数转换得到,如下: