KenLM выполняет интерполированное модифицированное сглаживание Кнезера Нея для оценки вероятностей n-грамм.
Перед установкой набора инструментов KenLM вам следует установить все зависимости, которые можно найти в kenlm-dependents.
Для дистрибутива 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
И увидеть, что все работает нормально.
Теперь мы можем обучить модель. Для обучения модели триграммы со сглаживанием Кнезера-Нея используйте:
# -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
. Вы можете проверить файл arpa, используя что-то вроде less
или more
(т. е. $ 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