KenLM führt eine interpolierte modifizierte Kneser-Ney-Glättung zur Schätzung der N-Gramm-Wahrscheinlichkeiten durch.
Bevor Sie das KenLM-Toolkit installieren, sollten Sie alle Abhängigkeiten installieren, die in kenlm-dependencies zu finden sind.
Für die Debian/Ubuntu-Distribution :
Um einen funktionierenden Compiler zu erhalten, installieren Sie das build-essential
-Paket. Boost ist als libboost-all-dev
bekannt. Für die drei unterstützten Komprimierungsoptionen gibt es jeweils ein eigenes Entwicklungspaket.
$ sudo apt-get install build-essential libboost-all-dev cmake zlib1g-dev libbz2-dev liblzma-dev
Hierzu wird empfohlen, eine virtuelle Conda- oder Virtualenv- Umgebung zu verwenden. Für Conda können Sie eines erstellen mit:
$ conda create -n kenlm_deepspeech python=3.6 nltk
Aktivieren Sie dann die Umgebung mit:
$ source activate kenlm_deepspeech
Jetzt können wir Kenlm installieren. Klonen wir zunächst das Kenlm-Repo:
$ git clone --recursive https://github.com/vchahun/kenlm.git
Und kompilieren Sie dann den LM-Schätzcode mit:
$ cd kenlm
$ ./bjam
Als letzten Schritt installieren Sie optional das Python-Modul mit:
$ python setup.py install
Lassen Sie uns zunächst einige Trainingsdaten abrufen. Hier verwende ich die Bibel:
$ wget -c https://github.com/vchahun/notes/raw/data/bible/bible.en.txt.bz2
Als nächstes benötigen wir ein einfaches Vorverarbeitungsskript. Der Grund liegt darin, dass:
.bz2
) sein, die einen einzelnen Satz pro Zeile enthält. Erstellen Sie also ein einfaches Skript preprocess.py
mit den folgenden Zeilen:
import sys
import nltk
for line in sys . stdin :
for sentence in nltk . sent_tokenize ( line ):
print ( ' ' . join ( nltk . word_tokenize ( sentence )). lower ())
Gehen Sie zur Plausibilitätsprüfung wie folgt vor:
$ bzcat bible.en.txt.bz2 | python preprocess.py | wc
Und achten Sie darauf, dass es gut funktioniert.
Jetzt können wir das Modell trainieren. Verwenden Sie zum Trainieren eines Trigrammmodells mit Kneser-Ney-Glättung:
# -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
Der obige Befehl leitet die Daten zunächst durch das Vorverarbeitungsskript, das die Tokenisierung und Kleinschreibung durchführt. Als Nächstes wird dieser tokenisierte und in Kleinbuchstaben geschriebene Text an das Programm lmplz
weitergeleitet, das die Schätzung durchführt.
Es sollte in ein paar Sekunden fertig sein und dann eine Arpa-Datei bible.arpa
generieren. Sie können die Arpa-Datei mit etwas wie less
oder more
(z. B. $ less bible.arpa
) überprüfen. Ganz am Anfang sollte es einen Datenabschnitt mit der Anzahl der Unigramme, Bigramme und Trigramme geben, gefolgt von den geschätzten Werten.
ARPA-Dateien können direkt gelesen werden. Das Binärformat lädt jedoch viel schneller und bietet mehr Flexibilität. Die Verwendung des Binärformats verkürzt die Ladezeit erheblich und bietet außerdem mehr Konfigurationsoptionen. Aus diesen Gründen werden wir das Modell wie folgt binarisieren:
$ ./kenlm/bin/build_binary bible.arpa bible.binary
Beachten Sie, dass die Dateierweiterung im Gegensatz zu IRSTLM keine Rolle spielt; Das Binärformat wird mithilfe von Magic Bytes erkannt.
Beim Binarisieren kann man auch trie
verwenden. Verwenden Sie dazu:
$ ./kenlm/bin/build_binary trie bible.arpa bible.binary
Da wir nun über ein Sprachmodell verfügen, können wir Sätze bewerten . Mit der Python-Schnittstelle geht das ganz einfach. Nachfolgend finden Sie ein Beispiel:
import kenlm
model = kenlm . LanguageModel ( 'bible.binary' )
model . score ( 'in the beginning was the word' )
Dann erhalten Sie möglicherweise eine Punktzahl wie:
-15.03003978729248