基于SRILM的ARPA的n-gram语言模型格式
\data\
ngram 1=10
ngram 2=20
ngram 3=30
\1-grams:
-2.522091 啊 -0.4599362
-3.616682 阿 -0.2710813
-5.888154 阿坝
-5.483542 阿布 -0.02341532
-5.513821 阿迪达斯 -0.08972257
-5.357502 阿哥
-5.619849 阿胶
-5.003489 阿拉 -0.0459251
-5.11305 阿拉伯 -0.1348525
-5.11305 阿拉伯数字 -0.153861
\2-grams:
-2.841684 阿 楠
-1.279527 阿布 贾
-0.7184195 阿迪达斯 </s>
-1.628645 阿拉 阿拉
-1.628414 阿拉 蕾
-1.272437 阿拉 善
-1.37447 阿拉伯 贵族
-1.122427 阿拉伯 人
-1.373596 阿拉伯 数
-0.9671616 阿拉伯 语
\3-grams:
-0.7579774 啊 啊 </s>
-0.3643477 啊 啊 啊
-1.625012 啊 啊 对
-1.826232 啊 啊 行
-0.1952119 爱 啊 </s>
-0.1937787 安排 啊 </s>
-0.2185729 安全 啊 </s>
-0.1328749 安装 啊 </s>
-0.3589647 吧 啊 </s>
-1.99777 吧 啊 拜拜
*上面的值都是以10为底的对数值(词组前面的数字:概率,词组后面的数据,回退权值)
计算一个句子在该ARPA中的概率如下(3gram为例):
# Make sure the OOVs change to <unk>
#P(word3| word1, word2):
# if has (word3| word1, word2){
# return P(word3| word1, word2);
# }else if has (word2| word1){
# return backOff(word2| word1) * P(word3| word2);
# }else{
# return P(word3| word2);
# }
#P(word2 | word1):
# if has (word2| word1){
# return P(word2| word1);
# }else{
# return backOff(word1) * P(word2);
# }
python 实现
def wordsProbs(words, dict):
wordArr = words.split(" ")
if len(wordArr) == 3:
if dict.has_key(words):
return dict.get(words).prob
elif dict.has_key(wordArr[0] + " " + wordArr[1]):
return dict.get(wordArr[0] + " " + wordArr[1]).backoff + wordsProbs(wordArr[1] + " " + wordArr[2], dict)
else:
return wordsProbs(wordArr[1] + " " + wordArr[2], dict)
elif len(wordArr) == 2:
if dict.has_key(wordArr[0] + " " + wordArr[1]):
return dict.get(wordArr[0] + " " + wordArr[1]).prob
else:
return dict.get(wordArr[0]).backoff + wordsProbs(wordArr[1], dict) #make sure OOV change to <unk>,or error
else:
return dict.get(wordArr[0]).prob #make sure OOV change to <unk>,or error
*通过以上获取的是logP(3gramWords),probs = 10 ^ logP(3gramWords),probs即是3gramWords的最终概率值
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。