原文链接:https://blog.csdn.net/GavinLiu1990/article/details/81363936
因为经常使用SRILM来建立语言模型,因此把自己在使用过程中的一些心得写下来和大家分享一下。
-help 输出帮助信息
-version 输出版本信息
-order n 设置计数时N-grams的最大阶数,这同样也是生成的语言模型的最大阶数,默认为3。
-vocab vocab_file 读取词典vocab_file。生成语言模型时,如果计数文件中或者训练文件中,如果出现了词典vocab_file之外的词(OOV),则这些词会被替换为<unk>。
-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 在计数过程中,每行语句不会自动添加开始符号<s>
-no-eos 在计数过程中,每行语句不会自动添加结束符号</s>
-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
生成一个“开放式词典”语言模型,也就是说把<unk>标签当成一个普通词。生成语言模型时,默认是移除掉<unk>标签的。
-map-unk word
将<unk>映射成word,而不使用<unk>标签。
-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