kenlm语言模型介绍

语言模型

计算 P ( w 1 , w 2 , … , w n ) P\left(w_{1}, w_{2}, \dots, w_{n}\right) P(w1,w2,,wn)

利用链式法则: P ( A , B , C ) = P ( A ) P ( B ∣ A ) P ( C ∣ A , B ) P(A, B, C)=P(A) P(B | A) P(C | A, B) P(A,B,C)=P(A)P(BA)P(CA,B)

P ( w 1 , w 2 , … , w n ) = P ( w 1 ) P ( w 2 ∣ w 1 ) … P ( w n ∣ w 1 , … , w n − 1 ) P\left(w_{1}, w_{2}, \dots, w_{n}\right)=P\left(w_{1}\right) P\left(w_{2} | w_{1}\right) \dots P\left(w_{n} | w_{1}, \dots, w_{n-1}\right) P(w1,w2,,wn)=P(w1)P(w2w1)P(wnw1,,wn1)

常用的N-gram训练工具有SRILM、IRSTLM、BerkeleyLM和KenLM等。

kenlm语言模型介绍

kenlm是一个C++编写的语言模型工具,具有速度快、占用内存小的特点,也提供了Python接口。

步骤:

(1)增加< s>和< /s >标记符,表示句子的开头和结尾

(2)把每个词映射到唯一的数字id

(3)Counting(原始计数)。也就是把相同的字合并,然后排序

(4)Adjusting(调整计数)。其基本思想是对于那些lower-gram,我们不关心其出现的次数,而是关心其作为novel continuation(接续词)的可能性。比如“York”,其在语料中出现的次数一般会比较多,因为“New York”是很高频的词。但别的词把“york”作为接续词的可能性就较低,也就是说它前面的词只有“new”等少数几类词,所以应该给它较低的计数。

a ( w 1 n ) = { c ( w 1 n ) ,  if  n = N  or  w 1 = &lt; s &gt; ∣ v : c ( v w 1 n ) &gt; 0 ∣ ,  otherwise  a\left(w_{1}^{n}\right)=\left\{\begin{array}{l}{c\left(w_{1}^{n}\right), \text { if } n=N \text { or } w_{1}=&lt;s&gt;} \\ {\left|v : c\left(v w_{1}^{n}\right)&gt;0\right|, \text { otherwise }}\end{array}\right. a(w1n)={c(w1n), if n=N or w1=<s>v:c(vw1n)>0, otherwise 

其中,

w 1 n w_{1}^{n} w1n表示某个n-gram,比如n=2时,那么 w 1 2 w_{1}^{2} w12就表示某个2-gram;(eg:< s>我、我们)

c ( w 1 n ) c\left(w_{1}^{n}\right) c(w1n)表示w_{1}^{n} 的原始计数;

a ( w 1 n ) a\left(w_{1}^{n}\right) a(w1n)表示由原始计数调整后的计数。

(5)Discounting。基本思想是把经常出现的一些N-Gram的概率分一些出来给没有出现的N-gram,也就是将经常出现的N-Gram次数减去(discount)一部分。这样做的道理在于,对于出现次数比较多的计数我们其实已经得到了一个相对比较好的估计,那么当我们从这个计数值中减去一个较小的数值d后应该影响不大。

D n ( k ) = k − ( k + 1 ) t n , 1 t n , k + 1 ( t n , 1 + 2 t n , 2 ) t n , k D_{n}(k)=k-\frac{(k+1) t_{n, 1} t_{n, k+1}}{\left(t_{n, 1}+2 t_{n, 2}\right) t_{n, k}} Dn(k)=k(tn,1+2tn,2)tn,k(k+1)tn,1tn,k+1

式中:

-$ k \in[1,3]$;对于k为0的情况, D_{n}(0)=0;对于k大于3的情况,D_{n}(k)=D_{n}(3) ;

  • n ∈ [ 1 , N ] n \in[1,N] n[1,N];比如我们采用2-gram,那么N=2,n=[1,2];

t n , k t_{n, k} tn,k 表示出现了k次的n-gram的个数

t n , k = ∣ { w 1 n : a ( w 1 n ) = k } ∣ t_{n, k}=\left|\left\{w_{1}^{n} : a\left(w_{1}^{n}\right)=k\right\}\right| tn,k={w1n:a(w1n)=k}

(6)Normalization标准化

① 计算n-gram的概率,该概率称之为pseudo probability,也就是说它不是最终的概率,但对于计算最终概率是有用的。

u ( w n ∣ w 1 n − 1 ) = a ( w 1 n ) − D n ( a ( w 1 n ) ) ∑ x a ( w 1 n − 1 x ) u\left(w_{n} | w_{1}^{n-1}\right)=\frac{a\left(w_{1}^{n}\right)-D_{n}\left(a\left(w_{1}^{n}\right)\right)}{\sum_{x} a\left(w_{1}^{n-1} x\right)} u(wnw1n1)=xa(w1n1x)a(w1n)Dn(a(w1n))

② 计算回退权重,也称为back-off weight, 它衡量的是某个词后面能接不同词的能力。

比如,考虑 spite 和 constant 的 bigram,在语料中,两个 bigram 都出现了 993 次,以 spite 开始的 bigram 只有 9 种,大多数情况下 spite 后面跟着 of(979 次),因为 in spite of 是常见的表达,而跟在 constant 后的单词有 415 种,所以我们更有可能接到一个跟在 constant 后面的bigram,因此back-off(constant)>back-off(spite)。

b ( w 1 n − 1 ) = ∑ i = 1 3 D n ( i ) ∣ { x : a ( w 1 n − 1 x ) = i } ∣ ∑ x a ( w 1 n − 1 x ) b\left(w_{1}^{n-1}\right)=\frac{\sum_{i=1}^{3} D_{n}(i)\left|\left\{x : a\left(w_{1}^{n-1} x\right)=i\right\}\right|}{\sum_{x} a\left(w_{1}^{n-1} x\right)} b(w1n1)=xa(w1n1x)i=13Dn(i){x:a(w1n1x)=i}

(7)Interpolation内插

例:如果在某个语料中都没出现“多的“和”多敛“,c(多的)和c(多敛) 都为0,那么在传统的n-gram中,p(的∣多)=p(敛∣ 多)。而这个概率我们直观上来看是错误的,p(的∣多)应该比p(敛∣多)高很多。要实 现这个,我们就希望把 bigram 和 unigram 结合起来,因为“的”比“敛”常见的多,就能保证p(的∣多)>p(敛∣多)。

p ( w n ∣ w 1 n − 1 ) = u ( w n ∣ w 1 n − 1 ) + b ( w 1 n − 1 ) p ( w n ∣ w 2 n − 1 ) p\left(w_{n} | w_{1}^{n-1}\right)=u\left(w_{n} | w_{1}^{n-1}\right)+b\left(w_{1}^{n-1}\right) p\left(w_{n} | w_{2}^{n-1}\right) p(wnw1n1)=u(wnw1n1)+b(w1n1)p(wnw2n1)

该过程不断递归,直到unigram停止。其中unigram的插值用uniform distribution表 示:

p ( w n ) = u ( w n ) + b ( ϵ ) 1 ∣  vocabulary  ∣ p\left(w_{n}\right)=u\left(w_{n}\right)+b(\epsilon) \frac{1}{ | \text { vocabulary } |} p(wn)=u(wn)+b(ϵ) vocabulary 1

参考链接:https://zhuanlan.zhihu.com/p/63884335?utm_source=wechat_session&utm_medium=social&utm_oi=717767570240851968

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值