语言模型

N元模型(N元语法)是最常用的语言模型。设句子是单词序列[w1,w2,w3,…],则语言模型就是句子的概率分布:P(w1,w2,w3,…)。

N元模型认为,第n个词出现与前n-1个词相关,而与其他任何词不相关。因此N元模型可以表示为P(w1,w2,w3,…) = P(w1)P(w2|w1)P(w3|w1w2)…通过统计语料中的频数计算各条件概率。

但这个式子也不容易计算,越往后越难以统计,因此进一步简化:

2元模型只考虑前一个单词:P(w1,w2,w3,…) = P(w1)P(w2|w1)P(w3|w2)…如果考虑更多,就形成了3元,4元模型……不过还是2元和3元最常用,也被称为2阶、3阶马尔科夫链。为了保证概率和为1,一般还要把句首、句尾作为两个标记\<BOS>,\<EOS>考虑在内。

例如2元模型,设$w_{i-1}w_i$在训练语料中出现的次数为$c(w_{i-1}w_i)$,则使用极大似然估计计算$P(w_i|w_{i-1})$:

$$
P(w_i|w_{i-1})=\frac{c(w_{i-1}w_i)}{\sum_{w_i} c(w_{i-1}w_i)}
$$

但是N元模型有个问题,就是如果分子为0,那么即使一个句子没毛病,最后概率也是0。为了避免这个问题,需要对数据进行平滑。一种简单的平滑方法就是每个频数+1。数据平滑是语言模型中的核心问题。更多的平滑方法以后再分析。

输入法预测、搜索词补全、文本生成等领域都用到了N元模型。除了计算句子的概率外,N元模型还可以用在特征工程上:将各个条件概率作为新的特征。

N-gram距离:字符串相似度

这里插一个衡量字符串相似度的N-gram距离:公共子串数量。如2元模型将2个字符串分词形成2组2字符的子串,统计2组子串间相同子串的数量,就得到2-gram距离。但这个距离定义无法区分一个字符串被另一个字符串包含时,两字符串的差异。因此可以用另一种方式计算距离:子串数量和-2*公共子串数量。

由于本篇专门讲语言模型,因此对字符串相似度这个问题,以后在专门的文章中分析,这里就先不表。