提到语言模型,给一个大家最熟悉的使用场景就是输入法,智能拼音输入法,打出一串拼音,直接给出了合适的句子,即使不是你想要的,但确实是符合语法习惯的,例如,你的名字叫“福贵”你输入了“fugui”,出来的可能是“富贵”,但不会出来“抚跪”,这就是语言模型的功劳!~~~~
一句话,语音识别中语言模型的目的就是根据声学模型输出的结果,给出概率最大的文字序列!~~~
1)n-gram概念
p(S)=p(w1,w2,w3,w4,w5,…,wn)
=p(w1)p(w2|w1)p(w3|w1,w2)...p(wn|w1,w2,...,wn-1)//链规则
p(S)被称为语言模型,即用来计算一个句子概率的模型。
那么,如何计算p(wi|w1,w2,...,wi-1)呢?最简单、直接的方法是直接计数做除法,如下:
p(wi|w1,w2,...,wi-1) = p(w1,w2,...,wi-1,wi) / p(w1,w2,...,wi-1)
但是,这里面临两个重要的问题:数据稀疏严重;参数空间过大,无法实用。
基于马尔科夫假设(Markov Assumption):下一个词的出现仅依赖于它前面的一个或几个词。
p(S)=p(w1)p(w2|w1)p(w3|w1,w2)...p(wn|w1,w2,...,wn-1)
=p(w1)p(w2|w1)p(w3|w2)...p(wn|wn-1) // bigram
p(S)=p(w1)p(w2|w1)p(w3|w1,w2)...p(wn|w1,w2,...,wn-1)
=p(w1)p(w2|w1)p(w3|w1,w2)...p(wn|wn-1,wn-2) // trigram
那么,我们在面临实际问题时,如何选择依赖词的个数,即n。当n取1、2、3时,n-gram模型分别称为unigram、bigram和trigram语言模型。
理论上,n越大越好,经验上,trigram用的最多,尽管如此,原则上,能用bigram解决,绝不使用trigram。
2)构造语言模型
通常,通过计算最大似然估计(Maximum Likelihood Estimate)构造语言模型,这是对训练数据的最佳估计,公式如下:
p(w1|wi-1) = count(wi-1, wi) / count(wi-1)
如给定句子集“ I am Sam
Sam I am
I do not like green eggs and ham ”
部分bigram语言模型如下所示:
c(wi)如下:
c(wi-1,wi)如下:
则bigram为:
那么,句子“ I want english food ”的概率为:
p( I want english food )=p(I|)
× P(want|I)
× P(english|want)
× P(food|english)
× P(|food)
= 0.000031
为了避免数据溢出、提高性能,通常会使用取log后使用加法运算替代乘法运算。
log(p1*p2*p3*p4) = log(p1) + log(p2) + log(p3) + log(p4)
count(X)表示在训练语料中出现的次数,训练语料的规模越大,参数估计的结果越可靠。但即使训练数据的规模很大,如若干GB,还是会有很多语言现象在训练语料中没有出现过,这就会导致很多参数(某n元对的概率)为0。举个例子来说明一下,IBM Brown利用366M英语语料训练trigram,结果在测试语料中,有14.7%的trigram和2.2%的bigram在训练中没有出现;根据博士期间所在的实验室统计结果,利用500万字人民日报训练bigram模型,用150万字人民日报作为测试语料,结果有23.12%的bigram没有出现。
这种问题也被称为数据稀疏(Data Sparseness),解决数据稀疏问题可以通过数据平滑(Data Smoothing)技术来解决。
3. 数据平滑
基本思想是为避免零概率问题,将每个n元对得出现次数加上一个常数δ(0<δ≤1):
承接上一节给的例子,经Add-one Smoothing后,c(wi-1, wi)如下所示:
在V >> c(wi-1)时,即训练语料库中绝大部分n-gram未出现的情况(一般都是如此),Add-one Smoothing后有些“喧宾夺主”的现象,效果不佳。
2)Good-Turing Smoothing
利用频率的类别信息来对频率进行平滑:
(5)
其中,N(c)表示频率为c的n-gram的数量。
该数据平滑技术主要利用低元n-gram模型对高元n-gram模型进行线性插值。因为在没有足够的数据对高元n-gram模型进行概率估计时,低元n-gram模型通常可以提供有用的信息。
(6)
可以通过EM算法来估计。
也称为回退(back-off)平滑,其基本思想是当一个n元对的出现次数足够大时,用最大似然估计方法估计其概率;当n元对的出现次数不够大时,采用Good-Turing估计对其平滑,将其部分概率折扣给未出现的n元对;当n元对的出现次数为0时,模型回退到低元模型。
4. n-gram解码算法
对于音字转换问题,输入拼音nixianzaiganshenme,可能对应着很多转换结果,对于这个例子,可能的转换结果如下图所示(只画出部分的词语节点),各节点之间构成了复杂的网络结构,从开始到结束的任意一条路径都是可能的转换结果,从诸多转换结果中选择最合适的结果的过程就需要解码算法。
常用的解码算法是viterbi算法,它采用动态规划的原理能够很快地确定最合适的路径。这里就不详细介绍该算法了。
5. 语言模型工具
推荐开源语言模型工具:
6. 训练数据集的获取
推荐开源n-gram数据集:
当然,数据集的选取很大程度上影响着模型的好坏,获取适合自己工程的数据集才是好的数据集,在实际项目中,经常使用诸如爬虫算法在网络上获取适合自己的数据集,例如,你在开发一个与金融有关的语音识别项目,你就可以通过爬虫算法在网络上搜索所有与金融有关的网页,文章等资源,来建立自己的语料库(数据集)。
7. 语言模型文件格式ARPA
以上介绍的是n-gram语言模型,现在也有使用RNN(循环神经网络)进行语言模型进行建模!~~~~