相关软件包:
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