Генерация уместных вопросов с помощью GPT-2

Один из социально важных языковых навыков - умение задать уместный в контексте беседы вопрос. Для чатбота это позволило бы действовать более проактивно, вовлекая собеседника в продолжение беседы.

Попробуем добиться от языковой модели GPT-2 генерации вопросов к заданному текстовому фрагменту на русском языке.

Collapse )

Забавные моменты с русскоязычным GPT-2

Смотрю на текущие результаты сэмплирования из обучающейся языковой модели GPT-2 в варианте с  117M параметрами. Иногда проскакивают забавные словечки, получающиеся из-за склейки bpe-токенов. С некоторыми натяжками выглядят так, будто модель уже знает общие правила русского словообразования и словоизменения, но ошибается с правильным выбором морфем:
Collapse )

25 тысяч корней в викисловаре

К вопросу о генеративных языковых моделях.

Если распарсить русский викисловарь и собрать инфу о морфологическом разборе (секция Морфологические и синтаксические свойства), то выясняется, что всего есть ~25 тысяч уникальных корней.

Некоторые корни весьма продуктивны. Например корень "дв" упомянут для 521 слова, включая составные:
Collapse )

Полный список слов и корней лежит в репозитории NLP Datasets

Доработки в коде чатбота

Доработка кода применения диалоговых правил в чатботе позволяет теперь немного более удобно задавать ответы в случае, когда в базе знаний и FAQ нет релевантной информации:
Collapse )

Дополнительно к этому реализован небольшой эксперимент с обработкой odqa-вопросов:
Collapse )

Сейчас в коде поставлена заглушка. Но по задумке эти нормализованные запросы можно будет обрабатывать через SPARQL-движок.

Модели синонимичности фраз на Keras и PyTorch

Любой ML'щик время от времени делает две вещи - меняет работу и свой deeplearning фреймвок (js-фронтэндеры понимающе улыбнутся). Работу я поменял в прошлом году, теперь настало время посмотреть на модный PyTorch.

Серьезно говоря, единственная фишка питорча, ради которой захотелось его освоить - хайповые динамические графы. С их помощью делать GAN'ы должно быть намного проще, чем в keras'е, где приходится выкручиваться с необучаемыми частями графа и т.д.

Для разминки сделал на питорче сиамскую рекуррентную сетку, определяющую синонимичность двух фраз. Пример датасета лежит тут, это часть текущего 220-тысячного корпуса.
Старая реализация модели на Keras с кучей экспериментального мусора - тут.
Реализация на PyTorch - тут.
Collapse )

Обучающий датасет для русскоязычного NP-чанкера

В репозитории ruchunker выложен датасет, на котором обучается NP chunker.

Формат разметки:

0 Бросай
1 свое
2 захолустье
0 ,
0 полетели
0 .


Первый токен в именной группе помечается меткой 1, последующие токены - меткой 2.

Задача чанкера - выделять в предложениях именные группы. Размечены только ИГ верхнего уровня. Вложенные ИГ, например генитив, считаются частью родительского чанка. Датасет получен автоматической конвертацией tree bank'а.

Обучающий датасет для русскоязычного POS Tagger'а (880 тысяч предложений)

В репозитории rupostagger выложен архив samples.gz

Этот архив содержит мой полный текущий датасет для обучения модели частеречной разметки для русского языка.

Объем датасета - примерно 880 тысяч предложений.

Морфологическая разметка в основном следует рекомендациям Universal Dependencies, за исключением некоторых второстепенных деталей. В частности, не используется класс DET, вместо него указывается ADJ.

Датасет с 70,000 вопросами к боту/собеседнику

В репозитории NLP Datasets выложен файл questions_2s.txt с вопросами, содержащими финитный глагол в форме 2 лица единственного числа. Эти вопросы собраны из большого корпуса с текстами, наскрапленными с форумов, субтитрами и так далее.

Для удобства сэмплы отсортированы по финитному глаголу:
Collapse )

Об ошибках морфологической разметки в OpenCorpora

В догонку к предыдущему посту про качество RnnMorph.

В ходе тщательного анализа результатов моего part-of-speech tagger'а по данным из OpenCorpora наткнулся на такие штуки:

False positive NOUN misprediction for sample:

Центральная катма дискордианства гласит :
itoken=1
word=катма
expected part-of-speech =UNKN
predicted part-of-speech=NOUN


Строка "expected part-of-speech =UNKN" означает, что в разметке OpenCorpora слово "катма" помечено классом UNKN. Подозреваю, что это артефакт полуавтоматической разметки, слово "катма" просто отсутствует в словарной базе OpenCorpora.

Эта ошибка повторяется в корпусе систематически и достаточно сильно смещает статистику.

Также можно заметить, что у меня модель правильно пометила это слово классом NOUN.

Вывод - при подсчете статистики по разметке OpenCorpora категорически рекомендуется выкидывать из рассмотрения метки UNKN. Оценка тут сделана с учетом этого нюанса.

Оценка качества RnnMorph по ручной морфологической разметке из OpenCorpora

Оценка точности разметки существительных для морфологического анализатора RnnMorph.
В качестве эталона разметки взят "Подкорпус со снятой омонимией" из OpenCorpora.

NOUN recall=0.9931500509117838
NOUN precision=0.9943005421435522
NOUN+tags precision=0.9590843797785089


NOUN precision - точность без учета тегов, NOUN+tags - точность с учетом тэгов Case, Number.