Исходный код (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.