[转]语言模型训练工具SRILM
SRILM是一个建立和使用统计语言模型的开源工具包,从1995年开始由SRI 口语技术与研究实验室(SRI Speech Technology and Research Laboratory)开发,现在仍然不断推出新版本,被广泛应用于语音识别、机器翻译等领域。这个工具包包含一组C++类库、一组进行语言模型训练和应用的可执行程序等。利用它可以非常方便地训练和应用语言模型。给定一组连续的词,调用SRILM提供的接口,可以得到这组词出现的概率。
http://www.jianshu.com/p/5b19605792ab
ngram-count -text text.txt -vocab wordlist.txt -order 3 -write count.txt
这里的-text表示读入文件,-vocab表示使用字典,只有在字典中的词才会被统计个数,-order表示使用三元模型,默认即为3,-write为生成的n-gram计数文件,如果还想查看其它命令,可以使用ngram-count -help查看ngram-count -read count.txt -order 3 -lm test.lm -interpolate -kndiscount
这里的-read表示读入n-gram计数文件,-lm表示生成语言模型,-interpolate -kndiscount是平滑方法,具体介绍可以查看Ngram折扣平滑算法![SRILM笔记1 - 惟以不永怀 - 惟以不永怀](http://img9.ph.126.net/IJSblrhx0uT8lzYuuObU7w==/6597244589005076249.jpg)
ngram -ppl new.txt -order 3 -lm test.lm > out.ppl
这里的-ppl是指要计算的测试集,-lm加载之前训练好的语言模型,同时将输入放到out.ppl文件中****************************************************************************************************************************************************************************************************************************************************************************************************************************************
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
****************************************************************************************************************************************************************************************************************************************************************************************************************************************
转自:
一、小数据
假设有去除特殊符号的训练文本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。
二、大数据(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
****************************************************************************************************************************************************************************************************************************************************************************************************************************************
斯坦福大学自然语言处理第四课“语言模型(Language Modeling)”
****************************************************************************************************************************************************************************************************************************************************************************************************************************************
转自:http://blog.csdn.net/yqzhao/article/details/7932056
最近学习了一下SRILM的源代码,分享一下学习笔记(最新完整版本),希望能够对大家了解SRI语言模型训练工具有些许帮助。限于本人水平,不足之处,望大家多多指教。
笔记的主要内容使用starUML及其逆向工程工具绘制,主要针对SRILM的训练(ngram-count),内含5个jpg文件:
- 类图--与ngram-count相关的主要类的静态图;
- ngram-count--从语料训练出模型的主要流程;
- lmstats.countfile--ngram-count的子流程,用于构建词汇表和统计ngram的频度
- ngram.estimate--ngram-count的子流程,在词汇表和ngram频度的基础上计算ngram条件概率以及backoff权值的过程
- ngram.read--与训练无关,分析读取ARPA格式的语言模型的过程
SRILM训练ngram的过程简单说来,可归结为以下几个步骤:
- 先建立Vocab(词汇表)类型与LMStats(用于ngram统计)类型的两个实例(即vocab和intStats,intStats中存有vocab的一个引用);
- 调用intStats的countFile函数完成(对输入语料文件中)ngram的统计,这其中也包括词汇表的构建(以及词汇索引映射的构建);
- 建立Discount*的一个数组(长度为order参数的值,即要训练的模型的ngram的最大阶数),按选定的平滑方式计算各阶的折扣率,并保存其中;
- 建立Ngram类型(语言模型类)的实例(即lm),调用其estimate函数(以折扣率数组和ngram统计类的对象为参数),计算各阶ngram的概率及bow,完成语言模型的训练;
- 按训练命令参数选项,输出训练好的语言模型、ngram的频度统计结果、词汇表、词汇索引表等到相应的指定文件中。
笔记中对这个流程做了较详细的说明,下面补充两点内容(主要数据结构的内存布局和ngram条件概率计算式中的参量说明),可以作为笔记内容的基线,便于从总体上把握ngram-count的逻辑。
一、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的概率值(的对数)
二、参数说明
ngram的概率值计算公式为(参见http://ssli.ee.washington.edu/people/duh/papers/flm-manual.pdf):
SRILM训练语言模型的目的就是统计给定语料中的ngram,根据上式算出其相应的(条件)概率值。
- 顶
- 1
- 踩