[轉]語言模型訓練工具SRILM


SRILM是一個建立和使用統計語言模型的開源工具包,從1995年開始由SRI 口語技術與研究實驗室(SRI Speech Technology and Research Laboratory)開發,現在仍然不斷推出新版本,被廣泛應用於語音識別、機器翻譯等領域。這個工具包包含一組C++類庫、一組進行語言模型訓練和應用的可執行程序等。利用它可以非常方便地訓練和應用語言模型。給定一組連續的詞,調用SRILM提供的接口,可以得到這組詞出現的概率。

 http://www.jianshu.com/p/5b19605792ab

SRILM初步使用
這里只介紹一下ngram-count工具的使用,其它的工具還在摸索中,有機會的話再寫
1、從語料中生成n-gram統計文件
語料必須是已經分好詞的,即用空格間隔開的,如果還未分詞, 可以下載ICTCLAS分一下詞,假設分完詞后的語料文件為test.txt,這里我們可以 用以下命令生成n-gram計數文件:

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

這里的-text表示讀入文件,-vocab表示使用字典,只有在字典中的詞才會被統計個數,-order表示使用三元模型,默認即為3,-write為生成的n-gram計數文件,如果還想查看其它命令,可以使用ngram-count -help查看
2、 從n-gram計數文件中生成語言模型

ngram-count -read count.txt -order 3 -lm test.lm -interpolate -kndiscount

這里的-read表示讀入n-gram計數文件,-lm表示生成語言模型,-interpolate -kndiscount是平滑方法,具體介紹可以查看 Ngram折扣平滑算法
生成的 語言模型格式(ARPA格式)如下,這樣可以有個比較直觀的印象
SRILM筆記1 - 惟以不永懷 - 惟以不永懷
 
3、利用生成的語言模型計算測試集的困惑度

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)”

+8投票
 

一、課程介紹

斯坦福大學於2012年3月在Coursera啟動了在線自然語言處理課程,由NLP領域大牛Dan Jurafsky 和 Chirs Manning教授授課:
https://class.coursera.org/nlp/

以下是本課程的學習筆記,以課程PPT/PDF為主,其他參考資料為輔,融入個人拓展、注解,拋磚引玉,歡迎大家在“我愛公開課”上一起探討學習。

課件匯總下載地址:斯坦福大學自然語言處理公開課課件匯總

二、語言模型(Language Model)

1)N-gram介紹

在實際應用中,我們經常需要解決這樣一類問題:如何計算一個句子的概率?如:

  • 機器翻譯:P(high winds tonite) > P(large winds tonite)
  • 拼寫糾錯:P(about fifteen minutes from) > P(about fifteen minuets from)
  • 語音識別:P(I saw a van) >> P(eyes awe of an)
  • 音字轉換:P(你現在干什么|nixianzaiganshenme) > P(你西安在干什么|nixianzaiganshenme)
  • 自動文摘、問答系統、... ...

以上問題的形式化表示如下:

p(S)=p(w1,w2,w3,w4,w5,…,wn)

      =p(w1)p(w2|w1)p(w3|w1,w2)...p(wn|w1,w2,...,wn-1)//鏈規則

p(S)被稱為語言模型,即用來計算一個句子概率的模型。

那么,如何計算p(wi|w1,w2,...,wi-1)呢?最簡單、直接的方法是直接計數做除法,如下:

p(wi|w1,w2,...,wi-1) = p(w1,w2,...,wi-1,wi) / p(w1,w2,...,wi-1)

但是,這里面臨兩個重要的問題:數據稀疏嚴重;參數空間過大,無法實用。

基於馬爾科夫假設(Markov Assumption):下一個詞的出現僅依賴於它前面的一個或幾個詞。

  • 假設下一個詞的出現依賴它前面的一個詞,則有:

p(S)=p(w1)p(w2|w1)p(w3|w1,w2)...p(wn|w1,w2,...,wn-1)

      =p(w1)p(w2|w1)p(w3|w2)...p(wn|wn-1)   // bigram

  • 假設下一個詞的出現依賴它前面的兩個詞,則有:

p(S)=p(w1)p(w2|w1)p(w3|w1,w2)...p(wn|w1,w2,...,wn-1)

      =p(w1)p(w2|w1)p(w3|w1,w2)...p(wn|wn-1,wn-2)  // trigram 

那么,我們在面臨實際問題時,如何選擇依賴詞的個數,即n。

  • 更大的n:對下一個詞出現的約束信息更多,具有更大的辨別力
  • 更小的n:在訓練語料庫中出現的次數更多,具有更可靠的統計信息,具有更高的可靠性。

理論上,n越大越好,經驗上,trigram用的最多,盡管如此,原則上,能用bigram解決,絕不使用trigram。

2)構造語言模型

通常,通過計算最大似然估計(Maximum Likelihood Estimate)構造語言模型,這是對訓練數據的最佳估計,公式如下:

p(w1|wi-1) = count(wi1-, wi) / count(wi-1)

