美文网首页自然语言处理
语言模型-计算句子概率

语言模型-计算句子概率

作者: 风驰电掣一瓜牛 | 来源:发表于2017-07-18 21:30 被阅读782次

    相关软件包:

    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/

    相关文章

      网友评论

        本文标题:语言模型-计算句子概率

        本文链接:https://www.haomeiwen.com/subject/hqfkkxtx.html