通俗理解n-gram语言模型
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通俗理解n-gram语言模型相关的知识,希望对你有一定的参考价值。
参考技术A假设现在语料库的词汇量为 ,对于长度为 的句子来说:
通过上面的表格可以看出,增加条件概率中的条件相对应的参数数量会呈现指数的增长。参数的数量越多表示模型相对越复杂。如果我们想要减少参数,最简单的方法就是简化模型,考虑极端情况下只保留 ,此时计算句子的概率公式为:
依然使用上面我们自己构建的小型语料库:
如果想要计算p(BOS 商品 和 服务 EOS)的概率,只需要计算出p(BOS)、p(商品)、p(和)、p(服务)以及p(EOS)的五个概率值(依然使用最大似然估计来计算这些概率值):
因此p(商品 和 服务) = p(BOS) p(商品) p(和) p(服务) p(EOS) = = 。
不使用条件概率使用 认为当前单词出现的概率仅仅本身相关, 我们称之为unigram,即一元语言模型。从 个参数缩减到了拥有 个参数的一元语言模型,显然模型太简单了。比如对于下面两个句子:
如果使用一元语言模型来这两个句子的概率值。
通过一元语言模型计算两个句子主要区别就在于p(篮球)和p(游泳)的概率值,其余概率值都是相同的,但是就两句话而言,"我 打 篮球"这句话要比"我 打 游泳"这句话的概率值要高很多。由于简化了模型,仅仅考虑当前单词的出现概率与本身有关,单词与单词之间是相互独立的。不过就上面两个句子而言,p(篮球 | 打) 要比p(游泳 | 打)的概率值要高,此时仅仅考虑当前单词自身的一元语言模型太简单了。
假设当前单词的出现概率仅仅与前面的1个单词相关, 我们称之为bigram,即二元语言模型。二元语言模型的计算公式:
假设当前单词的出现概率仅仅与前面的2个单词相关, 我们称之为trigram,即三元语言模型。三元语言模型的计算公式:
以此类推,假设当前单词的出现概率仅仅与前面的 个单词相关,我们称之为n-gram语言模型。这种减少参数简化模型的假设方法就是马尔科夫假设。
随着 的取值越大,n-gram模型在理论上越精确,但是也越复杂,需要的计算量和训练语料数据量也就越大,并且精度提升的不够明显,所以在实际的任务中很少使用 的语言模型。
无论是原始的语言模型还是n-gram语言模型,都是使用极大似然估计法来估计概率值,通过统计频次来近似概率值,统计频次极有可能统计不到较长句子的频次。
这被称为数据稀疏,对于n-gram语言模型来说,n越大,数据稀疏的问题越严重。即使是使用n相对比较小的二元语言模型,许多二元靠语料库也是统计不到的。比如对于下面这个小型的语料库:
"商品 货币"的频次就为0,当n-gram语言模型中的n越小,可统计的n元也就越丰富,一个很自然的解决方案就是利用低阶n元语法平滑到高阶n元语法。所谓的平滑就是字面上的意思:使n元语法频次的折线平滑为曲线。我们不希望二元语法"商品 货币"的频次突然跌倒0,因此使用一元语法"商品"和("或",不同的平滑方法可能需要不同的处理)"货币"的频次去平滑它。
平滑策略是语言模型的研究课题之一,人们提出了很多平滑技术,比如线性差值法(linear interpolation)、图灵平滑(Good-Turing)、加法平滑(Add-One Smoothing)等。
原文地址:
通俗理解n-gram语言模型
通俗理解N-gram语言模型。(转)
N-gram语言模型
考虑一个语音识别系统,假设用户说了这么一句话:“I have a gun”,因为发音的相似,该语音识别系统发现如下几句话都是可能的候选:1、I have a gun. 2、I have a gull. 3、I have a gub. 那么问题来了,到底哪一个是正确答案呢?
一般的解决方法是采用统计的方法。即比较上面的1、2和3这三句话哪一句在英语中出现的概率最高,哪句概率最高就把哪句返回给用户。那么如何计算一个句子出现的概率呢?说白了就是“数数”的方法。但是即使是“数数”也有很多种数法,其中,最简单的策略如下:
给定一个语料库,数出其中所有的长度为4的句子的个数,设为N,然后再看在这N个长度为4的句子中,“I have a gun”出现了多少次,不妨设为N0,那么句子“I have a gun”的概率就是N0/N。其它两个句子的概率也这么计算。
上述的这种数数方法,从逻辑上讲是完全OK的,但是因为自然语言的灵活多变性,以及语料库的规模总是有限的,对于一个稍长一点的句子,很可能语料库中根本就没有。比如说下面这个句子:“I am looking for a restaurant to eat breakfast”,直观上看,这句话在语料库中应该出现次数很多吧?但是如果把这句话输入到Google的搜索框中,点击搜索,你会发现返回的结果中根本就没有完全匹配上的。所以,我们需要提出更加有效的“数数”方法。
为了把事情说清楚,需要引入一些简单的数学符号。
2、链式规则:P(w1, w2, w3, … , wn)=P(w1)P(w2|w1)P(w3|w1w2)P(w4|w1w2w3)…P(wn|w1w2…wn-1)
好了,我们想要计算“I have a gun”的概率,也就是计算P(I,have,a,gun),按照链式规则,则有:
P(I,have,a,gun)=P(I)P(have|I)P(a|I,have)P(gun|I,have,a)
但是事情并没有得到简化,例如要计算P(gun|I,have,a),按照条件概率公式展开:
P(gun|I,have,a) = P(I,have,a,gun)/P(I,have,a)
发现了什么?为了计算P(gun|I,have,a),我们需要先计算P(I,have,a,gun)和P(I,have,a)。哎?P(I,have,a,gun)不就是我们一开始想要计算的值吗?所以绕了一圈,我们又回到了原地?
好了,现在我们来整理一下思路。
对于一个句子,其可以表示为一个word序列:w1, w2, w3, … , wn。我们现在想要计算句子出现的概率,也就是计算P(w1, w2, w3, … , wn)。这个概率我们可以直接用数数的方法求解,但是效果并不好,所以我们利用链式规则,把计算P(w1, w2, w3, … , wn)转化为计算一系列的乘积:P(w1)P(w2|w1)P(w3|w1w2)P(w4|w1w2w3)…P(wn|w1w2…wn-1)。但是转化之后,问题并没有变得简单。怎么办?
N-gram这时候就派上用场了。
对于1-gram,其假设是P(wn|w1w2…wn-1)≈P(wn|wn-1)
对于2-gram,其假设是P(wn|w1w2…wn-1)≈P(wn|wn-1,wn-2)
对于3-gram,其假设是P(wn|w1w2…wn-1)≈P(wn|wn-1,wn-2,wn-3)
依次类推。
所以:
在1-gram模型下:
P(w1, w2, w3, … , wn)=P(w1)P(w2|w1)P(w3|w1w2)P(w4|w1w2w3)…P(wn|w1w2…wn-1)
≈P(w1)P(w2|w1)P(w3|w2)P(w4|w3)…P(wn|wn-1)
在2-gram模型下:
P(w1, w2, w3, … , wn)=P(w1)P(w2|w1)P(w3|w1w2)P(w4|w1w2w3)…P(wn|w1w2…wn-1)
≈P(w1)P(w2|w1)P(w3|w1w2)P(w4|w2w3)…P(wn|wn-2wn-1)
在3-gram模型下:
P(w1, w2, w3, … , wn)=P(w1)P(w2|w1)P(w3|w1w2)P(w4|w1w2w3)…P(wn|w1w2…wn-1)
≈P(w1)P(w2|w1)P(w3|w1w2)P(w4|w1w2w3)…P(wn|wn-3wn-2wn-1)
假设我们采用的是1-gram模型,那么:
P(I,have,a,gun)=P(I)P(have|I)P(a|have)P(gun|a).
然后,我们再用“数数”的方法求P(I)和其他的三个条件概率:
P(I)=语料库中I出现的次数 / 语料库中的总词数
P(have|I) = 语料库中I和have一起出现的次数 / 语料库中I出现的次数。
总结,本文只是对N-gram做了非常简单的介绍,目的在于简单易懂,但是不够严谨。感兴趣的同学可以进一步查阅相关的资料。在任何一本关于自然语言处理的书上都能够找到N-gram的内容。
以上是关于通俗理解n-gram语言模型的主要内容,如果未能解决你的问题,请参考以下文章
大道至简浅谈自然语言处理(NLP)学习路线:N-Gram模型,一文带你理解N-Gram语言模型