[转]语言模型训练工具SRILM

SRILM是一个创建和使用统计语言模型的开源工具包,从1995年开始由SRI 口语技术与研究实验室(SRI Speech Technology and Research Laboratory)开发,如今仍然不断推出新版本,被普遍应用于语音识别、机器翻译等领域。这个工具包包含一组C++类库、一组进行语言模型训练和应用的可执行程序等。利用它能够很是方便地训练和应用语言模型。给定一组连续的词,调用SRILM提供的接口,能够获得这组词出现的几率。html

 http://www.jianshu.com/p/5b19605792abnode

SRILM初步使用
这里只介绍一下ngram-count工具的使用,其它的工具还在摸索中,有机会的话再写
一、从语料中生成n-gram统计文件
语料必须是已经分好词的,即用空格间隔开的,若是还未分词, 能够下载ICTCLAS分一下词,假设分完词后的语料文件为test.txt,这里咱们能够 用如下命令生成n-gram计数文件:

ngram-count -text text.txt -vocab wordlist.txt -order 3 -write count.txtlinux

这里的-text表示读入文件,-vocab表示使用字典,只有在字典中的词才会被统计个数,-order表示使用三元模型,默认即为3,-write为生成的n-gram计数文件,若是还想查看其它命令,可使用ngram-count -help查看
二、 从n-gram计数文件中生成语言模型

ngram-count -read count.txt -order 3 -lm test.lm -interpolate -kndiscountweb

这里的-read表示读入n-gram计数文件,-lm表示生成语言模型,-interpolate -kndiscount是平滑方法,具体介绍能够查看 Ngram折扣平滑算法
生成的 语言模型格式(ARPA格式)以下,这样能够有个比较直观的印象
SRILM笔记1 - 唯以不永怀 - 唯以不永怀
 
三、利用生成的语言模型计算测试集的困惑度

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

 

****************************************************************************************************************************************************************************************************************************************************************************************************************************************

斯坦福大学天然语言处理第四课“语言模型(Language Modeling)”

+8投票
 

1、课程介绍

斯坦福大学于2012年3月在Coursera启动了在线天然语言处理课程,由NLP领域大牛Dan Jurafsky 和 Chirs Manning教授授课:
https://class.coursera.org/nlp/

如下是本课程的学习笔记,以课程PPT/PDF为主,其余参考资料为辅,融入我的拓展、注解,抛砖引玉,欢迎你们在“我爱公开课”上一块儿探讨学习。

课件汇总下载地址:斯坦福大学天然语言处理公开课课件汇总

2、语言模型(Language Model)

1)N-gram介绍

在实际应用中,咱们常常须要解决这样一类问题:如何计算一个句子的几率?如:

  • 机器翻译:P(high winds tonite) > P(large winds tonite)
  • 拼写纠错:P(about fifteen minutes from) > P(about fifteen minuets from)
  • 语音识别:P(I saw a van) >> P(eyes awe of an)
  • 音字转换:P(你如今干什么|nixianzaiganshenme) > P(你西安在干什么|nixianzaiganshenme)
  • 自动文摘、问答系统、... ...

以上问题的形式化表示以下:

p(S)=p(w1,w2,w3,w4,w5,…,wn)

      =p(w1)p(w2|w1)p(w3|w1,w2)...p(wn|w1,w2,...,wn-1)//链规则

p(S)被称为语言模型,即用来计算一个句子几率的模型。

那么,如何计算p(wi|w1,w2,...,wi-1)呢?最简单、直接的方法是直接计数作除法,以下:

p(wi|w1,w2,...,wi-1) = p(w1,w2,...,wi-1,wi) / p(w1,w2,...,wi-1)

可是,这里面临两个重要的问题:数据稀疏严重;参数空间过大,没法实用。

基于马尔科夫假设(Markov Assumption):下一个词的出现仅依赖于它前面的一个或几个词。

  • 假设下一个词的出现依赖它前面的一个词,则有:

p(S)=p(w1)p(w2|w1)p(w3|w1,w2)...p(wn|w1,w2,...,wn-1)

      =p(w1)p(w2|w1)p(w3|w2)...p(wn|wn-1)   // bigram

  • 假设下一个词的出现依赖它前面的两个词,则有:

p(S)=p(w1)p(w2|w1)p(w3|w1,w2)...p(wn|w1,w2,...,wn-1)

      =p(w1)p(w2|w1)p(w3|w1,w2)...p(wn|wn-1,wn-2)  // trigram 

那么,咱们在面临实际问题时,如何选择依赖词的个数,即n。

  • 更大的n:对下一个词出现的约束信息更多,具备更大的辨别力
  • 更小的n:在训练语料库中出现的次数更多,具备更可靠的统计信息,具备更高的可靠性。

理论上,n越大越好,经验上,trigram用的最多,尽管如此,原则上,能用bigram解决,毫不使用trigram。

2)构造语言模型

一般,经过计算最大似然估计(Maximum Likelihood Estimate)构造语言模型,这是对训练数据的最佳估计,公式以下:

