来自于:我爱自然语言处理

原始地址:http://www.52nlp.cn/language-model-training-tools-srilm-details

语言模型训练工具SRILM详解

  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分别代表句子和单词数。

具体的使用参数设置:

转载地址: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的使用(二)相关推荐

  1. 【Natural Language Processing】语言模型训练工具Srilm的安装及使用简介

      实习做了一段时间的语言模型,使用到了Srilm这个工具,简单做一下记录,这个是一个统计和分析语言模型的工具,据说年龄很大了,可能比我大?总之它可以很方便的统计语料的n-gram,以及构建语言模型. ...

  2. srilm的安装与使用(标贝科技)

    欢迎体验标贝语音开放平台 地址:https://ai.data-baker.com/#/?source=qaz123 (注:填写邀请码hi25d7,每日免费调用量还可以翻倍) ​​​​​​ 一.简介 ...

  3. 条形码?二维码?生成、解析都在这里!

    二维码生成与解析 一.生成二维码 二.解析二维码 三.生成一维码 四.全部的代码 五.pom依赖 直接上代码: 一.生成二维码 public class demo {private static fi ...

  4. 【ReactiveX】基于Golang pmlpml/RxGo程序包的二次开发

    基于Golang pmlpml/RxGo程序包的二次开发[阅读时间:约20分钟] 一.ReactiveX & RxGo介绍 1.ReactiveX 2.RxGo 二.系统环境&项目介绍 ...

  5. 2022-2028年中国二次供水产业发展动态及投资战略规划报告

    [报告类型]产业研究 [报告价格]4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了中国二次供水行业市场行业相关概述.中国二次供 ...

  6. 2022-2028年中国二次供水设备行业研究及前瞻分析报告

    [报告类型]产业研究 [报告价格]4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了中国二次供水设备行业市场行业相关概述.中国二 ...

  7. OpenCV 笔记(08)— 二维点、三维点、基于 Mat 的 std::vector 等常用数据结构的定义和输出

    1. 定义和输出二维点 Point2f p2(3, 4);cout << "[二维点] is "<< endl << p2 << e ...

  8. python内置库之学习ctypes库(二)

    ctypes库踩坑日记2 一.自己实现一个dll文件,再用python的ctypes库调用思路1更清晰 二.生成dll文件 三.ctypes库调用 一.自己实现一个dll文件,再用python的cty ...

  9. 前端Vue学习之路(二)-Vue-router路由

    Vue学习之路 (二) Vue-router(基础版) 一.增加静态路由 二.动态路由+路由嵌套+404页面 三. 编程式导航 四.命名路由 五.命名视图 六.重定向和起别名 1.重定向 2.起别名 ...

最新文章

  1. 『原创』用C++开发WM应用系列(6)——深化ListBox控件
  2. 不让复制是不可能的----js获取选中文字
  3. JZOJ 100024. 【NOIP2016提高A组模拟7.6】数球
  4. hdu 1576 A/B
  5. 前端学习(490):javascript实现
  6. 【笑话】骂人的最高境界
  7. 开源的49款Java 网络爬虫软件
  8. 个推消息推送SDK通知栏铃声功能解析及使用攻略
  9. matlab三踪示波器,3.2 示波器CSV数据导入MATLAB
  10. 知识图谱和行业领域的结合产物-KGB知识图谱介绍
  11. Rstudio插入Excel数据
  12. 借助ChatGPT自动生成PPT
  13. 在Ubuntu下载Python3.6.2并建立软连接
  14. 【iOS】简单易用的折线图控件
  15. BZOJ 2209 [Jsoi2011] 括号序列
  16. kubernetes资源--secret和ServiceAccount
  17. 计算机游戏测试,性能强劲又不张扬:IT之家游戏测试电脑推荐
  18. oracle可视化图标,Oracle Data Visualization Desktop 试用
  19. 35 岁的程序员将何去何从——阮一峰
  20. 通达信l2数据接口具体有哪些功能可提供?

热门文章

  1. MTK哪些芯片支援VoLTE Feature
  2. 天青色等烟雨,而我在等你
  3. Oracle 11gr2 RAC安装笔记(五)安装 Database 软件
  4. 基于android的课程表签到考试提醒app
  5. 指纹浏览器浏览器是什么?指纹浏览器一般用来做什么用?
  6. if、else、else if的用法
  7. BlueHound 主机威胁狩猎
  8. 通讯录同音姓按照汉字排序
  9. 如何打开或关闭windows的测试模式
  10. C语言循环语句专项练习题