SRILM使用之ngram-count

因为经常使用SRILM来建立语言模型,因此把自己在使用过程中的一些心得写下来和大家分享一下。

-help

输出帮助信息

-version

输出版本信息

-order    n

设置计数时N-grams的最大阶数,这同样也是生成的语言模型的最大阶数,默认为3。

-vocab    vocab_file

读取词典vocab_file。生成语言模型时,如果计数文件中或者训练文件中,如果出现了词典vocab_file之外的词(OOV),则这些词会被替换为

-vocab-aliases    vocab-aliases_file

读取“词-映射词”文件vocab-aliases_file,其格式如下:
alias                word
这样在生成语言模型时,alias会被映射成word。
比如:
PLA        人民解放军
则在计数时,或者生成语言模型时,所有的“PLA”都会被映射为“人民解放军”。

-write-vocab    vocab_file

在计数过程中,将生成的词典输出到vocab_file中。

-write-vocab-index    vocab-index_file

在计数过程中,将生成的词典输出到vocab-index_file中,并且每个词都有编号。

-tagged

假设训练文件中,包含了“词/标记”组合。

-tolower

把词典中的词都变成小写(对英文)

-memuse

输出内存使用状况。

计数选项

-text    textfile

根据训练文件textfile生成N-gram计数文件或者N-gram语言模型。

-text-has-weights

假设训练文件是有权重的,即每行语句的第一个数字为这行语句的权重,在计数过程中会乘上这个权重。
比如:
3    我    是    中国人
相当于“我    是    中国人”出现了3次。

-no-sos

在计数过程中,每行语句不会自动添加开始符号

-no-eos

在计数过程中,每行语句不会自动添加结束符号

-read    count_file

读取计数文件count_file来生成语言模型。

-intersect    intersect_file

在读取计数文件counts_file时,通过intersect_file来限制读取计数。可理解为两个计数文件的交集,但是计数仍为counts_file的计数。

-write    count_file

把计数文件输出到count_file中。

-write-binary    count_binary_file

把计数文件输出到二进制文件count_binary_file中。

-writen    countn_file

只把某一阶的计数文件输出来,其中n为1,2,3,4,5,6,7,8或者9。
比如输出3阶计数文件:
-write3    count3_file

-sort

如果使用此选项,那么生成的计数文件将是字典顺序排序的。

-limit-vocab    vocabulary.

如果使用此选项,可配合-vocab    vocab_file选项。在读取计数文件来生成语言模型时,如果有词出现在词典外,在时,包含此词的计数会被忽略。

语言模型选项

-lm    lm_file

估计的语言模型输出到lm_file,默认为回退N-gram语言模型。

-write-binary-lm

如果使用此选项,那么生成的语言模型lm_file将会是二进制的。

-nonevents    nonevents_file

读取“非事件文件nonevents_file”,其中的词认为是“非事件”,只存在为N-gram中,概率为0。
比如:“美丽”这个词在nonevents_file中,那么生成语言模型时,
3-gram“我    是    美丽”的概率为0,如果用对数表示,则为-99。
但是要注意
3-gram“是    美丽    的”的概率不一定为0的,因为此时估计的概率是“是    美丽”之后接“的”的概率。

-float-counts

如果使用此选项,那么计数不一定是整数,也可为浮点数。

-unk

生成一个“开放式词典”语言模型,也就是说把标签当成一个普通词。生成语言模型时,默认是移除掉标签的。

-map-unk    word

映射成word,而不使用标签。

-prune    threshold

对语言模型进行剪枝。移除一些N-gram,使用移除之后的语言模型的困惑度相比之前变化不超过threshold。
比如:
-prune    0.2
即(PPLnew-PPLold)/PPLold    <    0.2

-minprune    n

确定哪阶及其上的N-gram需要剪枝,默认为2,即2阶及2阶以上的N-gram都会剪枝。

-debug    level

是否输出debug信息,默认无。

-gtnmin    count

