Первый опыт использования KenLM для оценки валидности предложения

Mar 17, 2017 15:24

Програмный пакет для построения и использования языковых моделей 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

статистика, N-граммы, language model

Previous post Next post
Up