语言模型
计算P(w1,w2,…,wn)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(w1,w2,…,wn)=P(w1)P(w2∣w1)…P(wn∣w1,…,wn−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(w1n)={ c(w1n), if n=N or w1=<s>∣v:c(vw1n)>0∣, otherwise a\left(w_{1}^{n}\right)=\left\{\begin{array}{l