SRILM是一个创建和使用统计语言模型的开源工具包,从1995年开始由SRI 口语技术与研究实验室(SRI Speech Technology and Research Laboratory)开发,如今仍然不断推出新版本,被普遍应用于语音识别、机器翻译等领域。这个工具包包含一组C++类库、一组进行语言模型训练和应用的可执行程序等。利用它能够很是方便地训练和应用语言模型。给定一组连续的词,调用SRILM提供的接口,能够获得这组词出现的几率。html
http://www.jianshu.com/p/5b19605792abnode
ngram-count -text text.txt -vocab wordlist.txt -order 3 -write count.txtlinux
这里的-text表示读入文件,-vocab表示使用字典,只有在字典中的词才会被统计个数,-order表示使用三元模型,默认即为3,-write为生成的n-gram计数文件,若是还想查看其它命令,可使用ngram-count -help查看ngram-count -read count.txt -order 3 -lm test.lm -interpolate -kndiscountweb
这里的-read表示读入n-gram计数文件,-lm表示生成语言模型,-interpolate -kndiscount是平滑方法,具体介绍能够查看 Ngram折扣平滑算法ngram -ppl new.txt -order 3 -lm test.lm > out.ppl算法
这里的-ppl是指要计算的测试集,-lm加载以前训练好的语言模型,同时将输入放到out.ppl文件中****************************************************************************************************************************************************************************************************************************************************************************************************************************************ubuntu
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句:
一、从语料库中生成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次。
二、从上一步生成的计数文件中训练语言模型:
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 ...
三、利用上一步生成的语言模型计算测试集的困惑度:
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架构
****************************************************************************************************************************************************************************************************************************************************************************************************************************************
转自:
1、小数据
假设有去除特殊符号的训练文本trainfile.txt,以及测试文本testfile.txt,那么训练一个语言模型以及对其进行评测的步骤以下:
1:词频统计
ngram-count -text trainfile.txt -order 3 -write trainfile.count
其中-order 3为3-gram,trainfile.count为统计词频的文本
2:模型训练
ngram-count -read trainfile.count -order 3 -lm trainfile.lm -interpolate -kndiscount
其中trainfile.lm为生成的语言模型,-interpolate和-kndiscount为插值与折回参数
3:测试(困惑度计算)
ngram -ppl testfile.txt -order 3 -lm trainfile.lm -debug 2 > file.ppl
其中testfile.txt为测试文本,-debug 2为对每一行进行困惑度计算,相似还有-debug 0 , -debug 1, -debug 3等,最后 将困惑度的结果输出到file.ppl。
2、大数据(BigLM)
对于大文本的语言模型训练不能使用上面的方法,主要思想是将文本切分,分别计算,而后合并。步骤以下:
1:切分数据
split -l 10000 trainfile.txt filedir/
即每10000行数据为一个新文本存到filedir目录下。
2:对每一个文本统计词频
make-bath-counts filepath.txt 1 cat ./counts -order 3
其中filepath.txt为切分文件的全路径,能够用命令实现:ls $(echo $PWD)/* > filepath.txt,将统计的词频结果存放在counts目录下
3:合并counts文本并压缩
merge-batch-counts ./counts
不解释
4:训练语言模型
make-big-lm -read ../counts/*.ngrams.gz -lm ../split.lm -order 3
用法同ngram-counts
5: 测评(计算困惑度)
ngram -ppl filepath.txt -order 3 -lm split.lm -debug 2 > file.ppl
****************************************************************************************************************************************************************************************************************************************************************************************************************************************
转自:http://www.leexiang.com/building-a-large-lm-with-srilm
原理上,语言模型模型越大,机器翻译质量越好,可是当语言模型的训练集很是大时,例如GB级别的时候,受限于时间和机器的内存等因素,传统的ngram-count训练方式没法知足实际须要,所以srilm的FAQ中提到了训练语言模型的方法,基本思想就是将大文件拆分红多个小文件,而后再将多个小文件的count合并,完成最终的语言模型训练。
其基本方法:
1. 把大文件分割成小文件,放在一个目录下,而后生成一个文件名列表文件,如filelist ,通常使用按行分割的形式,split -l 100 test.txt out
使用split将一个大文件分红最多26*26(使用字母后缀,这是默认的行为)或者是100(使用数字后缀,须要-d参数)个文件,能够将文件按行拆分(使用-l num参数)或者是按大小拆分(使用-b size参数),还能够给出文件的前缀(或者使用默认的x)。在进行拆分的时候将文件会将每num行放到一个文件中,文件按字母序产生,对于语言模型的使用来讲,通常使用按行分割的形式 split -l 100 big_file split_file
2. 使用 make-batch-counts分别统计各个分割文件中的词频,make-batch-counts filelist 5 cat counts -order 5,其中filelist为须要统计的小文件名列表,5表示每5个小文件用于一次ngram-count训练,cat lmcount 表示输出到counts,后续则是提交给ngram-count的参数
3. 使用merge-batch-counts将全部的小count文件合并成一个大的count文件,merge-batch-counts [ -l N ] counts [ filename-list ],将counts目录下的全部文件合并成一个文件,若是有些文件不用参与合并,能够在最后添加一个filename-list,只有在filename-list里面出现的文件才会被用于合并;-l N参数之处,一次同时合并N个文件
4. 使用make-big-lm生成语言模型,参数相似于ngram-count
更详细的方法能够参考 http://joshua-decoder.org/4.0/large-lms.html
****************************************************************************************************************************************************************************************************************************************************************************************************************************************
****************************************************************************************************************************************************************************************************************************************************************************************************************************************
转自:http://blog.csdn.net/yqzhao/article/details/7932056
最近学习了一下SRILM的源代码,分享一下学习笔记(最新完整版本),但愿可以对你们了解SRI语言模型训练工具备些许帮助。限于本人水平,不足之处,望你们多多指教。
笔记的主要内容使用starUML及其逆向工程工具绘制,主要针对SRILM的训练(ngram-count),内含5个jpg文件:
SRILM训练ngram的过程简单说来,可归结为如下几个步骤:
笔记中对这个流程作了较详细的说明,下面补充两点内容(主要数据结构的内存布局和ngram条件几率计算式中的参量说明),能够做为笔记内容的基线,便于从整体上把握ngram-count的逻辑。
1、SRILM中所用到的主要数据结构的内存布局
Trie:trie树,以hash表实现,作ngram统计和计算ngram的几率值以及backoff weight都以此为基础
Vocab:词汇表,内含一个以词形为键获取索引值的hash表,以及一个经过索引值(即下标)得到词形的Array
LMStats:负责ngram频度统计,主要成员counts是一棵trie树,从树根到某个结点的路径给出了一个以正常顺序(从左向右)的ngram的各个元的索引
BOnode:Ngram 的主要基础数据结构,用于存储n-1阶gram的backoff权值(存于bow域),以及以此n-1阶gram为历史的全部n阶gram的几率值(存于 probs域);probs域为一hash表,以n阶gram的第n个元素(在词汇表vocab中)的索引值为键,以此n阶gram的频度的log值(以 10为底)为值
Ngram:继承LM,其主要成员contexts为一棵trie树,从根到某个结点的路径是一个n-1阶gram的逆序(从右向左),其bow域存放该n-1-gram在正序状况下的backoff权值,其probs域则为以(正序下)该n-1-gram为历史的(全部)n-gram的几率值(的对数)
2、参数说明
ngram的几率值计算公式为(参见http://ssli.ee.washington.edu/people/duh/papers/flm-manual.pdf):
SRILM训练语言模型的目的就是统计给定语料中的ngram,根据上式算出其相应的(条件)几率值。