SRILM的使用


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}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM