语言模型-计算句子概率

相关软件包:

  • mitlm
  • arpa

mitlm只能训练语言模型,没有计算句子概率的函数,需要自己编写。

但是mitlm可以输出arpa格式的语言模型文件,通过python包arpa加载,使用相关的函数就可以计算句子概率。

mitlm训练模型:

../estimate-ngram -o 2 -t $infile \
    -wc $OUTPUT_DIR/wc.$cat \
    -wec $OUTPUT_DIR/wec.$cat \
    -wlc $OUTPUT_DIR/wlc.$cat \
    -wrc $OUTPUT_DIR/wrc.$cat \
    -wl $model_file \
    -wv $OUTPUT_DIR/wv.$cat \
    -eval-perp $infile

其中输出文件:

wc.$cat
    n-gram counts
wec.$cat
    effective n-gram counts
wl.$cat
    ARPA backoff LM
wlc.$cat
    left-branching n-gram counts
wrc.$cat
    right-branching n-gram counts

值得注意的就是 wl.$cat文件,该文件为ARPA格式的语言模型。ARPA格式一般如下:

ngram折扣概率, ngram, backoff概率(最后一个ngram没有backoff概率)

接下来就是使用arpa包计算句子概率了。

arpa包是基于python3开发的,在python2.7下可以安装,但是需要改3个地方才能运行:

第一处是 src/arpa/arpa.py文件的loadf()函数

def loadf(path, mode="rt", encoding=None, model=None, parser=None):
    """Deserialize path (a text file) to a Python object."""
    #with open(path, mode=mode, encoding=encoding) as f:
    with open(path) as f:
        return load(f, model=model, parser=parser)

第二处是 ./src/arpa/models/base.py 和/src/arpa/parsers/base.py中_metaclass_声明方式,分别改为:

class ARPAModel:
    __metaclass__ = ABCMeta
#
class ARPAParser:
    __metaclass__ = ABCMeta

第三处为 ./src/arpa/models/simple.py中的super()调用方式:

super(ARPAModelSimple, self).__init__(unk=unk)

加载arpa语言模型,计算句子概率:

import arpa
models = arpa.loadf("results/wl.a.hyp")
lm = models[0]
s = 'a b'
#计算ngram概率
print lm.p(s)
print lm.log_p(s)
#计算句子得分
print lm.s(s)
print lm.log_s(s)

ARPA格式详细可参考:

http://www.speech.sri.com/projects/srilm/manpages/ngram-format.5.html

计算句子模型的方法可以参考arpa包的源码,还可以参考代码:
https://github.com/awni/py-arpa-lm

mitlm的资料很少,貌似没有人维护和更新了,不过网上也找到一份教程,但是比较简单:
http://projects.csail.mit.edu/cgi-bin/wiki/view/SLS/MITLMTutorial

理解语言模型可参考stanford的课程:

http://www.voidcn.com/blog/fkyyly/article/p-566909.html

还可以参考中科院宗成庆老师的课件:

http://www.nlpr.ia.ac.cn/cip/ZongReportandLecture/Lecture_on_NLP/Chp-05.pdf

语言模型一般都会用到平滑方法,比较常用的是katz折扣法,详细讲解可参考:
http://blog.pluskid.org/?p=361

其他参考:
http://zhouyichu.com/nlp/Language-Model/

你可能感兴趣的:(语言模型-计算句子概率)