?

Log in

No account? Create an account

Компьютерная лингвистика

Новостная лента www.solarix.ru

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

Read more...Collapse )

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

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

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

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

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

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

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

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

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

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

Оценки для задачи "бинарная классификация - является ли реплика продолжением диалога"
kelijah
Сделал оценки нескольких методов для определения, является ли реплика допустимым продолжением диалога.
Датасет - Толока. Взято 100,000 реплик. (Был еще контест в 2018 от Я с похожей задачей, тамошний датасет, по-моему, грязноват в сравнении с Толокой.)
В качестве истории бралась одна предшествующая фраза другого собеседника.
Негативные сэмплы добавлялись в количестве 1 на 1 позитивный.
Оценки получены кроссвалидацией на 3х фолдах.

Baseline - LinearSVC на символьных шинглах roc auc=0.55
LightGBM на символьных шинглах ruc auc=0.645
Нейросетка поверх pretrained ruBERT из deeppavlov roc auc=0.709

PS: Если увеличить обучающий набор до 200,000 позитивных пар, roc auc BERT-классификатора вырастает до 0.723.

Немного болтовни с чатботом 0.0.0.13
kelijah
В новом релизе чатбота в движке сделаны некоторые правки, чтобы получались (иногда) вот такие диалоги:
Read more...Collapse )
Это уже намного ближе к обычной болтовне незнакомых людей, как, например, в этом датасете Toloka Persona Chat Rus. То есть меньше механичности, больше импровизации и проактивности. Хотя косяков пока многовато - иногда (кхм, частенько) бот выдает малорелевантные реплики, иногда модели генерации текста поставляют мусор.

Чтобы справится с этими косяками, нужна модель для оценки того, насколько реплика вписывается в общий дискурс диалога. Я попробовал сделать черновую модельку на базе ELMO из deeppavlov (ElmoEmbedder) плюс линейный регрессор для предсказания вектора следующей реплики, чтобы через cosine между предсказанным и фактическим вектором оценивать уместность реплики. Результат в целом нулевой, так как по метрике precision@k предсказанный вектор с трудом попадает в top-40% фраз, из которых одна - действительно релевантная. Следующая попытка - нейросетевой регрессор поверх BERT. Я проверил на ruBERT из deeppavlov плюс keras-bert, вроде бы немного более обнадеживающие результаты, будем препарировать тему дальше.

Профили в чатботе
kelijah
В новом релизе чатбота я добавил "профили" - текстовые файлы (json), в которых указываются пути к файлам с фактами и правилами. С их помощью, думаю, будет проще создавать разные "характеры". В этих же профилях в будущем будут доступны тонкие настройки характера бота (ну не прямо как тут, конечно, хотя...). Сейчас сделан базовый отладочный профиль, который позволяет чатботу отвечать на десяток простых вопросов о самом себе, примерно так:
Read more...Collapse )

NER датасет из каггла "text-normalization-challenge-russian-language"
kelijah

Вот эти данные для entity типа DATA содержат огромное количество строк типа

Проверено 1 января 2016 . International Renaissance Foundation.
Проверено 16 января 2016 . Смотрим телевизор . | 16 января 2016
Проверено 21 февраля 2016 . Текмаш отметил 160 летие . | 21 февраля 2016


Уверен на 100%, что данные получены простой конвертацией викиданных из русской Википедии. Возможно, для некоторых моделей NER перекос в статистике паттернов будет снижать немного их качество. Ну и мусора там, конечно, прилично:

People ( 27 августа 2001 ) .
Deadline.com ( 17 ноября 2014 ) .
ESCToday ( 19 марта 2012 ) .


и т.д.



RASA, spacy, русский язык и NER
kelijah
После трех дней осады и борьбы, у меня заработала связка из текущей версии RASA и spacy (я взял готовые модели для русского языка, спасибо Юрию за помощь :) ).

Кроме того, я сделал конвертор для своего NER датасета в формат для обучения Spacy NER. После пары часов получилось дообучить спейсовский NER, взяв за основу код отсюда:
Read more...Collapse )

Еще датасеты со словосочетаниями, короткими и неполными предложениями
kelijah
В добавок к этому, залил в репозиторий старые (2015 год) залежи. В то время они были собраны для проверки синтаксияеского парсера. Например, S+V+INSTR.zip содержит сэмплы типа "Я вертел ими", в которых творительный падеж актанта однозначен, то есть эти сэмплы однозначно определяют соответствующий слот у глаголов. Еще любопытный пример - конструкции с  местоимениями "я" и "ты" в роли подлежащего и личным глаголом свидетельствуют о том, что глагол употребляется с одушевленным субъектом.

Сейчас хочу использовать эти данные для обучения языковых моделей чатбота, но, возможно, они кому-то еще пригодятся.
Read more...Collapse )