N-gram算法

n-gram模型是一种统计语言模型。在语音识别中,一个声学信号对应于一个语句,语音识别器需要找到其对应的可能性最大的语言文本。首先该模型基于这样一种假设,第N个词的出现只与前面N-1个词相关,而与其它任何词都不相关,整句的概率就是各个词出现概率的乘积。这些概率可以通过直接从语料中统计N个词同时出现的次数得到。我们先来看一个香农游戏(Shannon Game):给定前n-1个词(或者字母),预测下一个词(字母)。我们知道,信源以概率p(T)生成语句文本,信道以概率p(O|T)生成语句文本。我们可以通过查询预料来得到不同词序列的概率。这就是n-gram模型的主要思想。

那么我们如何计算一个句子T出现的概率呢?假设T是由词序列W1,W2,W3,…Wn组成的,那么(T)=P(W1W2W3Wn)=P(W1)P(W2|W1)P(W3|W1W2)…P(Wn|W1W2…Wn-1).但是这种计算方法有两个缺陷:第一参数空间太大,想要计算出一个句子出现的概率需要很多参数;第二无法克服数据系数问题,即如果数据不太紧凑前后联系不太紧密的话误差很大。则我们考虑到我们之前的假设:第N个词的出现只与前面N-1个词相关,而与其它任何词都不相关(称为马尔科夫假设)。例如我们假设下一个词的出现依赖于它的前一个词,我们称之为bigram


假设下一个词的出现依赖于它前面的两个词,我们称之为trigram,则

   

………………

在实践中用的最多的就是bigram和trigram了,而且效果很不错。高于四元的用的很少,因为训练它需要更庞大的语料,而且数据稀疏严重,时间复杂度高,精度却提高的不多。

   那么我们怎么得到P(Wn|W1W2…Wn-1)呢?一种简单的估计方法就是最大似然估计(Maximum Likelihood Estimate)了。即P(Wn|W1W2…Wn-1) = (C(W1 W2…Wn))/(C(W1 W2…Wn-1))

剩下的工作就是在训练语料库中数数儿了,即统计序列C(W1 W2…Wn) 出现的次数和C(W1 W2…Wn-1)出现的次数。

               下面我们用bigram举个例子。假设语料库总词数为13,748 

                       

   

   P(I want to eat Chinese food)
=P(I)*P(want|I)*P(to|want)*P(eat|to)*P(Chinese|eat)*P(food|Chinese)
=0.25*1087/3437*786/1215*860/3256*19/938*120/213
=0.000154171                                                                                                                                                                                               

 

    ps:网上很多资料中,表1,词与词频的张表是没有的,所以造成文章表意不清。

     这里还有一个问题要说,那就是数据稀疏问题了,假设词表中有20000个词,如果是bigram那么可能的N-gram就有400000000个,如果是trigram,那么可能的N-gram就有8000000000000个!那么对于其中的很多词对的组合,在语料库中都没有出现,根据最大似然估计得到的概率将会是0,这会造成很大的麻烦,在算句子的概率时一旦其中的某项为0,那么整个句子的概率就会为0,最后的结果是,我们的模型只能算可怜兮兮的几个句子,而大部分的句子算得的概率是0. 因此,我们要进行数据平滑(data Smoothing),数据平滑的目的有两个:一个是使所有的N-gram概率之和为1,使所有的N-gram概率都不为0.有关数据平滑的详细内容后面会再讲到,这里不再赘述。

 

   了解了噪声信道模型和N-gram模型的思想之后,其实我们自己就能实现一个音词转换系统了,它是整句智能输入法的核心,其实我们不难猜到,搜狗拼音和微软拼音的主要思想就是N-gram模型的,不过在里面多加入了一些语言学规则而已。



你可能感兴趣的:(算法)