SRILM是一個建立和使用統計語言模型的開源工具包,從1995年開始由SRI 口語技術與研究實驗室(SRI Speech Technology and Research Laboratory)開發,現在仍然不斷推出新版本,被廣泛應用於語音識別、機器翻譯等領域。這個工具包包含一組C++類庫、一組進行語言模型訓練和應用的可執行程序等。利用它可以非常方便地訓練和應用語言模型。給定一組連續的詞,調用SRILM提供的接口,可以得到這組詞出現的概率。
http://www.jianshu.com/p/5b19605792ab
ngram-count -text text.txt -vocab wordlist.txt -order 3 -write count.txt
這里的-text表示讀入文件,-vocab表示使用字典,只有在字典中的詞才會被統計個數,-order表示使用三元模型,默認即為3,-write為生成的n-gram計數文件,如果還想查看其它命令,可以使用ngram-count -help查看ngram-count -read count.txt -order 3 -lm test.lm -interpolate -kndiscount
這里的-read表示讀入n-gram計數文件,-lm表示生成語言模型,-interpolate -kndiscount是平滑方法,具體介紹可以查看 Ngram折扣平滑算法
ngram -ppl new.txt -order 3 -lm test.lm > out.ppl
這里的-ppl是指要計算的測試集,-lm加載之前訓練好的語言模型,同時將輸入放到out.ppl文件中****************************************************************************************************************************************************************************************************************************************************************************************************************************************
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句:
1、從語料庫中生成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次。
2、從上一步生成的計數文件中訓練語言模型:
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 ...
3、利用上一步生成的語言模型計算測試集的困惑度:
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
****************************************************************************************************************************************************************************************************************************************************************************************************************************************
轉自:
一、小數據
假設有去除特殊符號的訓練文本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。
二、大數據(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
****************************************************************************************************************************************************************************************************************************************************************************************************************************************
斯坦福大學自然語言處理第四課“語言模型(Language Modeling)”
****************************************************************************************************************************************************************************************************************************************************************************************************************************************
轉自:http://blog.csdn.net/yqzhao/article/details/7932056
最近學習了一下SRILM的源代碼,分享一下學習筆記(最新完整版本),希望能夠對大家了解SRI語言模型訓練工具有些許幫助。限於本人水平,不足之處,望大家多多指教。
筆記的主要內容使用starUML及其逆向工程工具繪制,主要針對SRILM的訓練(ngram-count),內含5個jpg文件:
- 類圖--與ngram-count相關的主要類的靜態圖;
- ngram-count--從語料訓練出模型的主要流程;
- lmstats.countfile--ngram-count的子流程,用於構建詞匯表和統計ngram的頻度
- ngram.estimate--ngram-count的子流程,在詞匯表和ngram頻度的基礎上計算ngram條件概率以及backoff權值的過程
- ngram.read--與訓練無關,分析讀取ARPA格式的語言模型的過程
SRILM訓練ngram的過程簡單說來,可歸結為以下幾個步驟:
- 先建立Vocab(詞匯表)類型與LMStats(用於ngram統計)類型的兩個實例(即vocab和intStats,intStats中存有vocab的一個引用);
- 調用intStats的countFile函數完成(對輸入語料文件中)ngram的統計,這其中也包括詞匯表的構建(以及詞匯索引映射的構建);
- 建立Discount*的一個數組(長度為order參數的值,即要訓練的模型的ngram的最大階數),按選定的平滑方式計算各階的折扣率,並保存其中;
- 建立Ngram類型(語言模型類)的實例(即lm),調用其estimate函數(以折扣率數組和ngram統計類的對象為參數),計算各階ngram的概率及bow,完成語言模型的訓練;
- 按訓練命令參數選項,輸出訓練好的語言模型、ngram的頻度統計結果、詞匯表、詞匯索引表等到相應的指定文件中。
筆記中對這個流程做了較詳細的說明,下面補充兩點內容(主要數據結構的內存布局和ngram條件概率計算式中的參量說明),可以作為筆記內容的基線,便於從總體上把握ngram-count的邏輯。
一、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的概率值(的對數)
二、參數說明
ngram的概率值計算公式為(參見http://ssli.ee.washington.edu/people/duh/papers/flm-manual.pdf):
SRILM訓練語言模型的目的就是統計給定語料中的ngram,根據上式算出其相應的(條件)概率值。
- 頂
- 1
- 踩