SRILM是著名的约翰霍普金斯夏季研讨会(Johns Hopkins Summer Workshop)的产物,诞生于1995年,由SRI实验室的Andreas Stolcke负责开发维护。
  关于SRILM的安装,我已经在前面关于moses平台搭建的文章(参见:《Moses相关介绍》《Ubuntu8.10下moses测试平台搭建全记录》)中介绍过了,这里就不再重复。准确的说,SRILM并不是因机器翻译而诞生的,它主要是为语音识别所开发的,全称为Stanford Research Institute Language Modeling Toolkit。事实上统计机器翻译与语音识别关系千丝万缕,我会在以后的文章中介绍。
  SRILM用来构建和应用统计语言模型,主要用于语音识别,统计标注和切分,以及机器翻译,可运行在UNIX及Windows平台上。它主要包含以下几个部分:
  • 一组实现的语言模型、支持这些模型的数据结构和各种有用的函数的C++类库;
  • 一组建立在这些类库基础上的用于执行标准任务的可执行程序,如训练语言模型,在数据集上对这些语言模型进行测试,对文本进行标注或切分等任务。
  • 一组使相关任务变得容易的各种脚本。
  SRILM的主要目标是支持语言模型的估计和评测。估计是从训练数据(训练集)中得到一个模型,包括最大似然估计及相应的平滑算法;而评测则是从测试集中计算其困惑度(MIT自然语言处理概率语言模型有相关介绍)。其最基础和最核心的模块是n-gram模块,这也是最早实现的模块,包括两个工具:ngram-count和ngram,相应的被用来估计语言模型和计算语言模型的困惑度。一个标准的语言模型(三元语言模型(trigram),使用Good-Truing打折法和katz回退进行平衡)可以用如下的命令构建:
   ngram-count -text TRAINDATA -lm LM
  其中LM是输出的语言模型文件,可以用如下的命令进行评测:
   ngram -lm LM -ppl TESTDATA -debug 2
 其中具体的参数可参看官方网站的帮助文档,如果你已经在linux下编译好了,可以直接使用man调用帮助文档。事实上,统计机器翻译框架主要用的就是n-gram这个模块来训练语言模型。下面我们以欧洲语料库的英语语料为例,解析这个工具的作用。语料库下载地址见:欧洲议会平行语料库。本例子使用的是wmt08里面用于英语语言模型训练的europarl-v3b.en,用于机器翻译的预处理过程tokenize和lowercase此处省略,其规模为1412546句:
  1、从语料库中生成n-gram计数文件:
   ngram-count -text europarl-v3b.en -order 3 -write europarl.en.count
  其中参数-text指向输入文件,此处为europarl-v3b.en;-order指向生成几元的n-gram,即n,此处为3元;-write指向输出文件,此处为europarl.en.count,输出内容为:
   …
   sweeteners 66
   sweeteners should 1
   sweeteners should be 1
   …
  分为两列,第一列为n元词,第二列为相应的频率。如一元词sweeteners在语料库中的频率统计为66次;二元词sweeteners shoul在语料库中的频率统计为1次;三元sweeteners should be在语料库中的频率统计为1次。
  2、从上一步生成的计数文件中训练语言模型:
   ngram-count -read europarl.en.count -order 3 -lm europarl.en.lm -interpolate -kndiscount
  其中参数-read指向输入文件,此处为 europarl.en.count;-order与上同;-lm指向训练好的语言模型输出文件,此处为europarl.en.lm;最后两个参数为所采用的平滑方法,-interpolate为插值平滑,-kndiscount为 modified Kneser-Ney 打折法,这两个是联合使用的。需要补充的是,一般我们训练语言模型时,这两步是合二为一的,这里主要是为了介绍清楚n-gram语言模型训练的步骤细节。
  语言模型europarl.en.lm的文件格式如下,为 ARPA文件格式。为了说明方便,文件中的括号是我加上的注释:
 data
 ngram 1=262627 (注:一元词有262627个 )
 ngram 2=3708250 (注:二元词有 3708250个)
 ngram 3=2707112 (注:三元词有 2707112个)

 1-grams:(注:以下为一元词的基本情况)
 -4.891179(注:log(概率),以10为底) ! -1.361815
 -6.482389 !) -0.1282758
 -6.482389 !’ -0.1282758
 -5.254417 “(注:一元词) -0.1470514
 -6.482389 “‘ -0.1282758(注:log(回退权重),以10为底)
 …
 2-grams:
 -0.02140159 !
 -2.266701 ! –
 -0.5719482 !)
 -0.5719482 !’
 -2.023553 ” ‘Biomass’
 -2.023553 ” ‘vertical’
 …
 3-grams:
 -0.01154674 the !
 -0.01154674 urgent !
 -0.01154674 us’ !
 -1.075004 the “.EU” Top
 -0.827616 the “.EU” domain
 -0.9724987 the “.EU” top-level …
