
2.2 n-gram统计语言模型
2.2.1 何为n-gram模型
n-gram,即n元组表示法,是一种基于统计的语言模型算法。其基本思想是将一个长文档的内容按照大小为n的窗口进行截取,形成长度为n的词序列。每一个词序列可被称为一个gram。不同的gram代表特征向量中不同的维度,所有的gram组成整个长文档的特征空间。换句话说,n-gram是通过将文本拆分成长度为n的词序列来建立概率模型,通过计算每个gram出现的频率,来预测下一个词或句子的概率。n-gram模型广泛应用于文本分类、机器翻译、语音识别、信息检索等自然语言处理领域。
n-gram统计语言模型常常用于评估词序列是否合理。比方说,给定一个句子“这是一个句子”,那么依据一元(unigram)统计语言模型,则gram为“这、是、一、个、句、子”,特征维度为6。如果依据二元(bigram)统计语言模型,gram为“这是、是一、一个、个句、句子”,其特征维度为5。不同的gram组成特征向量中的不同特征维度。
2.2.2 n-gram语言模型评估词序列
相比于式(2.2),n-gram提供了更加简单的建模语言的方法。对于任意长度的一个语句,可引入马尔可夫假设(Markov assumption)[2],即假设当前词出现的概率只依赖于前n-1个词,可得到P(wi|w1,…,wi-1)≈P(wi|wi-n-1,…,wi-1)。根据上述表达式,n-gram语言模型可定义为

当n>1时,为使句首词的条件概率有意义,需要给原始的词序列上加入一个或多个起始符,通过起始符来对句首词出现的概率进行表征。以trigram语言模型为例,它使用的是二阶马尔可夫假设,即。对于P(wi|wi-2,wi-1),与上述通过语言模型的计算方式类似,可通过计算词块出现的次数来求得概率:

式中,c(wi-2,wi-1,wi)和c(wi-2,wi-1)分别表示词块(wi-2,wi-1,wi)和(wi-2,wi-1)在训练集中出现的次数。引入马尔可夫假设计算后验概率P,可以提高语言模型的泛化能力,再根据训练数据集对词块出现次数进行计算,最终可求得后验概率。
2.2.3 n-gram统计语言模型的应用
在使用各种搜索引擎如Google或百度时,在输入某个关键词后,搜索引擎会根据关键词进行猜想或者提示,出现图2.1所示的多个备选查询目标。这些备选查询目标就是根据所输入的关键词进行下文预测的结果。
图2.1的排序结果可通过n-gram语言模型得到。假设通过二元语言模型对“自然语言”这一词块进行下一个词的预测,通过该结果可推测出语言模型的概率计算结果为P(分析|自然语言)>P(生成|自然语言)>…>P(是什么|自然语言),从而按概率大小的顺序返回搜索结果的提示。类似地,输入法中的自动联想功能也是应用了语言模型的原理。
2.2.4 n-gram模型中n对性能的影响
当n更大时,整个词块中的词数越多,对下一个词的出现约束性越强,有更强的语义表达能力。但会使n-gram总数大幅增加,特征维度变大,从而变得更加复杂和计算密集,语义表示更加稀疏。

图2.1 Google上对于关键词“自然语言”的搜索结果
当n更小时,每个gram在训练语料库中出现的次数会增多,语言模型可以获得更可靠的统计结果。但由于每个gram中的词数减少,约束信息更少。表2.1展示n的大小对n-gram个数的影响。
表2.1 词表中词的个数为20000词下,不同n对应的n-gram个数

此处以语料“我爱自然语言处理”为例。它的词汇表中只包含三个词,即“我”“爱”“自然语言处理”。如果采用bigram语言模型,那么gram的个数为32=9个;如果采用trigram语言模型,那么gram的个数为33=27个。可以看到,随着n的增大,gram的个数呈指数上升。
上文提到,n-gram模型中的每一个不同的gram(wi|wi-n-1,…,wi-1)都代表模型中的一个参数,可视为特征向量的不同维度。由于gram个数随着指数的增加而快速增加,大量的参数在训练集中从未出现过,也就是说,c(wi|wi-n-1,…,wi-1)=0。这导致在预测时,很多句子的概率被预测为0。目前,已有大量的研究工作对该情况进行探索,其中最简单的方法是将所有词组的出现次数加1以做平滑处理。
2.2.5 n-gram模型小结
n-gram缺乏长期依赖,只能建模到前n-1个词。随着n的增大,词的量急剧增大,参数空间(特征向量维度)呈指数爆炸,容易出现数据稀疏的问题。并且由于只对训练语料进行词块频次上的统计,尽管可以使得学习过程简单高效,但泛化能力较差,依然没有能够处理字词之间的关系问题。
但总体而言,n-gram能够对语义进行很好的表示,这是因为n-gram统计语言模型采用极大似然估计法,有数学理论作为支撑,且参数易训练,与此同时,根据窗口的大小,gram包含前n-1个词的全部信息,增加了前后文信息,考虑了文本字词之间的顺序问题,能够对语义进行很好的表示。进一步地,n-gram模型的可解释性强,直观易理解。所以,n-gram被广泛使用。下一章将介绍使用深度神经网络来建模的语言模型,它可以捕捉到更长的上下文信息以及更深层次的语义,是现代自然语言处理广泛使用的建模语言模型。