语言模型训练工具SRILM详解

  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.

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

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

此条目发表在机器翻译, 语言模型分类目录,贴了, , , , , , , , 标签。将固定链接加入收藏夹。

语言模型训练工具SRILM详解》有 47 条评论

  1. wqfeng说:

    请问下,怎么调用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说:

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

    [回复]

    admin 回复:

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

    [回复]

  3. wqfeng说:

    好,谢谢

    [回复]

  4. wei说:

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

    [回复]

    52nlp 回复:

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

    [回复]

  5. Yu Yifeng说:

    请问,语言模型计算频率时,如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说:

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

    [回复]

    52nlp 回复:

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

    [回复]

  7. wangning说:

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

    [回复]

    52nlp 回复:

    恩,欢迎大家多来交流!

    [回复]

  8. michael说:

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

    [回复]

    52nlp 回复:

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

    [回复]

    michaelym 回复:

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

    [回复]

    52nlp 回复:

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

  9. Kevin说:

    有没有办法让他trian的LM里面的不是-99,而是保持原状?

    [回复]

    52nlp 回复:

    要改的话可能需要修改源代码重新编译了。

    [回复]

  10. duckyaya说:

    我想问一下europarl-v3b.en这个文件的格式是怎么样的?

    一行句话按照空格隔开吗?

    另外:如果我想训练中文的语言模型,是不是也按照同样的格式给SRILM训练就可以了 🙂

    以前没怎么用过,多谢帮忙!

    [回复]

    52nlp 回复:

    嗯,就是一行普通的文本,按空格分开,训练中文的话先分一下词。

    [回复]

  11. jeffery说:

    您好,看你们的文章,感觉你们对SRILM toolkit很熟悉,我博士方向也是语言模型相关,目前想把我们自己的语言模型,加到这个toolkit里面来,你们有空的话方便的话想跟你们交流下,方便的话能跟我回个邮件吗?(junfeiguo@hotmail.com)

    [回复]

    52nlp 回复:

    这个可以考虑先梳理一下srilm的代码结构,建议你仔细阅读一下《srilm阅读文档》系列:
    http://blog.chinaunix.net/u1/58264/index.html

    另外,既然想将你们自己的语言模型加入到srilm中,可以直接联系原作者——SRI实验室的Andreas Stolcke,我觉得找他更合适!

    [回复]

  12. Kelp说:

    有没有工具可以使用生成好的LM计算句子的观测概率的???

    Input: S = (w1,w2,w3…wn)
    Output: P(s)=P(w1)p(w2|w1)…(wn|wn-1)

    thanks.

    [回复]

    52nlp 回复:

    Srilm本身就支持,你可以用ngarm,加上参数–ppl计算,具体见:http://www.speech.sri.com/projects/srilm/manpages/ngram.1.html

    -ppl textfile
    Compute sentence scores (log probabilities) and perplexities from the sentences in textfile, which should contain one sentence per line. The -debug option controls the level of detail printed, even though output is to stdout (not stderr).

    -debug 0
    Only summary statistics for the entire corpus are printed, as well a partial statistics for each input portion delimited by escaped lines (see -escape). These statistics include the number of sentences, words, out-of-vocabulary words and zero-probability tokens in the input, as well as its total log probability and perplexity. Perplexity is given with two different normalizations: counting all input tokens (“ppl”) and excluding end-of-sentence tags (“ppl1”).
    -debug 1
    Statistics for individual sentences are printed.
    -debug 2
    Probabilities for each word, plus LM-dependent details about backoff used etc., are printed.
    -debug 3
    Probabilities for all words are summed in each context, and the sum is printed. If this differs significantly from 1, a warning message to stderr will be issued.

    [回复]

  13. conanlancc说:

    我想问下 ngram -ppl算每个句子的观测概率时,-ppl可以批处理算test集么,参数可以用test集的文件列表么

    [回复]

    52nlp 回复:

    -ppl textfile本身用的就是文件本身

    [回复]

  14. 叶俊说:

    你好,问一下比如在ngram-count 中的打折算法cdiscount 会有不同的参数比例(0<n<1),这后面的参数比例大小对生成的语言模型有什么影响呢?

    [回复]

    52nlp 回复:

    这个不太清楚,可以通过测试集评估一下不同系数对应的困惑度吧。

    [回复]

  15. 火星小鬼说:

    您好,我使用的是win7系统,下载了srilm,然后在VS2010中编译通过,再使用cmd执行的ngram-count命令。但得到的.count文件有问题,下面是得到的.count文件:
    1578
    1578
    1576
    2
    75009
    73431
    71855
    1576
    1578
    1578
    不知道为什么会这样,该怎样解决。希望能得到您的帮助。

    [回复]

    52nlp 回复:

    按说应该出来的是ngram及其计数吧,看看你的文件编码是否有问题,其他不清楚了。

    [回复]

  16. 火星小鬼说:

    .count文件中不显示统计的是哪个词。

    [回复]

  17. 火星小鬼说:

    您好,我用c#语言写的程序,在该程序中调用了ngram-count.exe和ngram.exe,调用ngram-count.exe成功,但调用ngram.exe一直没有结果。纠结很长时间了,希望获得您的帮助!

    [回复]

  18. 火星小鬼说:

    解决了,是因为ngram有参数>,而控制台不接受参数>,所以不能生成结果文件,但可以通过Process.StandardOutput.ReadToEnd()获得测试结果。仍感谢您为大家提供这样的一个交流平台!

    [回复]

    52nlp 回复:

    抱歉,个人能力有限,不能解决所有问题,自己能解决最好。

    [回复]

  19. 任真说:

    您好,我以前都是做孤立词识别的,现在转到连续语音识别这边,最近 一周刚开始看语言模型训练,我在网上扒了一些数据,对这些数据按句子进行分行,词与词之间的空格,是不是要利用词典进行?从哪儿能下载到这个中文词典的数据,您能推荐一下吗?

    [回复]

    52nlp 回复:

    可以看看这篇文章:http://www.52nlp.cn/%E4%B8%AD%E6%96%87%E5%88%86%E8%AF%8D%E5%85%A5%E9%97%A8%E4%B9%8B%E8%B5%84%E6%BA%90

    [回复]

    renzhen 回复:

    非常感谢,已经做出来了!

    [回复]

  20. renzhen说:

    您好,您用过Palmkit做语言模型吗??网上的资料不是很多,不知道您是否用过??

    [回复]

    52nlp 回复:

    抱歉,没有

    [回复]

  21. 雨夜说:

    您好,我想请问一下我在vs2010中使用srilm时,其中programs里的项目都不能生成成功是怎么回事呢?还有,麻烦您能介绍一下如何在vs2010中使用srilm并运行吗?谢谢

    [回复]

    52nlp 回复:

    抱歉,我很久没在windows下写c++程序了,也不玩vs2010,主要在Linux下工作,没办法解决你的问题。

    [回复]

  22. 雷小天说:

    我要生成中文 character bigram, 但我用srilm 工具,发现只有词的bigram, 请问, 我要建立中文character bigram, 应该怎么做?

    [回复]

    52nlp 回复:

    那你就先把中文文本按单个字分开然后作为srilm的输入就可以了,不要分词

    [回复]

    雷小天 回复:

    非常感谢回复,再问个菜鸟问题, 如果现在已经有了中文 字(character) bigram, 在我的应用程序如何使用bigram模型文件,比如ocr程序,我要获取词的概率是多少, 是要自己写代码读取arpa文件,读出概率大小吗? 如果这个词在bigram模型文件不存在, 那么概率应该是多少? 或srilm工具是否提供此类api, 或有其他开源库? 谢谢

    [回复]

发表评论

电子邮件地址不会被公开。 必填项已用*标注