语言模型
计算 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(B∣A)P(C∣A,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(w2∣w1)…P(wn∣w1,…,wn−1)
常用的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 ) =