3、利用上一步生成的语言模型计算测试集的困惑度:
   ngram -ppl devtest2006.en -order 3 -lm europarl.en.lm > europarl.en.lm.ppl
  其中测试集采用wmt08用于机器翻译的测试集devtest2006.en,2000句;参数-ppl为对测试集句子进行评分(logP(T),其中P(T)为所有句子的概率乘积)和计算测试集困惑度的参数;europarl.en.lm.ppl为输出结果文件;其他参数同上。输出文件结果如下:
 file devtest2006.en: 2000 sentences, 52388 words, 249 OOVs
 0 zeroprobs, logprob= -105980 ppl= 90.6875 ppl1= 107.805
  第一行文件devtest2006.en的基本信息:2000句,52888个单词,249个未登录词;
  第二行为评分的基本情况:无0概率;logP(T)=-105980,ppl==90.6875, ppl1= 107.805,均为困惑度。其公式稍有不同,如下:
   ppl=10^{-{logP(T)}/{Sen+Word}}; ppl1=10^{-{logP(T)}/Word}
  其中Sen和Word分别代表句子和单词数。

附:SRILM主页推荐的书目和文献。
 入门——了解语言模型尤其是n-gram模型的参考书目章节:
  • 《自然语言处理综论》第一版第6章,第二版第4章(Speech and Language Processing by Dan Jurafsky and Jim Martin (chapter 6 in the 1st edition, chapter 4 in the 2nd edition) )
  • 《统计自然语言处理基础》第6章。(Foundations of Statistical Natural Language Processing by Chris Manning and Hinrich Schütze (chapter 6))
 深入学习相关文献:
  • A. Stolcke, SRILM – An Extensible Language Modeling Toolkit, in Proc. Intl. Conf. Spoken Language Processing, Denver, Colorado, September 2002. Gives an overview of SRILM design and functionality.
  • D. Jurafsky, Language Modeling, Lecture 11 of his course on “Speech Recognition and Synthesis” at Stanford. Excellent introduction to the basic concepts in LM.
  • J. Goodman, The State of The Art in Language Modeling, presented at the 6th Conference of the Association for Machine Translation in the Americas (AMTA), Tiburon, CA, October, 2002.
Tutorial presentation and overview of current LM techniques (with emphasis on machine translation).
  • K. Kirchhoff, J. Bilmes, and K. Duh, Factored Language Models Tutorial, Tech. Report UWEETR-2007-0003, Dept. of EE, U. Washington, June 2007. This report serves as both a tutorial and reference manual on FLMs.
  • S. F. Chen and J. Goodman, An Empirical Study of Smoothing Techniques for Language Modeling, Tech. Report TR-10-98, Computer Science Group, Harvard U., Cambridge, MA, August 1998 (original postscript document). Excellent overview and comparative study of smoothing methods. Served as a reference for many of the methods implemented in SRILM.

注:原创文章,转载请注明出处“我爱自然语言处理”:blog.52nlp.org

本文链接地址:http://blog.52nlp.org/language-model-training-tools-srilm-details/

