Генерация ответа чатбота: классификационная модель

Jul 16, 2018 21:52

Исходный код (Python, XGBoost) лежит в репозитории. Файлы обученной на полном наборе вопросов и ответов модели лежат в папке https://github.com/Koziev/chatbot/tree/master/tmp и имеют имена xgb_answer_generator.*

Что делает модель

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

Примеры работы

Модель можно запустить в режиме интерактивной проверки. Для этого в командной строке указывается ключ --run_mode query:

python xgb_answer_generator.py --run_mode query

Далее вводятся парами факты-предпосылки и вопросы, а модель выдает сгенерированный ответ, например:

Premise:> Миша дружит со Славой.
Question:> Кто друг Миши?
Answer: слава

Premise:> Миша пьет сок.
Question:> Сок кто пьет?
Answer: миша

Premise:> Ира вокруг песочницы бегает.
Question:> Кто бегает?
Answer: ира

Иногда модель выбирает неверный формат ответа, например не тот режим глагольного управления:

Premise:> кошка охотится на мышей
Question:> кого ловит кошка?
Answer: на мышей

Ну и так далее, вплоть до невнятного лепета, в котором только угадываются следы русской речи.

Краткая идея модели

Модель учится выбирать очередной символ для строки ответа, располагая следующей информацией:

1. Текст предпосылки - релевантного факта, найденного в базе знаний с помощью отдельной модели детектора релевантности. В описываемом коде эта модель никак не участвует, в частности для консольного теста текст предпосылки вводится явно.

2. Текст вопроса, заданного собеседником чатботу.

3. Цепочка символов ответа, сгенерированная к данному моменту. Генерация начинается со специального символа, обозначаемого в коде константной BEG_CHAR, и заканчивается символом, присвоенным константе END_CHAR. Так как при обучении модель видит цепочку заведомо валидных символов, то имеем все достоинства и недостатки teacher forcing алгоритма.

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

Выходом модели будет вектор длиной около 50, соответствующий символам кириллицы, цифрам и другим символам. Для генерации всего ответа начинаем с символа BEG_CHAR, получаем следующий символов, дописываем его в п.3 и повторяем классификацию до получения символа END_CHAR или по достижении предельной длины ответа во избежание зацикливания.

Обучение модели длится на моей машине примерно 2-3 часа для максимальной глубины деревьев 6, если не использовать GPU.

chatbot, xgboost, character language model, python, генерация текста, градиентный бустинг

Previous post Next post
Up