p(w1|wi-1) = count(wi1-, wi) / count(wi-1)

如给定句子集“<s> I am Sam </s>

                 <s> Sam I am </s>

                 <s> I do not like green eggs and ham </s>”

部分bigram语言模型以下所示:

c(wi)以下:

c(wi-1,wi)以下:

则bigram为:

那么,句子“<s> I want english food </s>”的几率为:

p(<s> I want english food </s>)=p(I|<s>)

                                                ×  P(want|I) 

                                                ×  P(english|want)  

                                                ×  P(food|english)  

                                                ×  P(</s>|food)

                                              =  .000031

为了不数据溢出、提升性能,一般会使用取log后使用加法运算替代乘法运算。

log(p1*p2*p3*p4) = log(p1) + log(p2) + log(p3) + log(p4)

推荐开源语言模型工具:

推荐开源n-gram数据集:

Total number of tokens: 1,306,807,412,486

Total number of sentences: 150,727,365,731

Total number of unigrams: 95,998,281

Total number of bigrams: 646,439,858

Total number of trigrams: 1,312,972,925

Total number of fourgrams: 1,396,154,236

Total number of fivegrams: 1,149,361,413

Total number of n-grams: 4,600,926,713

3)语言模型评价

语言模型构造完成后,如何肯定好坏呢? 目前主要有两种评价方法:

  • 实用方法:经过查看该模型在实际应用(如拼写检查、机器翻译)中的表现来评价,优势是直观、实用,缺点是缺少针对性、不够客观;
  • 理论方法:迷惑度/困惑度/混乱度(preplexity),其基本思想是给测试集赋予较高几率值的语言模型较好,公式以下:

由公式可知,迷惑度越小,句子几率越大,语言模型越好。使用《华尔街日报》训练数据规模为38million words构造n-gram语言模型,测试集规模为1.5million words,迷惑度以下表所示:

4)数据稀疏与平滑技术

大规模数据统计方法与有限的训练语料之间必然产生数据稀疏问题,致使零几率问题,符合经典的zip'f定律。如IBM, Brown:366M英语语料训练trigram,在测试语料中,有14.7%的trigram和2.2%的bigram在训练语料中未出现。

数据稀疏问题定义:“The problem of data sparseness, also known as the zero-frequency problem arises when analyses contain configurations that never occurred in the training corpus.  Then it is not possible to estimate probabilities from observed frequencies, and some other estimation scheme that can generalize (that configurations) from the training data has to be used. —— Dagan”。

人们为理论模型实用化而进行了众多尝试与努力,诞生了一系列经典的平滑技术,它们的基本思想是“下降已出现n-gram条件几率分布,以使未出现的n-gram条件几率分布非零”,且经数据平滑后必定保证几率和为1,详细以下:

  • Add-one(Laplace) Smoothing

加一平滑法,又称拉普拉斯定律,其保证每一个n-gram在训练语料中至少出现1次,以bigram为例,公式以下:

其中,V是全部bigram的个数。

承接上一节给的例子,经Add-one Smoothing后,c(wi-1, wi)以下所示:

则bigram为:

在V >> c(wi-1)时,即训练语料库中绝大部分n-gram未出现的状况(通常都是如此),Add-one Smoothing后有些“喧宾夺主”的现象,效果不佳。那么,能够对该方法扩展以缓解此问题,如Lidstone's Law,Jeffreys-Perks Law。

  • Good-Turing Smoothing

其基本思想是利用频率的类别信息对频率进行平滑。调整出现频率为c的n-gram频率为c*:

可是,当nr+1或者nr > nr+1时,使得模型质量变差,以下图所示:

直接的改进策略就是“对出现次数超过某个阈值的gram,不进行平滑,阈值通常取8~10”,其余方法请参见“Simple Good-Turing”。

  • Interpolation Smoothing

无论是Add-one,仍是Good Turing平滑技术,对于未出现的n-gram都一视同仁,不免存在不合理(事件发生几率存在差异),因此这里再介绍一种线性插值平滑技术,其基本思想是将高阶模型和低阶模型做线性组合,利用低元n-gram模型对高元n-gram模型进行线性插值。由于在没有足够的数据对高元n-gram模型进行几率估计时,低元n-gram模型一般能够提供有用的信息。公式以下:

扩展方式(上下文相关)为:

λs能够经过EM算法来估计,具体步骤以下:

  • 首先,肯定三种数据:Training data、Held-out data和Test data;

  • 而后,根据Training data构造初始的语言模型,并肯定初始的λs(如均为1);
  • 最后,基于EM算法迭代地优化λs,使得Held-out data几率(以下式)最大化。
  • Kneser-Ney Smoothing
  • Web-scale LMs

如Google N-gram语料库,压缩文件大小为27.9G,解压后1T左右,面对如此庞大的语料资源,使用前通常须要先剪枝(Pruning)处理,缩小规模,如仅使用出现频率大于threshold的n-gram,过滤高阶的n-gram(如仅使用n<=3的资源),基于熵值剪枝,等等。

