Програмный пакет для построения и использования
языковых моделей KenLM лежит на гитхабе:
https://github.com/kpu/kenlmПод win64 у меня получилось откомпилировать из исходников с помтщью VS2015, но сборщик n-грамм не заработал из-за какой-то внутренней ошибки.
Поэтому второй заход я сделал уже под убунтой, все-таки это более developer-friendly вещь.
Клонируем, далее собираем по инструкции
https://github.com/kpu/kenlm/blob/master/README.md (см. Compiling). Под 14-ой убунтой может потребоваться доустановить некоторые пакеты типа libboost-dev-all, на это нужно минут 15-20 в худшем случае.
Сборку статистики по большому корпусу в ~7.8Гб я сделал командой:
~/polygon/kenlm/build/bin/lmplz -o 3 -S 8G < /home/eek/Corpus/word2vector/ru/SENTx.corpus.w2v.txt > ~/polygon/kenlm/text.arpa
Собирались 3-граммы.
Далее проверку построенной модели делал с помощью питоновского кода:
# -*- coding: utf-8 -*-
from __future__ import print_function
import kenlm
import sys
model = kenlm.Model('/home/eek/polygon/kenlm/text.arpa')
while True:
q = raw_input('>').strip().decode( sys.stdin.encoding )
print( u'{} ==> {}'.format( q, model.score(q, bos = True, eos = True)) )
В консоли вводится предложение, модель дает его log-proba.
Прогнал несколько предложений со словарными опечатками, то есть когда слово заменено на другое валидное путем замены символов, и новое слово семантически не вписывается в контекст.
Результаты с дефолтными параметрами получаются не очень.
Есть в принципе правильные оценки, когда предложение с опечаткой признается менее вероятным, чем предложение без опечатки:
действовать о усмотрению -17.8784313202
действовать по усмотрению -9.79017448425
мозг уже на запоминал эти формы -23.3184738159
мозг уже не запоминал эти формы -20.6002902985
это новшество имело оглушительный утех -11.5491752625
это новшество имело оглушительный успех -10.0749874115
пролаю стол, почти новый состояние отличное -23.6093578339
продаю стол, почти новый состояние отличное -21.1007194519
есть с чес сравнить -15.6589298248
есть с чем сравнить -6.20910358429
завтра обильный -11.5290470123
завтрак обильный -8.23690509796
стыд и позор этому отелу -16.9013175964
стыд и позор этому отелю -12.0634918213
красивые костюмы, веселый дел мороз ! -33.8658981323
красивые костюмы, веселый дед мороз ! -33.8135414124
на самом деле это была семейная сора -12.9213943481
на самом деле это была семейная ссора -12.0258197784
Но есть и обратные примеры:
по военной пауке полагалось бы идти но азимуту -20.72
по военной науке полагалось бы идти по азимуту -25.1138629913
ищу постоянную роботу по электродуговой сварке -9.08172035217
ищу постоянную работу по электродуговой сварке -14.7397851944
кровать одна закатывается род другую -11.8411073685
кровать одна закатывается под другую -15.6139192581
достойные доверия очевидны рассказывают следующую историю -12.8128948212
достойные доверия очевидцы рассказывают следующую историю -21.2960166931