NLP-语言模型

语言模型

         一个语言模型通常构建为字符串s的概率分布p(s),这里的p(s)实际上反映的是s作为一个句子出现的概率。这里的概率指的是组成字符串的这个组合,在训练语料中出现的似然,与句子是否合乎语法无关。假设训练语料来自于人类的语言,那么可以认为这个概率是的是一句话是否是人话的概率。

       语句s=w1 w2 w3…wn的先验概率:P(s)=P(w1)*P(w2|w1)*P(w3|w1w2)*…*P(wm|w1..wm-1),当i=1时 P(w1|w0)=P(w1)。wi=称为统计基元,一般是词。wi的概率由w1,…,wi-1决定,由特定的一组w1..wi-1构成的一个序列,称为w1的历史。历史基元数很大时将导致该公式计算量过大。所以我们需要做的就是减少历史基元数。将两个历史映射到同一个等价类,当且仅当这两个历史中的最近n-1个基元相同。这种情况下的语言模型称为n元文法(n-gram)

        n-gram语言模型的假设:一个词的出现仅仅依赖于它前面出现的有限的一个或者几个词;一个词出现的概率条件地依赖于前N-1个词的词类。

        当n=1时,即wi相互独立时,n-gram被称为一阶马尔可夫链,或称为uni-gram;

        当n=2时,n-gram被称为2阶马尔可夫链,或bi-gram;

        当n=3时,n-gram被称为3阶马尔可夫链,或tri-gram。

        表示:<BOS>w1 w2 … wm <EOS>

2元文法的概率:

P(John read a book)=P(John|<BOS>)*P(read|John)*P(a|read)*P(book|a)*P(<EOS>|book)

:有一句话:他是研究生物的,利用马尔可夫链进行分词

         有两种分词的可能:

1.      //研究生//

2.      //研究/生物/

计算如下:

P(seg1)=P(|<BOS>)*P(|)*P(研究生|)*P(|研究生)*P(|)*P(|<EOS>)

P(seg1)=P(|<BOS>)*P(|)*P(研究|)*P(生物|研究)*P(|生物)*P(|<EOS>)

哪个概率大就选哪个。

剩下的问题是获得概率的问题。

 

        训练语料:用于建立模型,确定模型参数的已知语料。

        最大似然估计:用相对频率计算概率。

对于n-gram,条件概率可由最大似然估计求得:

P(wi|wi-1)=wiwi-1同时同时出现的次数/历史串wi-1出现的次数

 

:假设给定语料:John read Moby Dick. Mary read a different book. She read a book by cher.根据2元文法求句子John read a book的概率。

计算:P(John|<BOS>)=1/3, P(a|read)=2/3,P(read|John)=1,P(book|a)=1/2,P(<EOS>|book)=1/2,result=0.0555

困惑度

    定义:H(p)为该分布的熵 1.png

    在自然语言处理中,困惑度是用来衡量语言概率模型优劣的一个方法。一个语言概率模型可以看成是在整过句子或者文段上的概率分布。(例如每个分词位置上有一个概率分布,这个概率分布表示了每个词在这个位置上出现的概率;或者每个句子位置上有一个概率分布,这个概率分布表示了所有可能句子在这个位置上出现的概率)。

    比如,i这个句子位置上的概率分布的信息熵可能是190,或者说,i这个句子位置上出现的句子平均要用190 bits去编码,那么这个位置上的概率分布的困惑度就是2^(190)。(相当于投掷一个2^(190)面筛子的不确定性)通常,我们会考虑句子有不同的长度,所以我们会计算每个分词上的困惑度。比如,一个测试集上共有1000个单词,并且可以用7.95个bits给每个单词编码,那么我们可以说这个模型上每个词有2^(7.95)=247 困惑度。相当于在每个词语位置上都有投掷一个247面骰子的不确定性。

    对于一个平滑的n-gram,其概率为P(wiwi-1),可计算的整个句子的概率P(s)=sum(P(wiwi-1))。假定测试语料T由T个句子构成,则整个测试集的概率为:P(T)=sum(P(s))。

数据平滑

    当某个词对从未出现时,算得的P的概率为零,然后导致整个句子的概率为0。为了解决这个问题,最简单的想法是扩大语料库,但无论怎样扩大,我们永远不可能覆盖所有的词,更有效的方法是进行数据平滑。

    数据平滑:调整最大似然估计的概率值,使零概率增值,使非零概率下调,消除零概率,改进模型的整体正确率。

    基本约束:各个条件概率之和为1。

    困惑度和交叉熵:对于一个平滑的n-gram,其概率为P(Wi|Wi-1),可以计算句子的概率:P(s)=∏P(Wi|Wi-1),测试语料T由N个句子构成(t1 t2…t_N),则整个测试集的概率为P(T)= ∏P(Ti)。

    测试语料的交叉熵:H(T)=-1/W_T*log2(P(T)),其中W_T是测试文本T的词数。

    模型P的困惑度PPP(T):PPP(T)=2H(T).困惑度越小模型越好。