如給定句子集“<s> I am Sam </s>

                 <s> Sam I am </s>

                 <s> I do not like green eggs and ham </s>”

部分bigram語言模型如下所示:

c(wi)如下:

c(wi-1,wi)如下:

則bigram為:

那么,句子“<s> I want english food </s>”的概率為:

p(<s> I want english food </s>)=p(I|<s>)

                                                ×  P(want|I) 

                                                ×  P(english|want)  

                                                ×  P(food|english)  

                                                ×  P(</s>|food)

                                              =  .000031

為了避免數據溢出、提高性能,通常會使用取log后使用加法運算替代乘法運算。

log(p1*p2*p3*p4) = log(p1) + log(p2) + log(p3) + log(p4)

推薦開源語言模型工具:

推薦開源n-gram數據集:

Total number of tokens: 1,306,807,412,486

Total number of sentences: 150,727,365,731

Total number of unigrams: 95,998,281

Total number of bigrams: 646,439,858

Total number of trigrams: 1,312,972,925

Total number of fourgrams: 1,396,154,236

Total number of fivegrams: 1,149,361,413

Total number of n-grams: 4,600,926,713

3)語言模型評價

語言模型構造完成后,如何確定好壞呢? 目前主要有兩種評價方法:

  • 實用方法:通過查看該模型在實際應用(如拼寫檢查、機器翻譯)中的表現來評價,優點是直觀、實用,缺點是缺乏針對性、不夠客觀;
  • 理論方法:迷惑度/困惑度/混亂度(preplexity),其基本思想是給測試集賦予較高概率值的語言模型較好,公式如下:

由公式可知,迷惑度越小,句子概率越大,語言模型越好。使用《華爾街日報》訓練數據規模為38million words構造n-gram語言模型,測試集規模為1.5million words,迷惑度如下表所示:

4)數據稀疏與平滑技術

大規模數據統計方法與有限的訓練語料之間必然產生數據稀疏問題,導致零概率問題,符合經典的zip'f定律。如IBM, Brown:366M英語語料訓練trigram,在測試語料中,有14.7%的trigram和2.2%的bigram在訓練語料中未出現。

數據稀疏問題定義:“The problem of data sparseness, also known as the zero-frequency problem arises when analyses contain configurations that never occurred in the training corpus.  Then it is not possible to estimate probabilities from observed frequencies, and some other estimation scheme that can generalize (that configurations) from the training data has to be used. —— Dagan”。

人們為理論模型實用化而進行了眾多嘗試與努力,誕生了一系列經典的平滑技術,它們的基本思想是“降低已出現n-gram條件概率分布,以使未出現的n-gram條件概率分布非零”,且經數據平滑后一定保證概率和為1,詳細如下:

  • Add-one(Laplace) Smoothing

加一平滑法,又稱拉普拉斯定律,其保證每個n-gram在訓練語料中至少出現1次,以bigram為例,公式如下:

其中,V是所有bigram的個數。

承接上一節給的例子,經Add-one Smoothing后,c(wi-1, wi)如下所示:

則bigram為:

在V >> c(wi-1)時,即訓練語料庫中絕大部分n-gram未出現的情況(一般都是如此),Add-one Smoothing后有些“喧賓奪主”的現象,效果不佳。那么,可以對該方法擴展以緩解此問題,如Lidstone's Law,Jeffreys-Perks Law。

  • Good-Turing Smoothing

其基本思想是利用頻率的類別信息對頻率進行平滑。調整出現頻率為c的n-gram頻率為c*:

但是,當nr+1或者nr > nr+1時,使得模型質量變差,如下圖所示:

直接的改進策略就是“對出現次數超過某個閾值的gram,不進行平滑,閾值一般取8~10”,其他方法請參見“Simple Good-Turing”。

  • Interpolation Smoothing

不管是Add-one,還是Good Turing平滑技術,對於未出現的n-gram都一視同仁,難免存在不合理(事件發生概率存在差別),所以這里再介紹一種線性插值平滑技術,其基本思想是將高階模型和低階模型作線性組合,利用低元n-gram模型對高元n-gram模型進行線性插值。因為在沒有足夠的數據對高元n-gram模型進行概率估計時,低元n-gram模型通常可以提供有用的信息。公式如下:

擴展方式(上下文相關)為:

λs可以通過EM算法來估計,具體步驟如下:

  • 首先,確定三種數據:Training data、Held-out data和Test data;

  • 然后,根據Training data構造初始的語言模型,並確定初始的λs(如均為1);
  • 最后,基於EM算法迭代地優化λs,使得Held-out data概率(如下式)最大化。
  • Kneser-Ney Smoothing
  • Web-scale LMs

如Google N-gram語料庫,壓縮文件大小為27.9G,解壓后1T左右,面對如此龐大的語料資源,使用前一般需要先剪枝(Pruning)處理,縮小規模,如僅使用出現頻率大於threshold的n-gram,過濾高階的n-gram(如僅使用n<=3的資源),基於熵值剪枝,等等。

