基於srilm的語言模型訓練簡介(一)

一、語言模型訓練

##功能
#讀取分詞後的text文件或者count文件,然後用來輸出最後彙總的count文件或者語言模型
##參數
#輸入文本:
#  -read 讀取count文件
#  -text 讀取分詞後的文本文件
#詞典文件:
#  -vocab 限制text和count文件的單詞,沒有出現在詞典的單詞替換爲<unk>;如果沒有,所有的單詞將會被自動加入詞典
#  -limit-vocab 只限制count文件的單詞(對text文件無效),沒有出現在詞典裏面的count將會被丟棄
#  -write-vocab 輸出詞典
#平滑算法
#-interpolate   差值平滑算法
#-kndiscount  折扣平滑算法
#語言模型:
#  -lm 輸出語言模型
#  -write-binary-lm 輸出二進制的語言模型
#  -sort 輸出語言模型gram排序

#訓練模式一: text->count->lm
ngram-count -text $text -vocab ${vocab} -order 4 -sort -tolower -lm ${arpa} -interpolate -kndiscount

#訓練模式二: text->count count->lm
ngram-count -text ${text} -order 4 -sort -tolower -write ${count} 

二、語言模型打分

##功能
#用於評估語言模型的好壞,或者是計算特定句子的得分,用於語音識別的識別結果分析。
##參數
#計算得分:
#  -order 模型階數,默認使用3階
#  -lm 使用的語言模型
#  -use-server S 啓動語言模型服務,S的形式爲port@hostname
#  -ppl 後跟需要打分的句子(一行一句,已經分詞),ppl表示所有單詞,ppl1表示除了</s>以外的單詞
#    -debug 0 只輸出整體情況
#    -debug 1 具體到句子
#    -debug 2 具體每個詞的概率
#產生句子:
#  -gen 產生句子的個數
#  -seed 產生句子用到的random seed
ngram -lm ${lm} -order 4 -ppl ${file} -debug 2 > ${ppl}

三、語言模型剪枝

##功能
#用於減小語言模型的大小,剪枝原理參考(http://blog.csdn.net/xmdxcsj/article/details/50321613)
##參數
#模型裁剪:
#  -prune threshold 刪除一些ngram,滿足刪除以後模型的ppl增加值小於threshold,越大剪枝剪得越狠
#  -write-lm 新的語言模型
ngram -lm ${oldlm} -order 4 -prune ${thres}  -prune-lowprobs -write-lm ${newlm}

四、語言模型合併

在合併語言模型之前,可以使用腳本計算出最好的比例,參考srilm的compute-best-mix腳本
##功能
#用於多個語言模型之間插值合併,以期望改善模型的效果
##參數
#模型插值:
#  -mix-lm 用於插值的第二個ngram模型,-lm是第一個ngram模型
#  -lambda 主模型(-lm對應模型)的插值比例,0~1,默認是0.5
#  -mix-lm2 用於插值的第三個模型
#  -mix-lambda2 用於插值的第二個模型(-mix-lm對應的模型)的比例,那麼第二個模型的比例爲1-lambda-mix-lambda2
#  -vocab 當兩個模型的詞典不一樣的時候,使用該參數限制詞典列表,沒有效果
#  -limit-vocab 當兩個模型的詞典不一樣的時候,使用該參數限制詞典列表,沒有效果
ngram  -order 4 -lm ${mainlm} -lambda 0.8 -mix-lm ${mixlm}  -write-lm ${mergelm}

語言模型在進行合併的過程當中,需要進行計算差值比例,往往通過使用srilm工具提供的compute-best-mix 進行計算最佳的比例(compute-best-mix A_corpus.ppl B_corpus.ppl C_corpus.ppl D_corpus.ppl )。但是在此之前,最佳比例計算所需的ppl文件是通過使用計算語言模型打分ngram -lm ${lm} -order 4 -ppl ${file} -debug 2 > ${ppl} ,命令行中的 -debug選項爲2.

五、語言模型使用詞典限制

有兩種方法可以根據給定的詞典對模型加以限制
一種是在訓練的時候使用-vocab限制
另外一種是在訓練完成以後,使用srilm的腳本,如下:

##功能
#對已有的語言模型,使用新的字典進行約束,產生新的語言模型
#1.n-grams的概率保持不變
#2.回退概率重新計算
#3.增加新的一元回退概率
##參數
#模型裁剪:
#  -vocab 詞典單詞的列表,不包括髮音
#  -write-lm 新的語言模型
change-lm-vocab -order 4 -vocab ${vocab} -lm ${oldlm} -write-lm ${newlm} 

參考文章:
https://blog.csdn.net/xmdxcsj/article/details/50353689
https://blog.csdn.net/xmdxcsj/article/details/50373554

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章