数据平滑有很多种算法,通过加频次平滑的方法叫做加法平滑,常见的加法平滑有Add-OneAdd-k

Add-One(加1算法)

    Add-one 是最简单、最直观的一种平滑算法,既然希望没有出现过的N-gram的概率不再是0,那就直接规定在训练时任何一个N-gram在训练预料至少出现一次(即规定没有出现的,在语料中也出现一次)。即每一种情况出现的次数加1。

    举个例子:假设有uni-gram,设有三个词w1 w2 w3,概率分别为1/3 ,0 ,2/3。那么经过加1算法后,分母变成了(3+3)=6,分子加1所以得到的概率为2/6,1/6,3/6。

Add-k

    效果比Add-One好,Add-k不是加1,而是加一个小于1的正数,通常取0.5,此时又称为Jeffreys-Perks Law或ELE,但是效果仍然不够理想。

减值法

   修改训练样本中事件的实际计数,使样本中事件的实际计数,使样本中不同事件的概率之和小于1,剩余的概率量分配给未见概率。减值法有几种方法,其中一种是Good-Turing算法。不同于加法平滑,Good-Turing不会改变分母的值。

Good-Turing(古德图灵算法)

    基本思想:利用高频率n-gram的频率调整低频率的n-gram的频率。

3.gif

    Nr是所有发生次数为r的元组个数,同样Nr+1是所有发生次数为r+1的元组个数,一般来说,发生次数为r的元组个数多余发生次数为r+1的元组个数。

    这样的话,对于发生个数为0的元组的计数就不为0了,每个频率高n-gram的概率都比以前要小了,小的那部分,分给了频率低的n-gram。这里的发生个数为0指的是在训练集中发生次数为0,即在训练集中没有出现,在测试集中第一次出现,然后用的是在训练集中出现1次的元组来估计,这样那些第一次出现的次数为不为0,实现了平滑。

Back-off后退法(Katz平滑)

    基本思想:当某一事件在样本中出现的频率大于K(K通常为0或1)时,运用最大似然估计减值来估计其概率。否则,使用低阶的即(n-1)gram的概率替代n-gram概率,而这种替代需要受归一化因子的作用。

    对于每个r>0的减值,因把减值而节省下来的剩余概率根据低阶的(n-1)-gram分配给未见事件。

绝对减值法

线性减值法 

插值法

    插值法和回退法的思想非常相似,设想对于一个trigram的模型,我们要统计语料库中“”“I like chinese food”出现的次数,结果发现它没有出现,则计数为0,在回退策略中们将会试着用低阶的gram来进行替代,也就是用“like chinese food”出现的次数来替代。在使用插值的时候,我们把不同阶层的n-gram的模型线性叠加组合起来之后再使用,简单的如trigram的模型。


 

语言模型的自适应问题

    在训练语言模型时所采用的语料往往来自多种不同的领域,这些综合性语料难以反映不同领域之间在语言使用规律上的差异,而语言模型恰恰对于训练文本的类型、主题和风格都十分敏感。

    N元语言模型的独立性假设的前提是一个文本中的当前词出现的概率只与它前面相邻的n-1个词相关,但这种假设在很多种情况下是明显不成立的。

因此语言模型需要一些自适应的方法:

基于缓存的语言模型

    在文本中刚刚出现过的一些词在后边的句子中在此出现的可能性往往比较大,比标准的n-gram模型预测的概率要大。Cache-based自适应方法的基本思路是:语言模型通过n-gram线性插值求得.

通常的处理办法是:在缓存中保留前面的K个单词,每个词的概率(缓存概率)用其在缓存中出现的相对频率计算。这种方法的缺陷是:缓存中一个词的重要性独立于该词与当前词的距离。


基于混合方法的语言模型

    基于混合方法的语言模型针对的问题是:为了获得最佳性能,语言模型必须适应各种不同类型的语料对其性能的影响。

    处理方法是:将语言模型划分为n个子模型M1,M2,M3…Mn,整个语言模型的概率通过下面的线性插值公式.

其中,0<=lambda<=1,sum(lambda)=1, lambda值可以通过EM算法计算出来。

步骤:

    确定适当的训练语料子集,并利用这些语料建立特定的语言模型。

    利用针对各个语料子集的特定语言模型和线性插值公式,获得整个语言模型。

基于最大熵的语言模型

语言模型的使用

 汉语分词

 

参考文献

[1]博客园:yiyi_xuechen.稀疏问题的解决——数据平滑. https://www.cnblogs.com/yiyi-xuechen/p/3561769.html .2014-02-23

[2]CSDN博客:Vincent-Yuan. srilm语言模型中的平滑算法——Good-Turing平滑算法.

https://blog.csdn.net/vincent1y/article/details/81565388 . 2018-08-10

 


首页 所有文章 机器人 计算机视觉 自然语言处理 机器学习 编程随笔 关于