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

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

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

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

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

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

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

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

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

 

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

斯坦福大學天然語言處理第四課「語言模型(Language Modeling)」

+8投票
 

1、課程介紹

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

如下是本課程的學習筆記,以課程PPT/PDF爲主,其餘參考資料爲輔,融入我的拓展、註解,拋磚引玉,歡迎你們在「我愛公開課」上一塊兒探討學習。

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

2、語言模型(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能夠更好的融入多種知識源,刻畫語言序列特色,較好的用於解決序列標註問題。

3、參考資料

  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的邏輯。

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,根據上式算出其相應的(條件)機率值。

 
1
相關文章
相關標籤/搜索