Найти в Дзене
Nuances of programming

Как создать простого командного бота в Python

Оглавление

Источник: Nuances of Programming

Итак, как часто вы узнаете погоду или время у Siri, Алисы или Google? Сейчас на рынке существует несколько видов ботов. Некоторые из них более сложные, способные поддерживать непрерывный диалог, а другие просто выполняют различные предварительно запрограммированные действия.

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

Итак, создаем набор данных, но сначала определим некоторые понятия.

  • Функции —  это взаимодействие между ботом и человеком. Оно состоит из шаблонов, тегов и ответов.
  • Шаблоны —  это фразы или ключевые слова, которые может задавать человек для запуска и формирования процесса.
  • Теги —  это название процесса, который необходимо выполнить.
  • Ответы —  это может быть один или несколько ответов, которые должен выдавать получившийся бот.

Например, функция приветствия:

Итак, нам потребуется:

  1. yml-файл со всеми функциями, которые должен выполнять готовый бот. Если вы не знаете, что такое yml-файл, то пройдите по этой ссылке.
  2. Python 3 либо версии выше.
  3. Библиотеки TensorFlow, pickle и nltk.

Разделим все на 3 главные части или класса: считыватель функций бота, модель бота и загрузчик бота. Вот какие данные необходимо будет импортировать:

Считыватель функций бота

Этот класс предназначен для чтения yml-файла с функциями. Для данной модели бота понадобится 4 выхода: лемматизатор, слова, классы и функции. Бот, которого мы создаем,  —  простой классификатор. В нем каждый тег является классом, а токенизированные и лемматизированные слова  —  вводимыми данными.

Наконец, необходимо узнать, какую из всех команд или действий должен выполнить бот. Итак, классы  —  это теги. Затем нужны токенизированные и приведенные к начальной форме слова. Для этого понадобится лемматизатор и токенизатор слов  —  они есть в библиотеке nltk. Сначала создаем имя класса BotIntentsReader.

Мы добавили дополнительный вывод под названием documents, который представляет собой только объединение токенизированных слов (до лемматизации) и тегов. Эта переменная будет повторяться для обучения модели.

Модель бота

Вводимыми данными для модели бота будет список токенизированных слов для шаблона. Мы лемматизируем каждое слово, чтобы привести его к начальной форме и составить список связанных с ним слов. Затем создадим массив из слов с обозначением 1, если в текущем шаблоне найдено либо не найдено совпадение между словами. Для вывода создадим двоичную матрицу для репрезентации каждого тега. Все это сделаем с помощью алгоритма order_data (внутри класса BotModelCreator), который будет выполняться в рамках инициализации (при создании класса).

Вторая и самая интересная часть  —  это построение модели. На входе модели бота будет список слов. В случае приветствия функция будет равна 23 (всего разных слов). Затем  —  вывод возможных тегов (в данном случае 2), которые были заданы. Для этой модели мы будем использовать простую нейронную сеть, но вы можете попробовать более продвинутую или сеть с другой архитектурой по вашему выбору. Архитектура представляет собой два плотных слоя 32 и 16 с функцией активации RELU и выдачей 0,5.

Теперь, когда у нас есть все  —  от последовательности ввода до алгоритмов обучения, остается только натренировать бота. Сначала нужно загрузить все модели и создать данные для бота, а затем и саму модель. Можно оставить сообщение по умолчанию равным 0 (если вы хотите регистрировать в логе информацию об обучении, измените его на 1 или 2).

Теперь нам нужно сохранить все файлы модели, которые необходимы для использования бота.

bot_data = BotIntentsReader("intents.yml")
bot_model = BotModelCreator(
bot_data=bot_data,
)
bot_model.train_model()
bot_model.save_models()

Наконец у нас есть файлы, модель обучена, но что теперь? Как взаимодействовать с получившимся ботом? Для этого нужно создать новый класс, который может загружаться из файла или передавать объект bot_model для прогнозирования тега. Также нужен метод, который использует для ввода текст и возвращает ответ от бота. Можно добавить и защиту от незнакомых команд: если пользователь отправит предложение, в котором нет нужного слова из созданного выше списка слов, бот ответит: «Я вас не понимаю, пожалуйста, повторите».

Для тестирования нужно только создать объект загрузчика бота и сообщить ему некоторый текст. Теперь единственное, что остается сделать,  —  это добавить больше функций с тегами, шаблонами и ответами, чтобы сделать бота «умнее».

-2

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

Читайте нас в Telegram, VK

Перевод статьи Sebastian Correa: Make a Simple Comand BOT Python