-gtnmin中的n为1,2,3,4,5,6,7,8或者9。设置计数最小阈值count,也就是如果某阶中哪个N-gram的计数小于count,则认为这个N-gram的计数为0。
这个选项不仅对Good-Turing折扣算法有效,对其它回退算法亦有效。
比如:
-gt3min    3
假设3-gram中,“我    是    中国人”只出现了2次,那么“我    是    中国人”在生成语言模型时认为它出现了0次。

-gtnmax    count

设置Good-Turing折扣算法中,计数最大阈值count,超过count,则使用最大似然估计。

在接下来的折扣算法及参数当中,n为1,2,3,4,5,6,7,8或者9。
比如:
-gt2 gt2file
-cdiscount3 0.2
-wbdiscount2

如果n没有指定,那么认为是对所有阶N-gram有效。
比如:
-cdiscount 0.2
-wbdiscount
-ndiscount

如果没有指定折扣算法,默认会使用Good-Turing折扣算法。

-gtn    gtfile

保存或者读取Good-Turing折扣算法参数,包括计数最小最大阈值和折扣因子。
这比较有用,这是因为我们计算Good-Turing折扣算法参数用的无限制的词典,而真正生成最终的语言模型时,会用一个固定词典。
当使用-lm    lmfile选项时,是读取gtfile;否则是保存gtfile。

-cdiscountn    discount

使用Ney的绝对折扣算法,使用参数discount作为折扣常数,discount必须要介于0和1之间。

-wbdiscountn

使用Witten-Bell折扣算法。

-ndiscountn

使用Ristad自然折扣算法。

-addsmoothn    delta

使用“加-k”折扣算法。

-kndiscountn

使用“修正Kneser-Ney”折扣算法。

-kn-counts-modified

如果使用此选项,那么认为读取的计数文件是经过Kneser-Ney算法修正后的。

-knn    knfile

保存或者读取Kneser-Ney折扣算法参数,包括计数最小最大阈值和折扣常数。
这比较有用,这是因为我们计算Kneser-Ney折扣算法参数用的无限制的词典,而真正生成最终的语言模型时,会用一个固定词典。
当使用-lm    lmfile选项时,是读取knfile;否则是保存knfile。

-ukndiscountn

使用“原始Kneser-Ney”的折扣算法。

-interpolaten

如果使用此选项,表示使用折扣算法会进行插值处理,目前仅“Witten-Bell”,“绝对折扣算法”,“原始Kneser-Ney”和“修正Kneser-Ney”折扣算法支持插值。

Tips:

使用nrgam-count,主要是三要素:训练文件,计数文件,语言模型,流程都是“训练文件–>计数文件–>语言模型”。
先将训练文件进行计数,通过-gtnmin    mincount来控制哪些计数丢弃,即计数为0,然后再得到中间计数文件,再针对中间计数文件进行折扣算法,得到最终的语言模型。计数文件是一个中间文件,可以通过-write    count_file来输出保存。
目前ngram-count支持7种折扣算法:
1)-addsmooth    delta
2)-cdiscount    delta
3)-wbdiscount
4)-ndiscount
5)-ukndiscount
6)-kndiscount
7)默认为Good-Turing折扣算法,即不设定上述6种折扣算法,会默认使用Good-Turing折扣算法。
要注意的是,使用Kneser-Ney折扣算法,输出的计数文件是经过Kneser-Ney算法修正之后的计数。
较为常用的使用方法如下:
最简单(Good-Turing折扣算法):ngram-count -text train -lm LM.ARPA
输出词典和计数文件:ngram-count -text train -write-vocab VOCAB -write COUNT -lm LM.ARPA
对语言模型剪枝:ngram-count -text train -prune 0.2 -lm LM.ARPA
设置计数最小阈值:ngram-count -text train -gt1min 1 -gt2min 1 -gt3min 2 -lm LM.ARPA
使用经过插值的修正Kneser-Ney折扣算法:ngram-count -text train -kndiscount -interpolate -lm LM.ARPA
将debug信息输出来:ngram-count -text train -kndiscount -interpolate -lm LM.ARPA -debug 1 2>DEBUG

你可能感兴趣的:(SRILM使用之ngram-count)