SRILM是一個創建和使用統計語言模型的開源工具包,從1995年開始由SRI 口語技術與研究實驗室(SRI Speech Technology and Research Laboratory)開發,如今仍然不斷推出新版本,被普遍應用於語音識別、機器翻譯等領域。這個工具包包含一組C++類庫、一組進行語言模型訓練和應用的可執行程序等。利用它能夠很是方便地訓練和應用語言模型。給定一組連續的詞,調用SRILM提供的接口,能夠獲得這組詞出現的機率。html
http://www.jianshu.com/p/5b19605792abnode
ngram-count -text text.txt -vocab wordlist.txt -order 3 -write count.txtlinux
這裏的-text表示讀入文件,-vocab表示使用字典,只有在字典中的詞纔會被統計個數,-order表示使用三元模型,默認即爲3,-write爲生成的n-gram計數文件,若是還想查看其它命令,可使用ngram-count -help查看ngram-count -read count.txt -order 3 -lm test.lm -interpolate -kndiscountweb
這裏的-read表示讀入n-gram計數文件,-lm表示生成語言模型,-interpolate -kndiscount是平滑方法,具體介紹能夠查看 Ngram折扣平滑算法ngram -ppl new.txt -order 3 -lm test.lm > out.ppl算法
這裏的-ppl是指要計算的測試集,-lm加載以前訓練好的語言模型,同時將輸入放到out.ppl文件中****************************************************************************************************************************************************************************************************************************************************************************************************************************************ubuntu
SRILM是著名的約翰霍普金斯夏季研討會(Johns Hopkins Summer Workshop)的產物,誕生於1995年,由SRI實驗室的Andreas Stolcke負責開發維護。
關於SRILM的安裝,我已經在前面關於moses平臺搭建的文章(參見:《Moses相關介紹》和《Ubuntu8.10下moses測試平臺搭建全記錄》)中介紹過了,這裏就再也不重複。準確的說,SRILM並非因機器翻譯而誕生的,它主要是爲語音識別所開發的,全稱爲Stanford Research Institute Language Modeling Toolkit。事實上統計機器翻譯與語音識別關係千絲萬縷,我會在之後的文章中介紹。
SRILM用來構建和應用統計語言模型,主要用於語音識別,統計標註和切分,以及機器翻譯,可運行在UNIX及Windows平臺上。它主要包含如下幾個部分:
• 一組實現的語言模型、支持這些模型的數據結構和各類有用的函數的C++類庫;
• 一組創建在這些類庫基礎上的用於執行標準任務的可執行程序,如訓練語言模型,在數據集上對這些語言模型進行測試,對文本進行標註或切分等任務。
• 一組使相關任務變得容易的各類腳本。
SRILM的主要目標是支持語言模型的估計和評測。估計是從訓練數據(訓練集)中獲得一個模型,包括最大似然估計及相應的平滑算法;而評測則是從測試集中計算其困惑度(MIT天然語言處理機率語言模型有相關介紹)。其最基礎和最核心的模塊是n-gram模塊,這也是最先實現的模塊,包括兩個工具:ngram-count和ngram,相應的被用來估計語言模型和計算語言模型的困惑度。一個標準的語言模型(三元語言模型(trigram),使用Good-Truing打折法和katz回退進行平衡)能夠用以下的命令構建:
ngram-count -text TRAINDATA -lm LM
其中LM是輸出的語言模型文件,能夠用以下的命令進行評測:
ngram -lm LM -ppl TESTDATA -debug 2
其中具體的參數可參看官方網站的幫助文檔,若是你已經在linux下編譯好了,能夠直接使用man調用幫助文檔。事實上,統計機器翻譯框架主要用的就是n-gram這個模塊來訓練語言模型。下面咱們以歐洲語料庫的英語語料爲例,解析這個工具的做用。語料庫下載地址見:歐洲議會平行語料庫。本例子使用的是wmt08裏面用於英語語言模型訓練的europarl-v3b.en,用於機器翻譯的預處理過程tokenize和lowercase此處省略,其規模爲1412546句:
一、從語料庫中生成n-gram計數文件:
ngram-count -text europarl-v3b.en -order 3 -write europarl.en.count
其中參數-text指向輸入文件,此處爲europarl-v3b.en;-order指向生成幾元的n-gram,即n,此處爲3元;-write指向輸出文件,此處爲europarl.en.count,輸出內容爲:
...
sweeteners 66
sweeteners should 1
sweeteners should be 1
...
分爲兩列,第一列爲n元詞,第二列爲相應的頻率。如一元詞sweeteners在語料庫中的頻率統計爲66次;二元詞sweeteners shoul在語料庫中的頻率統計爲1次;三元sweeteners should be在語料庫中的頻率統計爲1次。
二、從上一步生成的計數文件中訓練語言模型:
ngram-count -read europarl.en.count -order 3 -lm europarl.en.lm -interpolate -kndiscount
其中參數-read指向輸入文件,此處爲 europarl.en.count;-order與上同;-lm指向訓練好的語言模型輸出文件,此處爲europarl.en.lm;最後兩個參數爲所採用的平滑方法,-interpolate爲插值平滑,-kndiscount爲 modified Kneser-Ney 打折法,這兩個是聯合使用的。須要補充的是,通常咱們訓練語言模型時,這兩步是合二爲一的,這裏主要是爲了介紹清楚n-gram語言模型訓練的步驟細節。
語言模型europarl.en.lm的文件格式以下,爲 ARPA文件格式。爲了說明方便,文件中的括號是我加上的註釋:
\data\
ngram 1=262627 (注:一元詞有262627個 )
ngram 2=3708250 (注:二元詞有 3708250個)
ngram 3=2707112 (注:三元詞有 2707112個)數組
\1-grams:(注:如下爲一元詞的基本狀況)
-4.891179(注:log(機率),以10爲底) ! -1.361815
-6.482389 !) -0.1282758
-6.482389 !’ -0.1282758
-5.254417 "(注:一元詞) -0.1470514
-6.482389 "' -0.1282758(注:log(回退權重),以10爲底)
...
\2-grams:
-0.02140159 !
-2.266701 ! –
-0.5719482 !)
-0.5719482 !’
-2.023553 " 'Biomass'
-2.023553 " 'vertical'
...
\3-grams:
-0.01154674 the !
-0.01154674 urgent !
-0.01154674 us' !
-1.075004 the ".EU" Top
-0.827616 the ".EU" domain
-0.9724987 the ".EU" top-level ...
三、利用上一步生成的語言模型計算測試集的困惑度:
ngram -ppl devtest2006.en -order 3 -lm europarl.en.lm > europarl.en.lm.ppl
其中測試集採用wmt08用於機器翻譯的測試集devtest2006.en,2000句;參數-ppl爲對測試集句子進行評分(logP(T),其中P(T)爲全部句子的機率乘積)和計算測試集困惑度的參數;europarl.en.lm.ppl爲輸出結果文件;其餘參數同上。輸出文件結果以下:
file devtest2006.en: 2000 sentences, 52388 words, 249 OOVs
0 zeroprobs, logprob= -105980 ppl= 90.6875 ppl1= 107.805
第一行文件devtest2006.en的基本信息:2000句,52888個單詞,249個未登陸詞;
第二行爲評分的基本狀況:無0機率;logP(T)=-105980,ppl==90.6875, ppl1= 107.805,均爲困惑度。其公式稍有不一樣,以下:
ppl=10^{-{logP(T)}/{Sen+Word}}; ppl1=10^{-{logP(T)}/Word}
其中Sen和Word分別表明句子和單詞數。緩存
附:SRILM主頁推薦的書目和文獻。
入門——瞭解語言模型尤爲是n-gram模型的參考書目章節:
• 《天然語言處理綜論》初版第6章,第二版第4章(Speech and Language Processing by Dan Jurafsky and Jim Martin (chapter 6 in the 1st edition, chapter 4 in the 2nd edition) )
• 《統計天然語言處理基礎》第6章。(Foundations of Statistical Natural Language Processing by Chris Manning and Hinrich Schütze (chapter 6))
深刻學習相關文獻:
• A. Stolcke, SRILM - An Extensible Language Modeling Toolkit, in Proc. Intl. Conf. Spoken Language Processing, Denver, Colorado, September 2002. Gives an overview of SRILM design and functionality.
• D. Jurafsky, Language Modeling, Lecture 11 of his course on "Speech Recognition and Synthesis" at Stanford. Excellent introduction to the basic concepts in LM.
• J. Goodman, The State of The Art in Language Modeling, presented at the 6th Conference of the Association for Machine Translation in the Americas (AMTA), Tiburon, CA, October, 2002.
Tutorial presentation and overview of current LM techniques (with emphasis on machine translation).
• K. Kirchhoff, J. Bilmes, and K. Duh, Factored Language Models Tutorial, Tech. Report UWEETR-2007-0003, Dept. of EE, U. Washington, June 2007. This report serves as both a tutorial and reference manual on FLMs.
• S. F. Chen and J. Goodman, An Empirical Study of Smoothing Techniques for Language Modeling, Tech. Report TR-10-98, Computer Science Group, Harvard U., Cambridge, MA, August 1998 (original postscript document). Excellent overview and comparative study of smoothing methods. Served as a reference for many of the methods implemented in SRILM.數據結構
注:原創文章,轉載請註明出處「我愛天然語言處理」:www.52nlp.cn架構
****************************************************************************************************************************************************************************************************************************************************************************************************************************************
轉自:
1、小數據
假設有去除特殊符號的訓練文本trainfile.txt,以及測試文本testfile.txt,那麼訓練一個語言模型以及對其進行評測的步驟以下:
1:詞頻統計
ngram-count -text trainfile.txt -order 3 -write trainfile.count
其中-order 3爲3-gram,trainfile.count爲統計詞頻的文本
2:模型訓練
ngram-count -read trainfile.count -order 3 -lm trainfile.lm -interpolate -kndiscount
其中trainfile.lm爲生成的語言模型,-interpolate和-kndiscount爲插值與折回參數
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。
2、大數據(BigLM)
對於大文本的語言模型訓練不能使用上面的方法,主要思想是將文本切分,分別計算,而後合併。步驟以下:
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
****************************************************************************************************************************************************************************************************************************************************************************************************************************************
轉自:http://www.leexiang.com/building-a-large-lm-with-srilm
原理上,語言模型模型越大,機器翻譯質量越好,可是當語言模型的訓練集很是大時,例如GB級別的時候,受限於時間和機器的內存等因素,傳統的ngram-count訓練方式沒法知足實際須要,所以srilm的FAQ中提到了訓練語言模型的方法,基本思想就是將大文件拆分紅多個小文件,而後再將多個小文件的count合併,完成最終的語言模型訓練。
其基本方法:
1. 把大文件分割成小文件,放在一個目錄下,而後生成一個文件名列表文件,如filelist ,通常使用按行分割的形式,split -l 100 test.txt out
使用split將一個大文件分紅最多26*26(使用字母后綴,這是默認的行爲)或者是100(使用數字後綴,須要-d參數)個文件,能夠將文件按行拆分(使用-l num參數)或者是按大小拆分(使用-b size參數),還能夠給出文件的前綴(或者使用默認的x)。在進行拆分的時候將文件會將每num行放到一個文件中,文件按字母序產生,對於語言模型的使用來講,通常使用按行分割的形式 split -l 100 big_file split_file
2. 使用 make-batch-counts分別統計各個分割文件中的詞頻,make-batch-counts filelist 5 cat counts -order 5,其中filelist爲須要統計的小文件名列表,5表示每5個小文件用於一次ngram-count訓練,cat lmcount 表示輸出到counts,後續則是提交給ngram-count的參數
3. 使用merge-batch-counts將全部的小count文件合併成一個大的count文件,merge-batch-counts [ -l N ] counts [ filename-list ],將counts目錄下的全部文件合併成一個文件,若是有些文件不用參與合併,能夠在最後添加一個filename-list,只有在filename-list裏面出現的文件纔會被用於合併;-l N參數之處,一次同時合併N個文件
4. 使用make-big-lm生成語言模型,參數相似於ngram-count
更詳細的方法能夠參考 http://joshua-decoder.org/4.0/large-lms.html
****************************************************************************************************************************************************************************************************************************************************************************************************************************************
****************************************************************************************************************************************************************************************************************************************************************************************************************************************
轉自:http://blog.csdn.net/yqzhao/article/details/7932056
最近學習了一下SRILM的源代碼,分享一下學習筆記(最新完整版本),但願可以對你們瞭解SRI語言模型訓練工具備些許幫助。限於本人水平,不足之處,望你們多多指教。
筆記的主要內容使用starUML及其逆向工程工具繪製,主要針對SRILM的訓練(ngram-count),內含5個jpg文件:
SRILM訓練ngram的過程簡單說來,可歸結爲如下幾個步驟:
筆記中對這個流程作了較詳細的說明,下面補充兩點內容(主要數據結構的內存佈局和ngram條件機率計算式中的參量說明),能夠做爲筆記內容的基線,便於從整體上把握ngram-count的邏輯。
1、SRILM中所用到的主要數據結構的內存佈局
Trie:trie樹,以hash表實現,作ngram統計和計算ngram的機率值以及backoff weight都以此爲基礎
Vocab:詞彙表,內含一個以詞形爲鍵獲取索引值的hash表,以及一個經過索引值(即下標)得到詞形的Array
LMStats:負責ngram頻度統計,主要成員counts是一棵trie樹,從樹根到某個結點的路徑給出了一個以正常順序(從左向右)的ngram的各個元的索引
BOnode:Ngram 的主要基礎數據結構,用於存儲n-1階gram的backoff權值(存於bow域),以及以此n-1階gram爲歷史的全部n階gram的機率值(存於 probs域);probs域爲一hash表,以n階gram的第n個元素(在詞彙表vocab中)的索引值爲鍵,以此n階gram的頻度的log值(以 10爲底)爲值
Ngram:繼承LM,其主要成員contexts爲一棵trie樹,從根到某個結點的路徑是一個n-1階gram的逆序(從右向左),其bow域存放該n-1-gram在正序狀況下的backoff權值,其probs域則爲以(正序下)該n-1-gram爲歷史的(全部)n-gram的機率值(的對數)
2、參數說明
ngram的機率值計算公式爲(參見http://ssli.ee.washington.edu/people/duh/papers/flm-manual.pdf):
SRILM訓練語言模型的目的就是統計給定語料中的ngram,根據上式算出其相應的(條件)機率值。