srilm建立語言模型

jinmingz發表於2016-07-28

reference: 

http://blog.csdn.net/zhoubl668/article/details/8365716

測試資料可以從這個網站下載: http://www.statmt.org/europarl/  ,  我測試下載的是 parallel corpus Bulgarian-English


1.生成n-gram計數檔案

./ngram-count -text ./test/europarl-v7.bg-en.en -order 3 -write ./test/europarl-v7.bg-en.en.counts

note: -text 表示輸入的檔案,就是我們的所有語音對應的文字檔案,最好是提前做一個資料清理(把標點符號去掉,全都轉化為大寫或者小寫)

-order 表示生成的是n-gram模型,詞的長度最大是3

-write 寫入一個計數檔案

下面是生成的counts檔案中的幾行:

Uncooperative   1  #表示該詞在檔案中出現了一次
Uncooperative countries 1   <span style="font-family: Menlo;">#表示該詞在檔案中出現了一次</span>
Uncooperative countries of      1
propagate       6   #表示該詞在檔案中出現了6次
propagate transplantation       1
propagate transplantation and   1
2.利用生成的n-gram計數檔案,生成語言模型:

./ngram-count -read ./test/europarl-v7.bg-en.en.counts -order 3 -lm ./test/europarl-v7.bg-en.en.lm -interpolate -kndiscount

note: -read 表示讀入的計數檔案 

-lm 是需要生成匯出的lm檔案

-interpolate 是插值平滑

- kndiscount  是modified kneser-ney 打折法, 跟插值平滑聯合使用,具體什麼演算法還不是很瞭解(???)

下面是生成的lm檔案中的前幾行:

\data\
ngram 1=115075    #表示一元詞的個數
ngram 2=1477406   #表示二元詞的個數
ngram 3=885946

\1-grams:
-5.880136       "A      -0.1279694  
-6.049498       "Adapting       -0.1279694
-6.049498       "America        -0.1279694
-6.049498       "BRICS” -0.1279694
-6.049498       "Competitiveness        -0.1279694
-6.049498       "County -0.1279694
-6.049498       "Don't  -0.1279694
-6.049498       "Ecobales”      -0.1279694
-5.880136       "European       -0.1279694
-6.049498       "Garden -0.1279694
-6.049498       "Health -0.1279694
-6.049498       "How    -0.1279694

上面每一行都是三列, 第一列表示的是  "A  出現的概率(注意這個地方沒有去掉標點符號,而詞與詞之間的分割是以空格來分的), 取以10為底的對數.

可以驗證一下,"A  在counts中的次數是2    一元的總次數是每一個詞出現的次數的和total .     math.log10(2./total) 就是第一列的結果

第三列表示的是 回退權重(backoff weight)w,然後 也是 math.log10(w), 具體怎麼計算暫時不是很清楚(???)

3. 利用上一步生成的語言模型計算測試集的困惑度:(???)

這個是對原來的集合計算的一個困惑度:

./ngram -ppl ./test/europarl-v7.bg-en.en -order  3 -lm ./test/europarl-v7.bg-en.en.lm > ./test/europarl-v7.bg-en.en.ppl

file ./test/europarl-v7.bg-en.en: 406879 sentences, 9.8864e+06 words, 0 OOVs
0 zeroprobs, logprob= -1.76278e+07 ppl= 51.5887 ppl1= 60.6785

可以看到集合中沒有未登陸詞,因為我們是用這個集合生成的

0 zeroprobs , 沒有0概率, 沒有句子沒有出現過

logprob ,  log10(p(T)) , p(T) 所有句子的概率乘積

ppl, ppl1:  均未困惑度,不知道怎麼計算的(???)


下面是eesen中swbd計算語言模型過程:

# Trigram language model
ngram-count -text $dir/train.gz -order 3 -limit-vocab -vocab $dir/wordlist \
  -unk -map-unk "<unk>" -kndiscount -interpolate -lm $dir/sw1.o3g.kn.gz
echo "PPL for SWBD1 trigram LM:"
ngram -unk -lm $dir/sw1.o3g.kn.gz -ppl $dir/heldout
ngram -unk -lm $dir/sw1.o3g.kn.gz -ppl $dir/heldout -debug 2 >& $dir/3gram.ppl2

ngram-count -text $dir/train.gz -order 4 -limit-vocab -vocab $dir/wordlist \
  -unk -map-unk "<unk>" -kndiscount -interpolate -lm $dir/sw1.o4g.kn.gz
echo "PPL for SWBD1 4gram LM:"
ngram -unk -lm $dir/sw1.o4g.kn.gz -ppl $dir/heldout
ngram -unk -lm $dir/sw1.o4g.kn.gz -ppl $dir/heldout -debug 2 >& $dir/4gram.ppl2

可以對比參考一下, 上面還有好多問題,好多不明白的地方,弄懂了再更新。





相關文章