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,输出内容为:

分为两列,第一列为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语言模型训练的步骤细节。

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为输出结果文件;其他参数同上。输出文件结果如下:

总结:
一、小数据

假设有去除特殊符号的训练文本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

这篇文章是转载的
https://blog.csdn.net/u011982340/article/details/39474857

下面的文章介绍了插值,裁减等
https://blog.csdn.net/xmdxcsj/article/details/50353689

基本的命令行是
语言模型裁减
ngram -lm ${oldlm} -order 2 -prune ${thres} -write-lm ${newlm}

语言模型插值

##功能
#用于多个语言模型之间插值合并,以期望改善模型的效果
##参数
#模型插值:
#  -mix-lm 用于插值的第二个ngram模型,-lm是第一个ngram模型
#  -lambda 主模型(-lm对应模型)的插值比例,0~1,默认是0.5
#  -mix-lm2 用于插值的第三个模型
#  -mix-lambda2 用于插值的第二个模型(-mix-lm对应的模型)的比例,那么第二个模型的比例为1-lambda-mix-lambda2
#  -vocab 当两个模型的词典不一样的时候,使用该参数限制词典列表,没有效果
#  -limit-vocab 当两个模型的词典不一样的时候,使用该参数限制词典列表,没有效果
ngram -lm ${mainlm} -order 2 -mix-lm ${mixlm} -lambda 0.8 -write-lm ${mergelm}
————————————————
版权声明:本文为CSDN博主「xmucas」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xmdxcsj/article/details/50353689

词表的限制使用

##功能
#对已有的语言模型,使用新的字典进行约束,产生新的语言模型
#1.n-grams的概率保持不变
#2.回退概率重新计算
#3.增加新的一元回退概率
##参数
#模型裁剪:
#  -vocab 词典单词的列表,不包括发音
#  -write-lm 新的语言模型
change-lm-vocab -vocab ${vocab} -lm ${oldlm} -write-lm ${newlm} -order 2
————————————————
版权声明:本文为CSDN博主「xmucas」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xmdxcsj/article/details/50353689

还有最后一个与词典相关的是

--limit-vocab

下面贴一个网页
https://blog.csdn.net/GavinLiu1990/article/details/81363936

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