SRILM - SRI 語言建模工具包
1、SRILM介紹
SRILM 是一個用於構建和應用語言模型(LM)的工具包,主要用於語音識別、統計標記和分割以及機器翻譯。
SRILM 在 UNIX 和 Windows 平台上運行。SRILM 由一下組件組成:
• 一組實現的語言模型、支持這些模型的數據結構和各種有用的函數的C++類庫;
• 一組建立在這些類庫基礎上的用於執行標准任務的可執行程序,如訓練語言模型,在數據集上對這些語言模型進行測試,對文本進行標注或切分等任務。
• 一組使相關任務變得容易的各種腳本。
SRILM的主要目標是支持語言模型的估計和評測。估計:是從訓練數據中(訓練集)中得到一個模型,包括最大似然估計及相應的平滑算法;評測:是從測試集中計算器困惑度。
2、訓練語言模型以及對其評測
訓練一個語言模型以及對其評測的步驟如下:
小數據:
1、詞頻統計
ngram-count -text trainfile.txt -order 3 -write trainfile.count
其中-order 3為3-gram,trainfile.count為統計詞頻的文本
計數文件示例
please 1
please input 1
please input your 1
<s> 8
<s> it 2
<s> it 's 2
<s> the 1
<s> the light 1
<s> we 1
<s> we want 1
…...
up 1
up . 1
up . </s> 1
Do 1
Do you 1
Do you do 1
這里的,分別表示句子的開始和結束,計數文件的格式是:
a_z c(a_z)
a_z:a表示n元語法的第一個詞,z表示最后一個詞,_表示在a和z之間的0個或多個詞
c(a_z):表示a_z在訓練語料中的計數
2、模型訓練
ngram-count -read trainfile.count -order 3 -lm trainfile.lm -interpolate -kndiscount
其中trainfile.lm為生成的語言模型,-interpolate和-kndiscount為插值與折回參數
注意:如果語料比較小,后面的插值參數和折回參數不需要加,加了會報錯。
語言模型示例
\data\
ngram 1=75
ngram 2=106
ngram 3=2
\1-grams:
-1.770852 ‘ll -0.03208452
-1.770852 ‘s -0.02453138
-1.770852 , -0.4659371
-1.770852 - -0.02832437
-1.030489 . -0.5141692
……
\2-grams:
-1.361728 ‘ll bring
-1.361728 ‘ll take
-1.361728 ‘s just
-1.361728 ‘s over
-0.1760913 , just
-1.361728 - and
-1.361728 - blue
……
\3-grams:
-0.1760913 . I ‘ll
-0.1760913 it ‘s
其中文件格式:
log10(f(a_z)) a_z log10(bow(a_z))
注:f(a_z)是條件概率即P(z|a_),bow(a_z)是回退權重
第一列表示以10為底對數的條件概率P(z|a_),第二列是n元詞,第三列是以10為底的對數回退權重(它為未看見的n+1元詞貢獻概率)
3、測試(困惑度計算)
ngram -ppl testfile.txt -order 3 -lm trainfile.lm -debug 2 > file.ppl
其中testfile.txt為測試文本,-debug 2為對每一行進行困惑度計算,類似還有-debug 0 , -debug 1, -debug 3等,最后 將困惑度的結果輸出到file.ppl。
大數據
對於大文本的語言模型訓練不能使用上面的方法,主要思想是將文本切分,分別計算,然后合並。步驟如下:
1:切分數據
split -l 10000 trainfile.txt filedir/
即每10000行數據為一個新文本存到filedir目錄下。
2:對每個文本統計詞頻
make-bath-counts filepath.txt 1 cat ./counts -order 3
其中filepath.txt為切分文件的全路徑,可以用命令實現:ls $(echo $PWD)/* > filepath.txt,將統計的詞頻結果存放在counts目錄下
3:合並counts文本並壓縮
merge-batch-counts ./counts
4:訓練語言模型
make-big-lm -read ../counts/*.ngrams.gz -lm ../split.lm -order 3
用法同ngram-counts
5: 測評(計算困惑度)
ngram -ppl filepath.txt -order 3 -lm split.lm -debug 2 > file.ppl
3、基本訓練
##功能
#讀取分詞后的text文件或者count文件,然后用來輸出最后匯總的count文件或者語言模型
##參數
#輸入文本:
# -read 讀取count文件
# -text 讀取分詞后的文本文件
#詞典文件:
# -vocab 限制text和count文件的單詞,沒有出現在詞典的單詞替換為<unk>;如果沒有,所有的單詞將會被自動加入詞典
# -limit-vocab 只限制count文件的單詞(對text文件無效),沒有出現在詞典里面的count將會被丟棄
# -write-vocab 輸出詞典
#語言模型:
# -lm 輸出語言模型
# -write-binary-lm 輸出二進制的語言模型
# -sort 輸出語言模型gram排序
# 兩種訓練方法分別如下:
#choice1: text->count->lm
#ngram-count -text $text -vocab ${vocab} -order 2 -sort -tolower -lm ${arpa}
#choice2: text->count count->lm
#ngram-count -text ${text} -order 2 -sort -tolower -write ${count}
4、語言模型打分
##功能
#用於評估語言模型的好壞,或者是計算特定句子的得分,用於語音識別的識別結果分析。
##參數
#計算得分:
# -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 2 -ppl ${file} -debug 1 > ${ppl}
5、語言模型剪枝
##功能
#用於減小語言模型的大小,剪枝原理參考(http://blog.csdn.net/xmdxcsj/article/details/50321613)
##參數
#模型裁剪:
# -prune threshold 刪除一些ngram,滿足刪除以后模型的ppl增加值小於threshold,越大剪枝剪得越狠
# -write-lm 新的語言模型
ngram -lm ${oldlm} -order 2 -prune ${thres} -write-lm ${newlm}
6、語言模型合並
##功能
#用於多個語言模型之間插值合並,以期望改善模型的效果
##參數
#模型插值:
# -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 -lm ${mainlm} -order 2 -mix-lm ${mixlm} -lambda 0.8 -write-lm ${mergelm}