另外,在存储优化方面也须要作一些优化,如使用trie数据结构存储,借助bloom filter辅助查询,把string映射为int类型处理(基于huffman编码、Varint等方法),float/double转成int类型(如几率值精确到小数点后6位,而后乘10E6,便可将浮点数转为整数)。

2007年Google Inc.的Brants et al.提出了针对大规模n-gram的平滑技术——“Stupid Backoff”,公式以下:

数据平滑技术是构造高鲁棒性语言模型的重要手段,且数据平滑的效果与训练语料库的规模有关。训练语料库规模越小,数据平滑的效果越显著;训练语料库规模越大,数据平滑的效果越不显著,甚至能够忽略不计——锦上添花。

5)语言模型变种

  • Class-based N-gram Model

该方法基于词类创建语言模型,以缓解数据稀疏问题,且能够方便融合部分语法信息。

  • Topic-based N-gram Model

该方法将训练集按主题划分红多个子集,并对每一个子集分别创建N-gram语言模型,以解决语言模型的主题自适应问题。架构以下:

  • Cache-based N-gram Model

该方法利用cache缓存前一时刻的信息,以用于计算当前时刻几率,以解决语言模型动态自适应问题。

-People tends to use words as few as possible in the article. 

-If a word has been used, it would possibly be used again in the future.

架构以下:

猜想这是目前QQ、搜狗、谷歌等智能拼音输入法所采用策略,即针对用户个性化输入日志创建基于cache的语言模型,用于对通用语言模型输出结果的调权,实现输入法的个性化、智能化。因为动态自适应模块的引入,产品越用越智能,越用越好用,越用越上瘾。

  • Skipping N-gram Model&Trigger-based N-gram Model

两者核心思想都是刻画远距离约束关系。

  • 指数语言模型:最大熵模型MaxEnt、最大熵马尔科夫模型MEMM、条件随机域模型CRF

传统的n-gram语言模型,只是考虑了词形方面的特征,而没有词性以及语义层面上的知识,而且数据稀疏问题严重,经典的平滑技术也都是从统计学角度解决,未考虑语法、语义等语言学做用。

MaxEnt、MEMM、CRF能够更好的融入多种知识源,刻画语言序列特色,较好的用于解决序列标注问题。

3、参考资料

  1. Lecture Slides: Language Modeling
  2. http://en.wikipedia.org
  3. 关毅,统计天然语言处理基础 课程PPT
  4. 微软拼音输入法团队,语言模型的基本概念
  5. 肖镜辉,统计语言模型简介
  6. fandywang,统计语言模型
  7. Stanley F. Chen and Joshua Goodman.  An  empirical study of smoothing techniques for  language modeling. Computer Speech and 
    Language, 13:359-394, October 1999. 
  8. Thorsten Brants et al. Large Language Models in Machine Translation
  9. Gale & Sampson, Good-Turing Smoothing Without Tears
  10. Bill MacCartney,NLP Lunch Tutorial: Smoothing,2005

 

P.S. :  基于本次笔记,整理了一份slides,分享下:统计语言模型(fandywang 20121106) 

 

****************************************************************************************************************************************************************************************************************************************************************************************************************************************

 

 

转自:http://blog.csdn.net/yqzhao/article/details/7932056

最近学习了一下SRILM的源代码,分享一下学习笔记(最新完整版本),但愿可以对你们了解SRI语言模型训练工具备些许帮助。限于本人水平,不足之处,望你们多多指教。

笔记的主要内容使用starUML及其逆向工程工具绘制,主要针对SRILM的训练(ngram-count),内含5个jpg文件:

  1. 类图--与ngram-count相关的主要类的静态图;
  2. ngram-count--从语料训练出模型的主要流程;
  3. lmstats.countfile--ngram-count的子流程,用于构建词汇表和统计ngram的频度
  4. ngram.estimate--ngram-count的子流程,在词汇表和ngram频度的基础上计算ngram条件几率以及backoff权值的过程
  5. ngram.read--与训练无关,分析读取ARPA格式的语言模型的过程

SRILM训练ngram的过程简单说来,可归结为如下几个步骤:

  1. 先创建Vocab(词汇表)类型与LMStats(用于ngram统计)类型的两个实例(即vocab和intStats,intStats中存有vocab的一个引用);
  2. 调用intStats的countFile函数完成(对输入语料文件中)ngram的统计,这其中也包括词汇表的构建(以及词汇索引映射的构建);
  3. 创建Discount*的一个数组(长度为order参数的值,即要训练的模型的ngram的最大阶数),按选定的平滑方式计算各阶的折扣率,并保存其中;
  4. 创建Ngram类型(语言模型类)的实例(即lm),调用其estimate函数(以折扣率数组和ngram统计类的对象为参数),计算各阶ngram的几率及bow,完成语言模型的训练;
  5. 按训练命令参数选项,输出训练好的语言模型、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,根据上式算出其相应的(条件)几率值。

 
1
相关文章
相关标签/搜索