Продолжаем наш предыдущий пост про создание чатбота, который выдавал уместные ответы на реплики пользователя. Сегодня говорим о том, как превратить тексты в числовые векторы, чтобы осуществлять по ним приближённый поиск.
Вчера мы познакомились с библиотекой pandas в Python - она позволяет загружать таблицы, осуществлять поиск в них, и т.п. Сегодня затронем библиотеку scikit-learn (sklearn), которая позволяет более хитрые манипуляции с данными - то, что называется машинным обучением. Это значит, что любому алгориту сперва нужно показать данные (fit), чтобы он узнал о них что-то важное. В результате алгорити "научится" делать с этими данными что-то полезное - преобразовывать их (transform), или даже предсказывать неизвестные величины (predict).
В данном случае мы хотим преобразовать тексты ("вопросы") в числовые векторы. Это нужно, чтобы можно было находить "близкие" друг к другу тексты, пользуясь математическим понятием расстояние. Расстояние между двумя точками можно рассчитать по теореме Пифагора - как корень из суммы квадратов разностей их координат. В математике это называется Евклидовой метрикой. Если мы сможем превращать тексты в объекты, у которых есть координаты, то мы сможем вычислять Евклидову метрику и, например, находить в базе вопрос, наиболее всего похожий на "о чём ты думаешь?".
Самый простой способ задать координаты текста - это пронумеровать все слова в языке, и сказать, что i-тая координата текста равна числу вхождений в него i-того слова. Например, для текста "я не могу не плакать" координата слова "не" равна 2, координаты слов "я", "могу" и "плакать" равны 1, а координаты всех остальных слов (коих десятки тысяч) равны 0. Такое представление теряет информацию о порядке слов, но всё равно работает неплохо.
Проблема в том, что у слов, которые встречаются часто (например, частиц "и" и "а") координаты будут несоразмерно большие, хотя информации они несут мало. Чтобы смягчить эту проблему, координату каждого слова можно поделить на логарифм числа текстов, где такое слово встречается - это называется tf-idf и тоже работает неплохо.
Проблема только одна: в нашей базе 60 тысяч текстовых "вопросов", в которых содержится 14 тысяч различных слов. Если превратить все вопросы в векторы, получится матрица 60к*14к. Работать с такой не очень классно, поэтому завтра мы поговорим о сокращении размерности. Stay tuned!
#матчасть #weirdmath #chatbot #sklearn #tfidf #vectorization #machinelearning
Post #158
443