Srilm的全称是Stanford Research Institute Language Modeling Toolkit 。他被用来构建和应用统计语言模型,主要用于语音识别,统计标注和切分,以及机器翻译等工作。
一、windows下编译
ubuntu编译,可以再52nlp中去找。
VC编译,可以再下面链接找,
http://www.keithv.com/software/srilm/
以VS2008为例,可以下载最新的SRILM
Instructions
- Download and unpack the SRILM toolkit.
- Unzip the below solution archive to the SRILM root directory.
- Load the srilm.sln in Visual Studio 2008.
- Select either Debug or Release in Build->Configuration Manager
- Right-click on each project in the libs folder, select Build.
- Build any of the command-line utilities you need.
简单说,
1,下载SRILM工具包
2, 解压工具包,
3,把链接出下载srilm.sln用VS2008打开,
4,把工具包的东西都放到srilm.sln所在文件夹下,
5,把LIB的那个project编译一下,
6,把其他project都编译一下。
VC中编译SRILM就大功告成了。
ps:直接按照上面的步骤来做并不能成功编译,原因是有几个工程缺少头文件,到相关目录下找到头文件加上即可。
更多资料:http://cqusuperyang.blog.163.com/blog/static/3416516020126292910902/
二、实用简介
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,均为困惑度。其公式稍有不同,如下:
;
其中Sen和Word分别代表句子和单词数。