【Natural Language Processing】語言模型訓練工具Srilm的安裝及使用簡介

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/LAW_130625/article/details/78507882

  實習做了一段時間的語言模型,使用到了Srilm這個工具,簡單做一下記錄,這個是一個統計和分析語言模型的工具,據說年齡很大了,可能比我大?總之它可以很方便的統計語料的n-gram,以及構建語言模型。

一、安裝Srilm
  ①下載地址:爲http://www.speech.sri.com/projects/srilm/download.html 。下載壓縮包後,解壓到你想編譯安裝的地方,假設爲:/Users/…/srilm。
  ②進入該目錄下,修改Makefile文件,找到此行: # SRILM = /home/speech/stolcke/project/srilm/devel,另起一行輸入SRILM 的安裝路徑 SRILM = $(PWD)。
  ③這一步我並沒有使用,但在我的MBP上也安裝成功了,在服務器上安裝應該用得着,也記錄一下;使用命令uname -m查看機器的架構,比如是x86_64,那麼在上一步的文件中可以看到MACHINE_TYPE := (shell (SRILM)/sbin/machine-type),在其前加#將其註釋掉,並另起一行輸入:MACHINE_TYPE := i686-gcc4。另外用修改 srilm/common/下的文件:Makefile.machine.i686-m64。
  找到:

TCL_INCLUDE =
TCL_LIBRARY =

  將其修改爲:

TCL_INCLUDE =
TCL_LIBRARY =
NO_TCL = X

  再將:GAWK = /usr/bin/awk修改爲:GAWK = /usr/bin/gawk。
  ④編譯Srilm,在srilm目錄下使用:make World進行編譯,會出來一大堆東西,接着改變環境變量export PATH=//Users/…/srilm/bin/i686-m64:/Users/…/srilm/bin:$PATH(根據實際情況改)。
  ⑤測試Srilm,我們使用Srilm提供的測試模塊進行測試,判斷編譯是否成功,進入Srilm根目錄,輸入命令:make test,出現類似下面的結果說明成功了。

*** Running test ngram-multiwords ***

real    0m0.034s
user    0m0.023s
sys 0m0.007s
ngram-multiwords: stdout output IDENTICAL.
ngram-multiwords: stderr output IDENTICAL.

二、Srilm的基本使用
  Srilm工具包的主要有兩個核心模塊,一個是ngram-count模塊,是用來根據訓練數據構建語言模型的,另一個是ngram模塊,對構建得到的語言模型進評測,即計算測試集困惑度(Perplexity),除此之外,還可以對模型進行剪枝、合併等,假設存在分詞後的訓練語料train.txt。
2.1 ngram-count模塊
  ①詞頻統計

ngram-count -text train.txt -order 3 -write train.count

  其中-text表示讀取分詞後的文本文件,-order 3表示選擇3-gram,默認參數就是3,train.count爲統計到詞頻的文本。這步會得到類似以下的count文件:

how 2
how to  2
how to learn.   1
how to live 1
<s> 6
<s> everyone    1
<s> everyone has    1

  ②模型訓練

ngram-count -read train.count -order 3 -lm train.lm  -interpolate -kndiscount

  其中-read表示讀取count文件,train.lm爲生成的語言模型,-interpolate和-kndiscount爲插值與折回參數。這步得到了類似以下的語言模型:

\data\
ngram 1=145
ngram 2=221
ngram 3=2

\1-grams:
-1.591065   </s>
-99 <s> -0.005417941
-2.369216   And -0.02260106
.
.

\2-grams:
-2.0086 <s> Firstly,
-2.0086 <s> I
-2.0086 <s> In
.
.
\3-grams:
-0.1760913  to live a
-0.1760913  hope to be

\end\

  可以看出文件開始顯示了不同的n-gram個數,接着的格式是:

log10(f(wn|w1...wn1)w1...wnlog10(bow(w1...wn)

  主要由三列組成,第一列表示以10爲底對數的條件概率f(w_{n}|w_{1} …w_{n-1},第二列是n元詞,第三列是以10爲底的對數回退權重,即考慮到它爲未看見的n+1元詞的貢獻概率。

2.2 ngram模塊
  ①計算困惑度(ppl),假設存在分詞後的測試語料test.txt,計算困惑度(ppl)的命令爲:

ngram -ppl test.txt -order 3 -lm train.lm -debug 2 > test.ppl

  其中參數-ppl表示計算句子對數概率(log10P(T) ),P(T)爲句子的概率),以及計算測試語料的困惑度,有兩個指標ppl和ppl1表示,test.txt爲測試文本,-debug 2爲對每一行語料進行困惑度計算,類似還有-debug 0 , -debug 1, -debug 3等,最後將困惑度的結果輸出到test.ppl。
  ②模型剪枝(prune)。有時模型過大,爲了減少模型的大小,同時保證性能最大化,引入了剪枝,剪枝命令爲:

ngram -lm old.lm -order 3 -prune 1e-5 -write-lm new.lm

  其中-lm old.lm爲要剪枝的語言模型,-write-lm 爲得到新的語言模型,-prune 1e-5爲剪枝的程度,表示刪除一些ngram,滿足刪除以後模型的ppl增加值小於這個閾值,可見這個值越大剪枝剪得越厲害。
  ③模型插值合併。這個是用於多個語言模型之間插值合併,以期望改善模型的效果,跟模型融合(Ensemble)一樣的效果,插值合併命令爲:

ngram -lm 0.lm -mix-lm 1.lm -lambda 0.9 -mix-lm2 2.lm -mix-lambda2 0.18 -mix-lm3 3.lm -mix-lambda3 0.01 -write-lm new.lm

  其中-mix-lm 用於插值的第二個ngram模型,-lm是第一個ngram模型,-lambda 主模型(-lm對應模型)的插值比例,0~1,默認是0.5,但是從-mix-lambda2開始是對應用於插值模型的比例,比如是2.lm這個模型,-write-lm new.lm即對應得到的新模型。

2.3 使用詞典限制語言模型
  我們有時候只想使用固定的詞典來構建語言模型,一個方法是在構建語言模型的時候使用-vocab進行限制,例如:

ngram-count -text train.txt -vocab vocab.txt -order 3 -write train.count

  其中-vocab vocab.txt表示受限的輸入詞典,沒有出現在詞典的單詞將全部換爲替換爲。
  除此之外,還有另外一種是對已構建好的語言模型,使用新的字典進行約束,構建新的語言模型,如下:

change-lm-vocab -vocab vocab.txt -lm old.lm -write-lm new.lm -order 2

  其中n-gram的概率保持不變,但是回退概率會重新計算,並且增加新的一元回退概率,-write-lm 得到新的語言模型。

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