Одна из многих притягательных сторон Twitter заключается в том, что вы можете написать твит своему любимому знаменитости и (возможно) получить ответ. Однако твиты всё же не так интимны, как обмен текстовыми сообщениями. Поэтому мы решили создать бота с использованием цепей Маркова, программируемых SMS и Python, который будет имитировать вашего любимого твиттер-персонажа.
С помощью приведённого ниже кода можно создать SMS-чат-бота, который будет звучать как любой пользователь Twitter. Но чтобы продемонстрировать его истинный потенциал, нам нужен кто-то с ярким и узнаваемым стилем твитов. Кто-то с огромной харизмой. Кто-то, у кого «лучшие слова».
Кто-то вроде Дональда Трампа.
Хотели бы вы поспорить с Трампом? Отправьте ему сообщение по номеру: 847-55-TRUMP (847-558-7867).
Создание этого бота состоит из трёх шагов:
— Загрузите твиты определённого пользователя, чтобы создать корпус текста.
— Используйте корпус для генерации предложения в стиле автора твитов.
— Ответьте на SMS этим предложением.
Для выполнения этих шагов вам понадобятся Python, учётная запись Twitter и бесплатная учётная запись Twilio.
Прежде чем начать, стоит отдать должное Филипу Храчеку, чей проект Automatic Donald Trump вдохновил нас на эту идею. Ознакомьтесь с его статьёй для отличного объяснения, как реализовать цепи Маркова на Dart.
Цепи Маркова начинаются с корпуса — библиотеки текстов для обучения модели. Мы используем модифицированную версию этого скрипта tweet_dumper, чтобы загрузить твиты через Twitter API.
Для начала создайте и активируйте новое виртуальное окружение:
Затем перейдите в папку, где вы храните свой код, создайте директорию для проекта и файл get_tweets.py.
В get_tweets.py импортируйте tweepy, csv и модуль регулярных выражений:
Для доступа к API нам понадобятся учётные данные Twitter. Создайте новое приложение в Twitter Application Manager. В качестве сайта можно указать любой домен, а поле обратного вызова оставить пустым. После создания сгенерируйте учётные данные:
Создадим функцию, которая загружает все твиты для указанного имени пользователя. Это нужно делать итеративно, так как Twitter API позволяет получать только 200 твитов за раз. Кроме того, можно получить не более 3024 последних твитов. Как только мы достигнем этого предела, массив new_tweets будет пустым, и мы поймём, что пора прекратить итерации.
До тех пор мы продолжаем запрашивать твиты у Twitter и добавлять их в all_tweets. Чтобы быть уверенными, что слова исходят прямо с клавиатуры Трампа, мы будем сохранять только те твиты, где tweet.source == ‘Twitter for iPhone’ (удалите это условие, если создаёте бота для других пользователей).
Для этого добавьте следующий код в конец файла get_tweets:
Добавьте функцию в конец файла, чтобы удалить лишний текст и сделать ответы более похожими на SMS, а не на твиты:
Затем добавьте функцию, которая:
— Принимает массив сырых твитов в качестве параметра
— Открывает CSV-файл для записи
— Проходит по каждому твиту
— Записывает каждый непустой очищенный твит в файл
Наконец, добавьте код в конец файла для получения твитов и записи их в CSV:
Запустите скрипт с помощью команды python get_tweets.py. Примерно половина из 3200 твитов Трампа пройдёт через наши фильтры, так что в итоге у вас должно получиться около 1600 строк.
Возможно, вы не осознаёте этого, но вы сталкиваетесь с цепями Маркова каждый день — именно они обеспечивают функцию автозаполнения на клавиатуре вашего телефона. Когда дело доходит до генерации предложений, цепи Маркова задают вопрос: «Основываясь на последнем введённом слове и всех фразах, которые вы вводили ранее, что вы, скорее всего, введёте дальше?» Для более глубокого понимания механики цепей Маркова ознакомьтесь со статьёй Филипа или с визуальным объяснением от Виктора Пауэлла.
К счастью, нам не нужно выполнять расчёты Маркова вручную. Пакет markovify от Джереми Сингер-Вайна абстрагирует генерацию текстовых цепей Маркова, позволяя создавать предложения из корпуса всего в две строки.
Установите пакет markovify:
Создайте файл app.py. Вставьте этот код, чтобы импортировать markovify, создать модель на основе корпуса и вывести короткую цепочку Трампа:
Запустите python app.py и восхититесь правдоподобностью или абсурдностью сгенерированного компьютером высказывания. Теперь осталось только подключить этот код к телефонному номеру.
Когда кто-то отправляет SMS на наш номер Twilio, Twilio делает HTTP-запрос к нашему приложению. В ответ он ожидает HTTP-ответ в формате TwiML — простой набор XML-тегов, которые указывают Twilio, что делать дальше.
Мы будем использовать Flask, микрофреймворк для Python, чтобы обработать этот POST-запрос. Также мы используем библиотеку Twilio для генерации TwiML-ответа, который отправит ответное сообщение.
Установите эти два пакета:
Удалите всё содержимое app.py и замените его на следующее:
Запустите приложение с помощью команды python app.py.
Если вы работаете на локальной машине, вам понадобится общедоступный URL для localhost, чтобы Twilio мог получить доступ к вашему скрипту. Самый быстрый способ сделать это — использовать ngrok.
В отдельном окне терминала запустите ngrok и скопируйте предоставленный URL в буфер обмена (смотрите GIF ниже):
Зарегистрируйтесь в бесплатной учётной записи Twilio, если у вас её ещё нет. Купите телефонный номер, затем настройте его. Прокрутите вниз до раздела *Message* и найдите поле *A Message Comes In*. Вставьте URL от ngrok и добавьте к нему конечную точку /message. Сохраните настройки и отправьте свой животрепещущий вопрос на ваш новый номер Twilio.
Отличная работа! Всего несколькими строками Python вы:
— Добыли данные из Twitter с помощью Twitter API
— Создали цепи Маркова на Python
— Ответили на SMS с помощью Twilio на Python
Вооружившись этими навыками, вы, вероятно, придумаете что-то гораздо более полезное, чем бот, притворяющийся Дональдом Трампом. Чтобы помочь вам в этом начинании, вот несколько полезных ресурсов:
— Как создать SMS-бота для Slack от Мэтта Макая
— Быстрые старты Twilio и Python
— Учебные материалы Twilio (с клонируемыми, готовыми к продакшену приложениями)
Если эта статья вдохновила вас на создание чего-то крутого или у вас есть вопросы, я буду рад услышать об этом. Напишите мне на gb@twilio.com или найдите меня в Twitter по адресу @greggyb.
P.S. Пожалуйста, голосуйте. Зарегистрироваться можно через HelloVote, отправив SMS с текстом HELLO на номер 384-387.
*Большое спасибо Рикки и Мэтту за рецензирование.*