相关文章:

  1. 语言模型工具IRSTLM安装及试用手记
  2. Ubuntu 64位系统下SRILM的配置详解
  3. Ubuntu8.10下moses测试平台搭建全记录
  4. MIT自然语言处理第三讲:概率语言模型(第六部分)
  5. Moses训练脚本的一个问题
  6. Moses相关介绍
  7. 统计机器翻译文献阅读指南
  8. Beautiful Data-统计语言模型的应用二:背景
  9. MIT自然语言处理第三讲:概率语言模型(第五部分)
  10. MIT自然语言处理第三讲:概率语言模型(第二部分)

评论

19条回复 to “语言模型训练工具SRILM详解”

  1. wqfeng on 五月 7th, 2009 09:28

    请问下,怎么调用srilm里面关于语言模型平滑的那些函数啊?
    谢谢

    [回复]

    admin 回复:

    你好,我在这篇文章中举的例子“ngram-count -read europarl.en.count -order 3 -lm europarl.en.lm -interpolate -kndiscount”中使用-interpolate -kndiscoun这两个作为平滑函数的参数,具体可参考SRILM关于ngram-count的参数说明文档:http://www.speech.sri.com/projects/srilm/manpages/ngram-count.1.html。其中,在“In the following discounting parameter options, the order n may be omitted, in which case a default for all N-gram orders is set. The corresponding discounting method then becomes the default method for all orders, unless specifically overridden by an option with n. If no discounting method is specified, Good-Turing is used.”下列举了如下平滑函数的参数的详细说明:
    -gtn gtfile、-cdiscountn discount、-wbdiscountn、-ndiscountn、-addsmoothn delta、-kndiscountn、-kn-counts-modified、-kn-modify-counts-at-end、-knn knfile、-ukndiscountn、-interpolaten
    使用时可以根据自己的需要在ngram-count中指定,如在举例中将以下黑体部分替换即可:
    ngram-count -read europarl.en.count -order 3 -lm europarl.en.lm -interpolate -kndiscount

    [回复]

  2. wqfeng on 五月 7th, 2009 15:49

    哦,不好意思,我没有表达清楚,我本意是想在我自己的程序里调用它里面的语言模型平滑算法,该怎么调用?因为我看了你上面的介绍说,它包括一组实现的语言模型、支持这些模型的数据结构和各种有用的函数的C++类库;所以我想不知道是不是可以直接调用的,或者说把那具体的平滑算法模块抽取出来用到我的程序里?不知道这样行不行?谢谢,打扰了。

    [回复]

    admin 回复:

    这个应该研究srilm里关于平滑算法那块儿的代码了,stevejian写了一系列srilm的代码阅读文档,其中“srilm 阅读文档15 (Version2.0)”就是对折扣平滑算法Discount类进行详细说明的,我觉得你可以研究一下这个类,然后在你的程序中调用这个类提供的一些接口。不过我也没仔细看过srilm的代码,猜测的:
    http://blog.chinaunix.net/u1/58264/showart_1731994.html

    [回复]

  3. wqfeng on 五月 7th, 2009 16:29

    好,谢谢

    [回复]

  4. wei on 三月 24th, 2010 19:04

    SRILM不错,但是建议再试试MIT的MITLM toolkit
    比起SRILM, 这个MITLM toolkit的一个优点是包含了
    各种Kneser-Ney smoothing的参数优化。对评价语言模型很方便

    [回复]

    52nlp 回复:

    非常感谢,有机会我试一下!

    [回复]

  5. Yu Yifeng on 三月 25th, 2010 12:22

    请问,语言模型计算频率时,如3gram,对于训练集中的一个句子,从第三个词开始容易明白,但是第一个词、第二个词怎么处理?句子第一个词的前两个词是什么,是前一句的最后一个词和两句之间的句号吗?还是第一、二个词就不管了?

    前一阵子参照刘洋的《利用现有软件构建统计机器翻译系统》做,所以先接触cmu-lm,对这个问题一直不解,尤其是cmu-lm中的Context cues file。

    您这里介绍的是SRILM,因此想到SRILM找答案。SRILM文章中有一句话:
    SRILM by itself performs no text conditioning, and treats everything between whitespace as a word. Normalization and tokenization of text are highly corpus-dependent, and are typically accomplished with filters that preprocess the data.

    那么句号也算一个word,则每个句子的第一、二个词也应计算三元频率,是这样吗?

    问题浅显,见笑了。

    [回复]

    52nlp 回复:

    问题不浅显,其实我也没有仔细想过这个问题。不过Srilm在处理句子时,会自动在句子首尾加上标识,譬如<s>和</s>,不会考虑上一句的。
    如果仅仅统计频率,譬如3-gram,那么它只会考虑3个词的组合,所以对于一句话来说,第一个三元词就是:<s> w1 w2,至于<s> w1,就只考虑二元和一元了。

    [回复]

    Eric 回复:

    我觉得也是这样的,句首和句尾的标识符都算作一个word的。所以在估计第三个词的概率时是这个三元组 w1 w2;而对于第二个词则退化成了2-gram文法,即 w1;以此类推,第一个词则退化为1-gram。

    以上是我的理解。

    [回复]

    52nlp 回复:

    恩,如果要仔细推敲Srilm建议阅读我师兄jianzhu的《srilm 阅读文档》,以下选自其文档12:

    细解:第17行将句子中的每一个词以逆序方式保存到reversed中,同时
    保存reverse中实际有效的词数(即去除<s>和</s>后的词数)。然后执
    行第23-78行。
    第23-78行通过循环方式统计句子中的所有 ngram的概率值并将其叠加到
    totalProb中,同时统计句子的状态信息。
    举例:
    <s> 中国 人民 解放军 </s>
    经过第17行处理后,变为:
    </s> 解放军 人民 中国 <s>
    同时将len设为3
    因此23-78行的for循环处理ngram的顺序如下所示
    P(中国|<s>)
    P(人民|中国 <s>)
    p(解放军|人民 中国 <s>)
    P(<s>|解放军 人民 中国 <s>)

  6. Yu Yifeng on 三月 26th, 2010 10:52

    谢了!统计NLP,要周旋于语言本身的问题、各种统计算法、编程实现细节,每一样细啃起来都是没完没了,一件严重杀伤脑细胞的活啊!因此,交流、讨论意义更大。

    [回复]

    52nlp 回复:

    呵呵,有所为有所不为,欢迎多来52nlp交流!

    [回复]

  7. wangning on 三月 27th, 2010 11:10

    同意,多交流才能有更多收获!

    [回复]

    52nlp 回复:

    恩,欢迎大家多来交流!

    [回复]

  8. michael on 三月 30th, 2010 12:27

    请问如何用SRILM在大于1G的语料建立LM,如何拆分文件,能给个具体的例子么,谢谢!

    [回复]

    52nlp 回复:

    我机器比较烂,问了一下师弟,他们去年参加第五届全国机器翻译测试时训练的汉语语言模型用的语料库是“1.8G的搜狗语料+几百M的汉语语料”,所以问题不在于怎么用SRILM训练大于1G的语料库,而是你的机器性能是否足够强。我以前实验室用于训练的机器是8核加12G内存的服务器。
    另外,对于大语料库,可以考虑IRSTLM和RandLM。IRSTLM的是考虑拆分合并的,具体请参考:《语言模型工具IRSTLM安装及试用手记

    [回复]

    michaelym 回复:

    谢谢回复,那就是说可以直接将一个大语料训练的,不过前提是机器性能足够。
    另外我看了IRSTLM的安装,我down下来装就装不上。。可能我们的版本不太一样,方便提供一下你的版本么?

    [回复]

    52nlp 回复:

    抱歉,找了一下备份没找到,不过这个不应该是版本的问题,即使是,你目前所下载的也应该是更好的版本,试着重新编译一下看看。

发表评论






订阅52nlp:

Add to Google Reader or Homepage



Switch to our mobile site