Пример претензии к pymorphy2 в качестве поставщика морфологии для парсера

Одна из основных проблем при использовании pymorphy2 в качестве морфологического анализатора для парсера видна на следующем примере. Вот результаты анализа слов в тестовом предложении "в огромном сарае лежало старое сено":
Collapse )

Bottomup парсер на чистом питоне

Раз в два-три года я пробую делать какой-то новый парсер для русского языка. Последний раз это была неудачная попытка прикрутить reinforcement learning для shift-reduce парсера, обучаемого на корпусе эталонных разборов.

В этот раз за полтора месяца сделан прототип восходящего вероятностного парсера на чистом питоне.

Collapse )

Расширение поддержки русского языка в Duckling

Duckling - библиотека от Facebook, позволяющая извлекать из текста структурированные данные. Например, с ее помощью из строки "смартфон стоит двенадцать тысяч рублей" можно выделить числительное "двенадцать тысяч". Попутно для извлеченной информации делается некоторая нормализация, то есть получим представление в числовом виде "12000".

Помимо других альтернативных инструментов, Duckling можно использовать в фреймворке чатботов RASA для NER.

Чтобы "пощупать" этот экстрактор, нужно скачать репозиторий, скомпилировать, запустить rest-сервис. После чего через браузер или curl можно прокачивать тексты и видеть json-результаты.

Попробуем:
Collapse )

а вот простейшая seq2seq модель для генерации реплик в читчат боте что выдает

После обучения на объединенном датасете диалогов из Толоки + мои датасеты для чатбота, модель, не учитывающая контекст, а только текст заданного вопроса, выдает такую "болтовню":
Collapse )

Классификация интентов в чатботе - сравнение моделей ELMO, BERT и char-level linear sklearn

Сравнение выполнялось по f1 weighted метрике на датасете с ~5100 сэмплов через 8-фолдовую кросс-валидацию. Чуть больше 70 интентов с большим дисбалансом.

Финальные результаты:

LinearSVC ~0.77
BERT        ~0.815
ELMo        ~0.817
Collapse )

Изменения в порядке генерации ответов в чатботе

В коде релиза 0.0.2.2 кроме всяких правок ошибок и более точных NLP моделек сделана одна существенная модификация в генераторе ответов.
Раньше чатбот на вопросы, относящиеся к нему "лично", генерировал ответ общим алгоритмом, то есть искал релевантный факт в базе знаний, брал отуда необходимый фрагмент и строил ответ. Выглядело это примерно так:
Collapse )

Релиз чатбота 0.0.1 (альфа) - вербальные формы, сценарии и прочее

В проекте русскоязычного чатбота сделан релиз с большими изменениями в коде бота. В основном работа велась над возможность задавать поведение бота через вручную задаваемые правила - сценарии и вербальные формы.

Collapse )

Вербальные формы в чатботе: в ближайшем релизе

Написанный для чатбота код для поддержки вербальных форм будет поддерживать такие ценарии общения с пользователем (реплики человека отмечены H:, реплики бота B:):

B:> День добрый
H:> хочу заказать что-нибудь поесть
B:> Что заказать?
H:> пиццу с анчоусами
B:> Сколько порций?
H:> две
B:> Заказываю: что="пиццу с анчоусами", сколько="две"

Релиз чатбота 0.0.0.16 - встраивание движка в RASA

В рамках этого релиза чатбота я серьезно переработал исходный код и "обиблиотечил" движок. Теперь бот можно встраивать в питоновский код, как это показано на примере интеграции с RASA.

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

Мысли по поводу интеграции движка чатбота с RASA

В рамках рабочей задачи я сделал кастомный компонент для RASA, который выполняет классификацию интентов для фразы с помощью нейросетевой модели, работающей поверх русского BERT. В целом, все достаточно просто, если знать про некоторые технические нюансы. Например, не стоит делать ленивую загрузку модели в методе process, лучше это делать в конструкторе. И надо аккуратно относится к исключениям в process, иначе pipeline RASA склонен где-то зависать (там все на корутинах, как я понимаю).

По смутным ощущениям, этот классификатор работает лучше, чем штатная модель SklearnIntentClassifier с добавкой символьных шинглов (CountVectorsFeaturizer), или чем EmbeddingIntentClassifier. Хотя намного тяжелее по памяти, конечно.

Итак, теперь у нас есть следующие возможности интеграции с RASA, проверенные своими руками и примерами кода:

1) Кастомные обработчики событий (Custom Actions). Каждый такой обработчик оформляется в виде класса и может делать всякие полезные вещи, основываясь на свойствах сообщения. В самом простом варианте обработчик может вернуть текст ответной реплики. Обработчики работают в самом конце пайплайна, то есть получают уже обработанное сообщение с определенным интентом, выделенными entities и т.д.

2) Кастомные компоненты для пайплайна (Custom Components). Работают "внутри" пайплайна и могут выставлять какие-то признаки для обрабатываемого сообщения, например значения entities, модифицировать текст сообщения и т.д.

Сейчас мне кажется, что для интеграция с движком чатбота будет самой эффективной во втором случае, так как через кастомный компонент проходят все сообщения. В первом варианте обработчик action'а получает только те сообщения, на интенты которых он подписан в рамках историй.