另外,在存儲優化方面也需要做一些優化,如使用trie數據結構存儲,借助bloom filter輔助查詢,把string映射為int類型處理(基於huffman編碼、Varint等方法),float/double轉成int類型(如概率值精確到小數點后6位,然后乘10E6,即可將浮點數轉為整數)。

2007年Google Inc.的Brants et al.提出了針對大規模n-gram的平滑技術——“Stupid Backoff”,公式如下:

數據平滑技術是構造高魯棒性語言模型的重要手段,且數據平滑的效果與訓練語料庫的規模有關。訓練語料庫規模越小,數據平滑的效果越顯著;訓練語料庫規模越大,數據平滑的效果越不顯著,甚至可以忽略不計——錦上添花。

5)語言模型變種

  • Class-based N-gram Model

該方法基於詞類建立語言模型,以緩解數據稀疏問題,且可以方便融合部分語法信息。

  • Topic-based N-gram Model

該方法將訓練集按主題划分成多個子集,並對每個子集分別建立N-gram語言模型,以解決語言模型的主題自適應問題。架構如下:

  • Cache-based N-gram Model

該方法利用cache緩存前一時刻的信息,以用於計算當前時刻概率,以解決語言模型動態自適應問題。

-People tends to use words as few as possible in the article. 

-If a word has been used, it would possibly be used again in the future.

架構如下:

猜測這是目前QQ、搜狗、谷歌等智能拼音輸入法所采用策略,即針對用戶個性化輸入日志建立基於cache的語言模型,用於對通用語言模型輸出結果的調權,實現輸入法的個性化、智能化。由於動態自適應模塊的引入,產品越用越智能,越用越好用,越用越上癮。

  • Skipping N-gram Model&Trigger-based N-gram Model

二者核心思想都是刻畫遠距離約束關系。

  • 指數語言模型:最大熵模型MaxEnt、最大熵馬爾科夫模型MEMM、條件隨機域模型CRF

傳統的n-gram語言模型,只是考慮了詞形方面的特征,而沒有詞性以及語義層面上的知識,並且數據稀疏問題嚴重,經典的平滑技術也都是從統計學角度解決,未考慮語法、語義等語言學作用。

MaxEnt、MEMM、CRF可以更好的融入多種知識源,刻畫語言序列特點,較好的用於解決序列標注問題。

三、參考資料

  1. Lecture Slides: Language Modeling
  2. http://en.wikipedia.org
  3. 關毅,統計自然語言處理基礎 課程PPT
  4. 微軟拼音輸入法團隊,語言模型的基本概念
  5. 肖鏡輝,統計語言模型簡介
  6. fandywang,統計語言模型
  7. Stanley F. Chen and Joshua Goodman.  An  empirical study of smoothing techniques for  language modeling. Computer Speech and 
    Language, 13:359-394, October 1999. 
  8. Thorsten Brants et al. Large Language Models in Machine Translation
  9. Gale & Sampson, Good-Turing Smoothing Without Tears
  10. Bill MacCartney,NLP Lunch Tutorial: Smoothing,2005

 

P.S. :  基於本次筆記,整理了一份slides,分享下:統計語言模型(fandywang 20121106) 

 

****************************************************************************************************************************************************************************************************************************************************************************************************************************************

 

 

轉自:http://blog.csdn.net/yqzhao/article/details/7932056

最近學習了一下SRILM的源代碼,分享一下學習筆記(最新完整版本),希望能夠對大家了解SRI語言模型訓練工具有些許幫助。限於本人水平,不足之處,望大家多多指教。

筆記的主要內容使用starUML及其逆向工程工具繪制,主要針對SRILM的訓練(ngram-count),內含5個jpg文件:

  1. 類圖--與ngram-count相關的主要類的靜態圖;
  2. ngram-count--從語料訓練出模型的主要流程;
  3. lmstats.countfile--ngram-count的子流程,用於構建詞匯表和統計ngram的頻度
  4. ngram.estimate--ngram-count的子流程,在詞匯表和ngram頻度的基礎上計算ngram條件概率以及backoff權值的過程
  5. ngram.read--與訓練無關,分析讀取ARPA格式的語言模型的過程

SRILM訓練ngram的過程簡單說來,可歸結為以下幾個步驟:

  1. 先建立Vocab(詞匯表)類型與LMStats(用於ngram統計)類型的兩個實例(即vocab和intStats,intStats中存有vocab的一個引用);
  2. 調用intStats的countFile函數完成(對輸入語料文件中)ngram的統計,這其中也包括詞匯表的構建(以及詞匯索引映射的構建);
  3. 建立Discount*的一個數組(長度為order參數的值,即要訓練的模型的ngram的最大階數),按選定的平滑方式計算各階的折扣率,並保存其中;
  4. 建立Ngram類型(語言模型類)的實例(即lm),調用其estimate函數(以折扣率數組和ngram統計類的對象為參數),計算各階ngram的概率及bow,完成語言模型的訓練;
  5. 按訓練命令參數選項,輸出訓練好的語言模型、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

 


免責聲明!

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



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