KenLM executa Kneser Ney Smoothing modificado interpolado para estimar as probabilidades de n-gramas.
Antes de instalar o kit de ferramentas KenLM, você deve instalar todas as dependências que podem ser encontradas em kenlm-dependencies.
Para distribuição Debian/Ubuntu :
Para obter um compilador funcional, instale o pacote build-essential
. Boost é conhecido como libboost-all-dev
. Cada uma das três opções de compactação suportadas possui um pacote de desenvolvimento separado.
$ sudo apt-get install build-essential libboost-all-dev cmake zlib1g-dev libbz2-dev liblzma-dev
Para isso, sugere-se a utilização de um ambiente virtual conda ou virtualenv . Para conda, você pode criar um usando:
$ conda create -n kenlm_deepspeech python=3.6 nltk
Em seguida, ative o ambiente usando:
$ source activate kenlm_deepspeech
Agora estamos prontos para instalar o kenlm. Vamos primeiro clonar o repositório kenlm:
$ git clone --recursive https://github.com/vchahun/kenlm.git
E então compile o código de estimativa LM usando:
$ cd kenlm
$ ./bjam
Como etapa final, opcionalmente, instale o módulo Python usando:
$ python setup.py install
Primeiro, vamos obter alguns dados de treinamento. Aqui, usarei a Bíblia:
$ wget -c https://github.com/vchahun/notes/raw/data/bible/bible.en.txt.bz2
Em seguida, precisaremos de um script simples de pré-processamento. A razão é porque:
.bz2
) que possui uma única frase por linha. Portanto, crie um script simples preprocess.py
com as seguintes linhas:
import sys
import nltk
for line in sys . stdin :
for sentence in nltk . sent_tokenize ( line ):
print ( ' ' . join ( nltk . word_tokenize ( sentence )). lower ())
Para verificação de sanidade, faça:
$ bzcat bible.en.txt.bz2 | python preprocess.py | wc
E veja se funciona bem.
Agora podemos treinar o modelo. Para treinar um modelo trigrama com suavização Kneser-Ney, use:
# -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
O comando acima primeiro canalizará os dados através do script de pré-processamento que executa tokenização e letras minúsculas. Em seguida, esse texto tokenizado e em letras minúsculas é canalizado para o programa lmplz
que executa o trabalho de estimativa.
Deve terminar em alguns segundos e então gerar um arquivo arpa bible.arpa
. Você pode inspecionar o arquivo arpa usando algo como less
ou more
(ou seja, $ less bible.arpa
). No início, deve haver uma seção de dados com contagens de unigramas, bigramas e trigramas seguidas dos valores estimados.
Os arquivos ARPA podem ser lidos diretamente. Porém, o formato binário carrega muito mais rápido e oferece mais flexibilidade. Usar o formato binário reduz significativamente o tempo de carregamento e também expõe mais opções de configuração. Por estas razões, binarizaremos o modelo usando:
$ ./kenlm/bin/build_binary bible.arpa bible.binary
Observe que, diferentemente do IRSTLM, a extensão do arquivo não importa; o formato binário é reconhecido usando bytes mágicos.
Também é possível usar trie
ao binarizar. Para isso, utilize:
$ ./kenlm/bin/build_binary trie bible.arpa bible.binary
Agora que temos um modelo de linguagem, podemos pontuar sentenças. É muito fácil fazer isso usando a interface Python. Abaixo está um exemplo:
import kenlm
model = kenlm . LanguageModel ( 'bible.binary' )
model . score ( 'in the beginning was the word' )
Então, você pode obter uma pontuação como:
-15.03003978729248