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