srilm训练语言模型
时间:2022-12-25 16:00:01
ngram-count -text ${text} -vocab ${vocab} -order 2 -sort -tolower -lm ${arpa}
以下是我在使用过程中的一些经验。写下来和大家分享。官方参数说明:
http://www.speech.sri.com/projects/srilm/manpages/ngram-count.1.html
-help
输出帮助信息
-version
输出版本信息
-ordern
设置计数时N-grams默认情况下,语言模型的最大阶数也是3。
-vocabvocab_file
读取词典vocab_file。在生成语言模型时,如果词典出现在计数文件或训练文件中vocab_file之外的词(OOV),这些词会被替换
。
-vocab-aliasesvocab-aliases_file
读取词-映射词文件vocab-aliases_file,格式如下:
aliasword
在生成语言模型时,alias会被映射成word。
比如:
PLA人民解放军
在计数或生成语言模型时,所有PLA”都会被映射为“人民解放军”。
-write-vocabvocab_file
在计数过程中,输出生成的词典vocab_file中。
-write-vocab-indexvocab-index_file
在计数过程中,输出生成的词典vocab-index_file每个字都有编号。
-tagged
假设单词/标记组合包含在训练文件中。
-tolower
把词典里的词都变成小写(对英语)
-memuse
输出内存的使用。
计数选项
-texttextfile
根据训练文件textfile生成N-gram计数文件或N-gram语言模型。
-text-has-weights
假设训练文件有权重,即每行语句的第一个数字是这行语句的权重,在计数过程中会乘以这个权重。
比如:
3我是中国人
相当于“我是中国人三次出现。
-no-sos
在计数过程中,过程中不会自动添加开始符号
-no-eos
每行语句在计数过程中不会自动添加结束符号
-readcount_file
读取计数文件count_file生成语言模型。
-intersectintersect_file
读取计数文件counts_file时,通过intersect_file限制读取计数。可以理解为两个计数文件的交集,但计数仍然是counts_file的计数。
-writecount_file
输出计数文件count_file中。
-write-binarycount_binary_file
输出计数文件到二进制文件count_binary_file中。
-writencountn_file
只输出一阶的计数文件,其中n为1、2、3、4、5、6、7、8或9。
比如输出3阶计数文件:
-write3count3_file
-sort
如果使用此选项,生成的计数文件将按字典顺序排序。
-limit-vocabvocabulary.
如果使用此选项,可以配合-vocabvocab_file选项。读取计数文件生成语言模型时,如果词典外出现单词,则包含该单词的计数将被忽略。
语言模型选项
-lmlm_file
从估计的语言模型输出到lm_file,默认为回退N-gram语言模型。
-write-binary-lm
如果使用此选项,则生成的语言模型lm_file将是二进制。
-noneventsnonevents_file
读取非事件文件nonevents_file”,其中的词认为是“非事件”,只存在为N-gram中,概率为0。
比如美这个词在:nonevents_file在生成语言模型时,
3-gram“我是美的概率为0,如果用对数表示,则为-99。
但是要注意
3-gram“是美丽概率不一定是0,因为此时估计的概率是是美后接的的概率。
-float-counts
如果使用此选项,计数不一定是整数,也可以是浮点数。
-unk
生成一个开放式词典语言模型,即
标签被视为一个普通词。在生成语言模型时,默认情况下删除它 标签的。
-map-unk&nbp; 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,主要是三要素:训练文件,计数文件,语言模型,流程都是“训练文件–>计数文件–>语言模型”。
目前ngram-count支持7种折扣算法:
较为常用的使用方法如下: