SRILM學習筆記說明

最近學習了一下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,根據上式算出其相應的(條件)概率值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章