基于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的最终概率值

 

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。