يقوم KenLM بإجراء Kneser Ney Smoothing المعدل والمحرف لتقدير احتمالات n-gram.
قبل تثبيت مجموعة أدوات KenLM، يجب عليك تثبيت كافة التبعيات التي يمكن العثور عليها في تبعيات kenlm.
بالنسبة لتوزيعة 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 repo:
$ 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
. يمكنك فحص ملف arpa باستخدام شيء مثل less
أو more
(أي $ less bible.arpa
). في البداية، يجب أن يحتوي على قسم بيانات يحتوي على أعداد unigram وbigram وtrigram متبوعة بالقيم المقدرة.
يمكن قراءة ملفات 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