SRILM学习笔记说明

最近学习了一下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的逻辑。

一、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,根据上式算出其相应的(条件)概率值。

没有更多推荐了,返回首页