也即产生第i
个词的概率是由已经产生的i-1
个词w1w2…w(i-1)
决定的,这i-1
个词被称为第i
个词的历史,随着历史长度的增加,不同历史数目按指数级增长,这会导致我们根本无法在训练数据中对参数进行估计。
所以我们假定,出现在第i
个位置上的词wi
仅与它前面的n-1个历史词有关,n取多少,我们就称其为几元文法模型,一般来讲,我们一般取n<=3来避免前面的自由参数过多的问题。
当n=1时,被称为一元文法模型(unigram或uni-gram或monogram),也即出现于第i
位的词独立于历史,在《浅谈机器学习基础》中朴素贝叶斯算法中的朴素假设,实际上就是一元文法模型。
当n=2时,被称为二元文法模型(bigram或bi-gram),即出现在第i
位的词只与它前面第一个历史词有关,二元文法模型又被称为一阶马尔可夫链。
三元文法模型被称为二阶马尔可夫链,记作trigram或tri-gram。
用于构建语言模型的文本被称为训练语料(training corpus)。训练语料的规模一般要有几百万个词。举个例子,我们通过训练语料计算出p(a|<BOS>)、p(b|a)、p(c|b)、p(d|c)、p(<EOS>|d)
,那我们自然就能得到句子a b c d
的出现概率为上面的概率依次相乘。<BOS>
为句首标志,<EOS>
为句尾标志。上面的例子是bigram的,《浅谈机器学习基础》中的朴素贝叶斯算法给出了unigram下的计算方法,都是大同小异。
接下来是如何评价一个语言模型的性能。
首先,我们需要一个用于评价语言模型性能的测试集,然后按照上面的方法,我们计算测试集中每个句子的生成概率,然后将它们全部乘起来,即得到该测试集的生成概率,测试集的生成概率越大,则语言模型的效果越好。
当然我们也可以通过前面提到的交叉熵和困惑度作为评价语言模型性能的测度,交叉熵与困惑度越小越好,具体的计算方法比较复杂,这里不讲。
然后是数据平滑问题。
我们前面说了,我们要根据训练语料来计算词的出现概率,进而计算句子的生成概率,但是这样就有一个问题,如果我们的训练语料不那么全怎么办?
这样就会导致比如某一个概率p(b|a)
为0,因为训练语料中没有出现过这样的词,但是p(b|a)
真的应该为0吗,带a b
的句子真的永远不会出现吗?显然不是的,只是概率小而已,但不应该为0。
所以我们需要进行数据平滑,为这些在训练语料中没有出现过的词分配一些概率,使其不为0。但因为总概率还要保持为1的,所以我们选择降低略微降低高概率词的概率来留出一部分概率分配给这些没在训练语料中出现过的词。
首先我们介绍一种经典的平滑方法,即古德-图灵(Good-Turing)估计法。
nr
和n(r+1)
的意思是训练语料中出现r
及r+1
次的词的个数。r
和r+1
自然就是它们在训练语料中实际出现的次数了。