【Natural Language Processing】语言模型(Language Modeling)

一、语言模型简介
  语言模型用于对特定序列的一系列词汇的出现概率进行计算。一个长度为m的词汇序列{w1,w2,...,wn }的联合概率被表示为p(w1,w2,...,wn )。那么根据链式规则可以得到:

P(S)=p(w1,w2,...,wn)=nip(wi|w1,w2,...wi1)

  其中p(wi|w1,w2,...wi1) 的计算方法可以为:
p(wi|w1,w2,...wi)=p(w1,w2,...wi)/p(w1,w2,...wi1)

  上面的P(S)即为语言模型。
1.1 语言模型的应用
  ①机器翻译:P(high winds tonite) > P(large winds tonite);
  ②拼写纠错:P(about fifteen minutes from) > P(about fifteen minuets from);
  ③语音识别:P(I saw a van) >> P(eyes awe of an);
  自动文摘、问答系统、etc.!etc.!
二、Markov Assumption与N-gram
  假设我们基于上述模型进行计算,那么将会出现指数幂种可能句子,也无法有足够的数据老训练模型,这个时候马尔科夫假设(Markov Assumption)就闪亮登场了,其假设当前出现的单词仅仅与前一个或k个单词有关,即:
P(the | its water is so transparent that) P(the | that)

  Or
P(the | its water is so transparent that) P(the | transparent that)

  理论上k取得越大那么模型的效果就会越好,但是如果取得过大又会出现原来的问题,在实际应用中,k的值一般取2或者3,即分别为2-gram(Bigram model)和3-gram(Trigram model)。
  最终每个单词到来的概率计算公式为:
p(wi|w1,w2,...,wi1)p(wi|wik,wik+1,...wi1)

  相应的语言模型变为:
P(S)=p(w1,w2,...,wn)=nip(wi|wik,wik+1,...wi1)

三、建立语言模型
  一般地,通过最大似然估计(Maximum Likelihood Estimate)来建立语言模型,即:
p(wi|wi1)=count(wi1,wI)count(wi1)

  假设存在训练语料为:
  < s> I am Sam < /s>
  < s> Sam I am < /s>
  < s> I do not like green eggs and ham < /s>
  那么通过计算可得:

这里写图片描述

  如果存在一个更大的语料,通过同样的计算方法得到如下信息:

这里写图片描述

这里写图片描述

  最终句子< s> I want english food < /s>的概率为:
  P(< s> I want english food < /s>)
  = P(I|< s>)× P(want|I)× P(english|want) × P(food|english) × P(< /s>|food)
  =0 .000031
  我们可以发现计算得到的数值通常很小,避免数据溢出、提高性能,通常会使用取log后使用加法运算替代乘法运算,即为:

log(p1p2p3p4)=logp1+logp2+logp3+logp4

四、平滑技术
  数据平滑是对频率为0的n元对进行估计,典型的平滑算法有加法平滑、Good-Turing平滑、Katz平滑、插值平滑,etc.
4.1 Add-one(Laplace) Smoothing
  加一平滑法,又称拉普拉斯定律,其保证每个n-gram在训练语料中至少出现1次,以bigram为例子,计算方法如下:

这里写图片描述

4.2 Good-Turing Smoothing
  该方法首先我们假设在统计元组的过程中,发生c次N元组类别的数目为Nc ,c即为上文中统计的count值,那么通过Good-Turing Smoothing方法,统计得到count更新后的值count*的计算方法为:

count=(c+1)Nc+1Nc

  一个例子:
  训练集合:T={< s>what is it what is small?}|T|=8;
  验证集合:V={what is it small ? < s> flying birds are a bird.}, |V|=12;
  在训练集合上,我们得到:p(< s>)=p(it)=p(small)=p(?)=0.125, p(what)=p(is)=0.25,其他为0;
  如果不经过平滑处理,则验证集上两句子的概率分别为:p(what is it?)=(0.25^2)(0.125^2)≈0.001 p(it is flying.)=0.125*0.25(0*2)=0;
  现在用古德-图灵算法进行平滑处理,如下:
  首先计算,各发生c次N元组类别的数目,依次为N(0)=6,N(1)=4,N(2)=2,N(i)=0 ,i>2:
   其次,重新估计各概率值。
  ①对于发生0次的事件概率:Pr(.)=p(flying)=p(birds)=p(are)=p(bird)=p(a)=(0+1)*N(0+1)/(8*N(0))=1*4/(8*6)≈0.083
  ②对于发生1次的时间概率:Pr(it)=p(< s>)=p(small)=p(?)=(1+1)*N(1+1)/(8*N(1))=2*2/(8*4)=0.125
  ③对于发生两次的时间概率:Pr(what)=Pr(is)=(2+1)*N(2+1)/(8*N(2))=3*0/(8*2)=0: 保持原值0.25
  归一化处理,6*P0+4*P1+2*P2=1.5。
  所以,归一化处理后:
  p(it)=p(< s>)=p(small)=p(?)= 0.125/1.5 ≈0.08,
  p(what)=p(is)= 0.25/1.5 ≈0.17
  p(.)=p(birds)=p(are)=p(bird)=p(a) = 0.083/1.5 ≈0.06
  最终计算得到:
  p(what is it?)=(0175^2)*(0.08^2)≈0.0002;
  p(it is flying.) ≈ 0.08*0.17*(0.06^2)≈0.00004。
4.3 Interpolation Smoothing
  前面两种平滑技术,对于未出现的n-gramd都进行了一样的处理,其中肯定存在不合理之处,对于线性插值平滑技术,其基本思想是将高阶模型和低阶模型作线性组合,利用低元n-gram模型对高元n-gram模型进行线性插值。因为在没有足够的数据对高元n-gram模型进行概率估计时,低元n-gram模型通常可以提供有用的信息。

这里写图片描述

  对于三种数据:Training data、Held-out data和Test data;

这里写图片描述

  然后,根据Training data构造初始的语言模型,并确定初始的λs(如均为1);
最后,基于EM算法迭代地优化λs,使得Held-out data概率(如下式)最大化。

logP(w1...wn|M(λ1...λn))=ilogPM(λ1...λn)(wi|wi1)

4.4 Stupid Backoff

这里写图片描述

五、评价方法
  语言模型的评价方法在理论上可以使用困惑度/混乱度(preplexity),其基本思想是给测试集赋予较高概率值的语言模型较好,计算公式如下:

这里写图片描述

  观察上述公式可得困惑度越小,句子概率越大,则说明训练得到的语言模型越好。以上即为传统中的传统的语言模型做法。

参考文献:
斯坦福大学自然语言处理课件
N元语法模型的数据稀疏问题解决方法之一:Good-Turing平滑

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章