srilm的使用(二)
来自于:我爱自然语言处理
语言模型训练工具SRILM详解
关于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分别代表句子和单词数。
具体的使用参数设置:
转载地址:http://blog.csdn.net/xmdxcsj/article/details/50353689
一、基本训练
基本参数
##功能
#读取分词后的text文件或者count文件,然后用来输出最后汇总的count文件或者语言模型
##参数
#输入文本:
# -read 读取count文件
# -text 读取分词后的文本文件
#词典文件:
# -vocab 限制text和count文件的单词,没有出现在词典的单词替换为<unk>;如果没有,所有的单词将会被自动加入词典
# -limit-vocab 只限制count文件的单词(对text文件无效),没有出现在词典里面的count将会被丢弃
# -write-vocab 输出词典
#语言模型:
# -lm 输出语言模型
# -write-binary-lm 输出二进制的语言模型
# -sort 输出语言模型gram排序
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
有两种训练方法,分别如下:
#choice1: text->count->lm
#ngram-count -text $text -vocab ${vocab} -order 2 -sort -tolower -lm ${arpa}#choice2: text->count count->lm
#ngram-count -text ${text} -order 2 -sort -tolower -write ${count}
- 1
- 2
- 3
- 4
- 5
二、语言模型打分
##功能
#用于评估语言模型的好坏,或者是计算特定句子的得分,用于语音识别的识别结果分析。
##参数
#计算得分:
# -order 模型阶数,默认使用3阶
# -lm 使用的语言模型
# -use-server S 启动语言模型服务,S的形式为port@hostname
# -ppl 后跟需要打分的句子(一行一句,已经分词),ppl表示所有单词,ppl1表示除了</s>以外的单词
# -debug 0 只输出整体情况
# -debug 1 具体到句子
# -debug 2 具体每个词的概率
#产生句子:
# -gen 产生句子的个数
# -seed 产生句子用到的random seed
ngram -lm ${lm} -order 2 -ppl ${file} -debug 1 > ${ppl}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
三、语言模型剪枝
##功能
#用于减小语言模型的大小,剪枝原理参考(http://blog.csdn.net/xmdxcsj/article/details/50321613)
##参数
#模型裁剪:
# -prune threshold 删除一些ngram,满足删除以后模型的ppl增加值小于threshold,越大剪枝剪得越狠
# -write-lm 新的语言模型
ngram -lm ${oldlm} -order 2 -prune ${thres} -write-lm ${newlm}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
四、语言模型合并
##功能
#用于多个语言模型之间插值合并,以期望改善模型的效果
##参数
#模型插值:
# -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}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
在合并语言模型之前,可以使用脚本计算出最好的比例,参考srilm的compute-best-mix脚本
五、语言模型使用词典限制
有两种方法可以根据给定的词典对模型加以限制
一种是在训练的时候使用-vocab限制
另外一种是在训练完成以后,使用srilm的脚本,如下:
##功能
#对已有的语言模型,使用新的字典进行约束,产生新的语言模型
#1.n-grams的概率保持不变
#2.回退概率重新计算
#3.增加新的一元回退概率
##参数
#模型裁剪:
# -vocab 词典单词的列表,不包括发音
# -write-lm 新的语言模型
change-lm-vocab -vocab ${vocab} -lm ${oldlm} -write-lm ${newlm} -order 2
srilm的使用(二)相关推荐
- 【Natural Language Processing】语言模型训练工具Srilm的安装及使用简介
实习做了一段时间的语言模型,使用到了Srilm这个工具,简单做一下记录,这个是一个统计和分析语言模型的工具,据说年龄很大了,可能比我大?总之它可以很方便的统计语料的n-gram,以及构建语言模型. ...
- srilm的安装与使用(标贝科技)
欢迎体验标贝语音开放平台 地址:https://ai.data-baker.com/#/?source=qaz123 (注:填写邀请码hi25d7,每日免费调用量还可以翻倍) 一.简介 ...
- 条形码?二维码?生成、解析都在这里!
二维码生成与解析 一.生成二维码 二.解析二维码 三.生成一维码 四.全部的代码 五.pom依赖 直接上代码: 一.生成二维码 public class demo {private static fi ...
- 【ReactiveX】基于Golang pmlpml/RxGo程序包的二次开发
基于Golang pmlpml/RxGo程序包的二次开发[阅读时间:约20分钟] 一.ReactiveX & RxGo介绍 1.ReactiveX 2.RxGo 二.系统环境&项目介绍 ...
- 2022-2028年中国二次供水产业发展动态及投资战略规划报告
[报告类型]产业研究 [报告价格]4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了中国二次供水行业市场行业相关概述.中国二次供 ...
- 2022-2028年中国二次供水设备行业研究及前瞻分析报告
[报告类型]产业研究 [报告价格]4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了中国二次供水设备行业市场行业相关概述.中国二 ...
- OpenCV 笔记(08)— 二维点、三维点、基于 Mat 的 std::vector 等常用数据结构的定义和输出
1. 定义和输出二维点 Point2f p2(3, 4);cout << "[二维点] is "<< endl << p2 << e ...
- python内置库之学习ctypes库(二)
ctypes库踩坑日记2 一.自己实现一个dll文件,再用python的ctypes库调用思路1更清晰 二.生成dll文件 三.ctypes库调用 一.自己实现一个dll文件,再用python的cty ...
- 前端Vue学习之路(二)-Vue-router路由
Vue学习之路 (二) Vue-router(基础版) 一.增加静态路由 二.动态路由+路由嵌套+404页面 三. 编程式导航 四.命名路由 五.命名视图 六.重定向和起别名 1.重定向 2.起别名 ...
最新文章
- 『原创』用C++开发WM应用系列(6)——深化ListBox控件
- 不让复制是不可能的----js获取选中文字
- JZOJ 100024. 【NOIP2016提高A组模拟7.6】数球
- hdu 1576 A/B
- 前端学习(490):javascript实现
- 【笑话】骂人的最高境界
- 开源的49款Java 网络爬虫软件
- 个推消息推送SDK通知栏铃声功能解析及使用攻略
- matlab三踪示波器,3.2 示波器CSV数据导入MATLAB
- 知识图谱和行业领域的结合产物-KGB知识图谱介绍
- Rstudio插入Excel数据
- 借助ChatGPT自动生成PPT
- 在Ubuntu下载Python3.6.2并建立软连接
- 【iOS】简单易用的折线图控件
- BZOJ 2209 [Jsoi2011] 括号序列
- kubernetes资源--secret和ServiceAccount
- 计算机游戏测试,性能强劲又不张扬:IT之家游戏测试电脑推荐
- oracle可视化图标,Oracle Data Visualization Desktop 试用
- 35 岁的程序员将何去何从——阮一峰
- 通达信l2数据接口具体有哪些功能可提供?