语言模型(LanguageModel,LM)在自然语言处理中占有十分重要的地位,尤其在基于统计的语音识别、机器翻译、分词和query纠错等相关应用中有着广泛的应用。目前主要采用的是n元语法模型(n-grammodel)。笔者在工作用中应用到了query改写和query的纠错,均起到了不错的应用效果,本文将从一下几点介绍n-gram语言模型。
n-gram语言模型基本概念n-gram语言模型的工具—kenlmn-gram语言模型的应用一、n-gram语言模型基本概念1.1、n-gram概念语言模型通常是一句话或者一个词
的概念分布
,这里
试图反映的是
出现的概率。例如,一个人说话的每
个句子中大约有
句是“这个需求什么时候上线?”(大概是产品经理??),则可以认为:
这个需求什么时候上线
而对于句子“这个需求马上上线!”(大概是程序员??),几乎没有程序员说这样的话,我们认为程序员说这句话的概率为
。所以需要注意的是,语言模型与句子是否合法是没有相关性的,即使一个句子符合语法逻辑,我们仍然可以认为它出现的概率为
,这个概率和你训练模型的数据是相关的。对于由
个词(这个词可以是字、词或短语等)组成的句子
,其概率计算公式为:
1.2、n-gram的产生上式中,产生第
个词的概率由已经产生的
个词
序列(称作history)决定的。这种方法计算概率有一个弊端,如果history的长度为
,那么就有
种不同的history(
为词表的长度),我们要计算所有
种不同history情况下产生第
个词的概率,这样的情况下,模型中就有
个自由参数
,假设
,
自由参数的数目就是
亿个,这对于我们训练模型和应用模型来说是几乎不可能实现的。为了解决这个问题,可以将history
序列按照某种法则映射到等价类
,而等价类的数目远远小于不同history的数目,假定:
那么,自由参数的数目将会大大减少。有很多种方法可以将history划分为等价类,一种比较实际的做法是,将两个history
序列和
映射到同一个等价类,当且仅当这两个history最近的
(
)个词相同,即如果
,当且仅当
。满足以上条件的语言模型称为
元语法或者
元文法(n-gram)。通常情况下,
的取值不能太大,否则等价类太多,自由参数过多的问题仍然不能解决,因此在实际应用中,
取值为
的情况较多。
当时,即出现在第
位上出现的词
独立于history。一元文法计作unigram或者uni-gram。当
时,即出现在第
位上出现的词
仅与前面一个history词
有关。二元文法计作bigram或者bi-gram。当
时,即出现在第
位上出现的词
仅与前面两个history词
有关。三元文法计作trigram或者tri-gram。1.3、n-gram计算示例
以二元语法模型为例,根据前面的解释,我们可以近似地认为,一个词的概率只依赖于它前面的一个词,那么,
另外,有两点值得注意:
为了使得对于
有意义,在句子的开头加上句首标记$,即假设w_{0}就是$。为了使得所有句子的概率之和
等于1,需要在句子结尾加上一个句尾标记$$,并包含在概率计算公式(5-3)的乘积中。
例如,我们计算概率
我爱工作
,可以这样计算:
$$\begin{align}p(我爱读书)=p(我)p(爱
我)p(读
爱)p(书
读)p(
书)\nonumber\end{align}$$
为了估计
条件概率,可以简单的计算二元语法
在训练语料中出现的概率,然后归一化。如果用
表示二元语法
在给定文本中出现的次数,我们采用最大似然估计计算条件概率的公式如下:
对于
的
元语法模型,条件概率中要考虑前面
个词的概率,为了使得公式(1.8)对于
成立,取:
其中,
表示词
,那么
到
为$,w_{m+1}为$。同样的用最大似然估计计算条件概率:
具体的计算实例可以参考宗成庆老师著《统计自然语言处理(第2版)》
二、n-gram语言模型的工具—kenlm限于篇幅,这里我们仅仅介绍如何安装和使用kenlm,详细信息参考kenlm