KenLM 執行插值修正 Kneser Ney 平滑來估計 n 元語法機率。
在安裝 KenLM 工具包之前,您應該安裝 kenlm-dependencies 中的所有相依性。
對於 Debian/Ubuntu 發行版:
若要獲得可用的編譯器,請安裝build-essential
套件。 Boost 被稱為libboost-all-dev
。三個支援的壓縮選項都有一個單獨的開發包。
$ sudo apt-get install build-essential libboost-all-dev cmake zlib1g-dev libbz2-dev liblzma-dev
為此,建議使用conda 或 virtualenv虛擬環境。對於 conda,您可以使用以下命令建立一個:
$ conda create -n kenlm_deepspeech python=3.6 nltk
然後使用以下命令啟動環境:
$ source activate kenlm_deepspeech
現在我們準備安裝 kenlm。讓我們先克隆 kenlm 儲存庫:
$ git clone --recursive https://github.com/vchahun/kenlm.git
然後使用以下命令編譯 LM 估計程式碼:
$ cd kenlm
$ ./bjam
最後一步,可以選擇使用以下命令安裝 Python 模組:
$ python setup.py install
首先讓我們來取得一些訓練資料。在這裡,我將使用聖經:
$ wget -c https://github.com/vchahun/notes/raw/data/bible/bible.en.txt.bz2
接下來我們需要一個簡單的預處理腳本。原因是因為:
.bz2
),每行只有一個句子。因此,使用以下幾行建立一個簡單的腳本preprocess.py
:
import sys
import nltk
for line in sys . stdin :
for sentence in nltk . sent_tokenize ( line ):
print ( ' ' . join ( nltk . word_tokenize ( sentence )). lower ())
對於健全性檢查,請執行以下操作:
$ bzcat bible.en.txt.bz2 | python preprocess.py | wc
並看到它工作正常。
現在我們可以訓練模型了。若要使用 Kneser-Ney 平滑訓練三元組模型,請使用:
# -o means `order` which translates to the `n` in n-gram
$ bzcat bible.en.txt.bz2 |
python preprocess.py |
./kenlm/bin/lmplz -o 3 > bible.arpa
上面的命令將首先透過執行標記化和小寫化的預處理腳本傳輸資料。接下來,這個標記化的小寫文字透過管道傳送到執行估計工作的lmplz
程式。
它應該在幾秒鐘內完成,然後產生一個 arpa 檔案bible.arpa
。您可以使用less
或more
之類的內容檢查 arpa 檔案(即$ less bible.arpa
)。一開始,它應該有一個資料部分,其中包含一元語法、二元語法和三元語法計數,後面跟著估計值。
ARPA檔案可以直接讀取。但是,二進位格式載入速度更快並且提供了更大的靈活性。使用二進位格式可以顯著減少載入時間,並且還可以公開更多組態選項。由於這些原因,我們將使用以下方法對模型進行二值化:
$ ./kenlm/bin/build_binary bible.arpa bible.binary
請注意,與 IRSTLM 不同,檔案副檔名並不重要;二進位格式是使用魔術位元來識別的。
二值化時也可以使用trie
。為此,請使用:
$ ./kenlm/bin/build_binary trie bible.arpa bible.binary
現在我們有了語言模型,我們可以對句子進行評分。使用 Python 介面來完成此操作非常簡單。下面是一個例子:
import kenlm
model = kenlm . LanguageModel ( 'bible.binary' )
model . score ( 'in the beginning was the word' )
然後,您可能會得到以下分數:
-15.03003978729248