假设现在语料库的词汇量为,对于长度为
的句子来说:
通过上面的表格可以看出,增加条件概率中的条件相对应的参数数量会呈现指数的增长。参数的数量越多表示模型相对越复杂。如果我们想要减少参数,最简单的方法就是简化模型,考虑极端情况下只保留,此时计算句子的概率公式为:
依然使用上面我们自己构建的小型语料库:
商品 和 服务
商品 和服 物美价廉
服务 和 货币
如果想要计算p(BOS 商品 和 服务 EOS)的概率,只需要计算出p(BOS)、p(商品)、p(和)、p(服务)以及p(EOS)的五个概率值(依然使用最大似然估计来计算这些概率值):
- p(BOS) = c(BOS) / 所有单词作为第一个词出现次数 =
= 1
- p(商品) = c(商品) / 所有单词出现的次数 =
;
- p(和) = c(和) / 所有单词出现的次数 =
;
- p(服务) = c(服务) / 所有单词出现的次数 =
;
- p(EOS) = c(EOS) / 所有单词作为最后一个单词出现次数 =
= 1;
因此p(商品 和 服务) = p(BOS) p(商品)
p(和)
p(服务)
p(EOS) =
=
。
不使用条件概率使用认为当前单词出现的概率仅仅本身相关,我们称之为unigram,即一元语言模型。从
个参数缩减到了拥有
个参数的一元语言模型,显然模型太简单了。比如对于下面两个句子:
我 打 篮球
我 打 游泳
如果使用一元语言模型来这两个句子的概率值。
- p(我 打 篮球) = p(BOS)
p(我)
p(打)
p(篮球)
p(EOS);
- p(我 打 游泳) = p(BOS)
p(我)
p(打)
p(游泳)
p(EOS);
通过一元语言模型计算两个句子主要区别就在于p(篮球)和p(游泳)的概率值,其余概率值都是相同的,但是就两句话而言,"我 打 篮球"这句话要比"我 打 游泳"这句话的概率值要高很多。由于简化了模型,仅仅考虑当前单词的出现概率与本身有关,单词与单词之间是相互独立的。不过就上面两个句子而言,p(篮球 | 打) 要比p(游泳 | 打)的概率值要高,此时仅仅考虑当前单词自身的一元语言模型太简单了。
假设当前单词的出现概率仅仅与前面的1个单词相关,我们称之为bigram,即二元语言模型。二元语言模型的计算公式:
假设当前单词的出现概率仅仅与前面的2个单词相关,我们称之为trigram,即三元语言模型。三元语言模型的计算公式:
以此类推,假设当前单词的出现概率仅仅与前面的个单词相关,我们称之为n-gram语言模型。这种减少参数简化模型的假设方法就是马尔科夫假设。
|
名称 | 含义 |
---|---|---|
1 | unigram | 当前单词出现的概率仅仅与自身相关 |
2 | bigram | 当前单词出现的概率仅仅与前面的1个单词相关 |
3 | trigram | 当前单词出现的概率仅仅与前2个单词相关 |
... | ... | ... |
n | n-gram | 当前单词出现的概率仅仅与前n-1个单词相关 |
随着的取值越大,n-gram模型在理论上越精确,但是也越复杂,需要的计算量和训练语料数据量也就越大,并且精度提升的不够明显,所以在实际的任务中很少使用
的语言模型。
无论是原始的语言模型还是n-gram语言模型,都是使用极大似然估计法来估计概率值,通过统计频次来近似概率值,统计频次极有可能统计不到较长句子的频次。
- 如果分子为0,估计的概率值为0,由于连乘的方式会导致最终计算出句子的概率值为0;
- 如果分母为0,分母为0,计算的公式将没有任何意义;
这被称为数据稀疏,对于n-gram语言模型来说,n越大,数据稀疏的问题越严重。即使是使用n相对比较小的二元语言模型,许多二元靠语料库也是统计不到的。比如对于下面这个小型的语料库:
商品 和 服务
商品 和服 物美价廉
服务 和 货币
"商品 货币"的频次就为0,当n-gram语言模型中的n越小,可统计的n元也就越丰富,一个很自然的解决方案就是利用低阶n元语法平滑到高阶n元语法。所谓的平滑就是字面上的意思:使n元语法频次的折线平滑为曲线。我们不希望二元语法"商品 货币"的频次突然跌倒0,因此使用一元语法"商品"和("或",不同的平滑方法可能需要不同的处理)"货币"的频次去平滑它。
平滑策略是语言模型的研究课题之一,人们提出了很多平滑技术,比如线性差值法(linear interpolation)、图灵平滑(Good-Turing)、加法平滑(Add-One Smoothing)等。
原文地址:
通俗理解n-gram语言模型