KenLM realiza el suavizado Kneser Ney modificado interpolado para estimar las probabilidades de n-gramas.
Antes de instalar el kit de herramientas KenLM, debe instalar todas las dependencias que se pueden encontrar en kenlm-dependencies.
Para la distribución Debian/Ubuntu :
Para obtener un compilador que funcione, instale el paquete build-essential
. Boost se conoce como libboost-all-dev
. Las tres opciones de compresión admitidas tienen cada una un paquete de desarrollo independiente.
$ sudo apt-get install build-essential libboost-all-dev cmake zlib1g-dev libbz2-dev liblzma-dev
Para ello, se sugiere utilizar un entorno virtual conda o virtualenv . Para conda, puedes crear uno usando:
$ conda create -n kenlm_deepspeech python=3.6 nltk
Luego active el entorno usando:
$ source activate kenlm_deepspeech
Ahora estamos listos para instalar kenlm. Primero clonemos el repositorio de kenlm:
$ git clone --recursive https://github.com/vchahun/kenlm.git
Y luego compila el código de estimación de LM usando:
$ cd kenlm
$ ./bjam
Como paso final, opcionalmente, instale el módulo Python usando:
$ python setup.py install
Primero, obtengamos algunos datos de entrenamiento. Aquí usaré la Biblia:
$ wget -c https://github.com/vchahun/notes/raw/data/bible/bible.en.txt.bz2
A continuación necesitaremos un script de preprocesamiento simple. La razón es porque:
.bz2
) que tenga una sola oración por línea. Entonces, cree un script simple preprocess.py
con las siguientes líneas:
import sys
import nltk
for line in sys . stdin :
for sentence in nltk . sent_tokenize ( line ):
print ( ' ' . join ( nltk . word_tokenize ( sentence )). lower ())
Para comprobar la cordura, haga:
$ bzcat bible.en.txt.bz2 | python preprocess.py | wc
Y ver que funciona bien.
Ahora podemos entrenar el modelo. Para entrenar un modelo de trigrama con suavizado de Kneser-Ney, utilice:
# -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
El comando anterior primero canalizará los datos a través del script de preprocesamiento que realiza la tokenización y el uso de minúsculas. A continuación, este texto tokenizado y en minúsculas se canaliza al programa lmplz
que realiza el trabajo de estimación.
Debería finalizar en un par de segundos y luego generar un archivo arpa bible.arpa
. Puede inspeccionar el archivo arpa usando algo como less
o more
(es decir, $ less bible.arpa
). Al principio, debe tener una sección de datos con recuentos de unigramas, bigramas y trigramas seguidos de los valores estimados.
Los archivos ARPA se pueden leer directamente. Sin embargo, el formato binario se carga mucho más rápido y proporciona más flexibilidad. El uso del formato binario reduce significativamente el tiempo de carga y también expone más opciones de configuración. Por estos motivos, binarizaremos el modelo usando:
$ ./kenlm/bin/build_binary bible.arpa bible.binary
Tenga en cuenta que, a diferencia de IRSTLM, la extensión del archivo no importa; el formato binario se reconoce mediante bytes mágicos.
También se puede utilizar trie
al binarizar. Para ello utilice:
$ ./kenlm/bin/build_binary trie bible.arpa bible.binary
Ahora que tenemos un modelo de lenguaje, podemos calificar oraciones. Es muy fácil hacer esto usando la interfaz de Python. A continuación se muestra un ejemplo:
import kenlm
model = kenlm . LanguageModel ( 'bible.binary' )
model . score ( 'in the beginning was the word' )
Entonces, podría obtener una puntuación como:
-15.03003978729248