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

Мы напишем простой чат-бот, используя библиотеку nltk (набор инструментов обработки естественного языка, Natural Language Toolkit). Это ведущая платформа создания программ на Python для работы с данными на “человеческом” языке. 

Импортируем необходимые библиотеки:

Импортируем набор данных в блок данных pandas:

Данные выше содержат 1592 единицы и две колонки контекста, который может быть логически выведен в виде запроса, а текстовый ответ является ответом на этот запрос. Если открыть набор данных в Excel, видно, что в нем существуют нулевые значения; также мы можем обнаружить, что данные расположены в различных кластерах, то есть за вопросами одного типа в одном месте следуют вопросы аналогичного типа.

Нулевые значения передаются для того же типа вопросов, ответ на которые может быть почти одинаковым и в подобной группе вопросов; ответ дается на первый вопрос, остальные остаются с нулевым значением. Таким образом, мы можем использовать ffill(), возвращающий значение предыдущего ответа вместо нуля, как показано ниже: 

По шагам:

Давайте рассмотрим подробнее первый шаг —  нормализацию текста — где мы преобразуем данные в нижний регистр, затем удаляем специальные символы и выполняем лемматизацию. 

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

Мы видим, что текст чист. Токенизация слов — это процесс преобразования обычных текстовых строк в список токенов. 

Функция pos_tag возвращает части речи каждого токена, таким образом функция-лемматизатор определяет части речи токена и преобразует токен в корневое слово, как показано ниже: 

Теперь создадим функцию, выполняющую все перечисленные выше шаги: 

Давайте проверим функцию, применив ее к набору данных:

Функция работает хорошо. Следующий шаг — извлечение признаков слов. Это представление текста, где у слов, имеющих схожее значение, схожее представление. У нас есть две модели для этого процесса: bag of words (bow) и tf-idf.

Использование bow:

BOW — это представление текста, которое описывает частотность слов в документе. Предположим, ваш словарь содержит слова {Playing, is, love}, и мы хотим векторизовать текст “Playing football is love”. У нас получится следующий вектор: (1, 0, 1, 1).

В строке 0 набора данных bow помечает 1 все присутствующие в тексте слова, а остальные 0.

Стоп-слова — это чрезвычайно распространенные слова, которые, имеют низкое значение для соответствия целям пользователя, следовательно, они полностью исключаются из словаря. Ниже заданные заранее стоп-слова: 

Давайте рассмотрим пример и попробуем получить ответ на запрос: 

Выше мы задали вопрос ‘Will you help me and tell me about yourself more’, выполнили нормализацию текста и затем применили bow к вопросу. Теперь, чтобы получить соответствующий ответ, найдем косинусное сходство между вопросом и ответом и лемматизированным текстом.

Косинусное сходство:

Косинусное сходство — это мера сходства между двумя векторами. Оно представляет значение, которое вычисляется путем деления скалярного произведения на произведение норм между двумя векторами.

Косинусное сходство a и b — это скалярное произведение a и b, поделённое на |a| * |b|.

В индексе 194 мы получили наивысшее сходство с запросом. Давайте напечатаем текст в этой позиции и посмотрим, связан он с вопросом или нет. 

Смотрите, модель работает очень хорошо 🙂

Использование tf-idf:

tf — частотность терма, term frequency—частотность слова в текущем документе, а idf — обратная частотность документа, inverse document frequency —подсчет того, насколько редко слово встречается в документе. Здесь документ представляет собой текст, например, строку 0 или 1 и т.д., где документы ссылаются на все строки в наборе данных. 

Выше значения, полученные с использованием tf-idf. Теперь использования косинусного сходства позволяет найти ответ, полученный с помощью tf-idf.

В индексе 4 у нас есть наиболее схожий текст, имеющий отношение к нашему вопросу. Давайте посмотрим на ответ на вопрос:

Используя tf-idf, мы получили другой ответ, который тоже хорошо подходит к вопросу. 

Давайте создадим функцию, которая возвращает ответ на запрос, используя tf-idf. Это очень просто — нам нужно объединить все темы, которые были выше в этой статье:

Давайте посмотрим на некоторые ответы на разные запросы.

Прекрасно, модель отвечает очень хорошо. 

Заключение

Таким же образом можно написать бот, используя bow. Все, что нужно сделать, —  это следовать трем шагам: нормализация текста, объединение слов и косинусное сходство. Собранная нами модель не использует искусственный интеллект, но, тем не менее, отвечает весьма хорошо. Полный код можно найти здесь GitHub.

Читайте также:


Перевод статьи Bhargava Sai Reddy P: A Chatbot in Python using nltk

Предыдущая статья3 способа клонирования объектов в JavaScript
Следующая статьяКак компилировать ZXing C++ в Wasm, используя WASI SDK в Linux