В предыдущие три дня мы закачали в python корпус диалогов, векторизовали его, и сократили размерность, а теперь хотим наконец научиться искать по нему ближайших соседей и осмысленно отвечать на вопросы.
Поскольку научились отображать вопросы в Евклидово пространство не очень высокой размерности, поиск соседей в нём можно осуществлять довольно быстро. Мы воспользуемся уже готовым алгоритмом поиска соседей BallTree. Но мы напишем свою модель-обёртку, которая выбирала бы одного из k ближайших соседей, причём чем ближе сосед, тем выше вероятность его выбора. Ибо брать всегда одного самого близкого соседа - скучно, но не завязываться на сходство совсем - опасно.
Поэтому мы хотим превратить найденные расстояния от запроса до текстов-эталонов в вероятности выбора этих текстов. Для этого можно использовать функцию softmax, которая ещё часто стоит на выходе из нейросетей. Она превращает свои аругементы в набор неотрицательных чисел, сумма которых равна 1 - как раз то, что нам нужно. Дальше полученные "вероятности" мы можем использовать для случайного выбора ответа.
Фразы, которые будет вводить пользователь, надо пропускать через все три алгоритма - векторизатор, метод главных компонент, и алгоритм выбора ответа. Чтобы писать меньше кода, можно связать их в единую цепочку (pipeline), применяющую алгоритмы последовательно.
В результате мы получили алгоритм, который по вопросу пользователя способен найти похожий на него вопрос и выдать ответ на него. И иногда это ответы даже звучат почти осмысленно ^^
Осталось совсем немного - прикрутить получившегося бота к Телеграму. Про это будет наш завтрашний пост.
#матчатсть #weirdMath #chatbot #чатбот #softmax #sampling
Post #162
562