Аналитика для telegram-ботов, написанных на python

Краткое введение в NLKT

NLTK (Natural Language Toolkit) — платформа для создания программ на Python для работы с естественной речью. NLKT предоставляет простые в использовании интерфейсы для более чем 50 корпораций и лингвистических ресурсов, таких как WordNet, а также набор библиотек для обработки текста в целях классификации, токенизации, генерации, тегирования, синтаксического анализа и понимания семантики, создания оболочки библиотек NLP для коммерческого применения.

Книга Natural Language Processing with Python  — практическое введение в программирование для обработки языка. Рекомендуем ее прочитать, если вы владеете английским языком.

Загрузка и установка NLTK

  • Установите NLTK: запустите pip install nltk.
  • Тестовая установка: запустите python, затем введите import nltk.

Инструкции для конкретных платформ смотрите здесь.

Установка пакетов NLTK

Импортируйте NLTK и запустите nltk.download(). Это откроет загрузчик NLTK, где вы сможете выбрать версию кода и модели для загрузки. Вы также можете загрузить все пакеты сразу.

Предварительная обработка текста с помощью NLTK

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

  • Преобразование букв в заглавные или строчные, чтобы алгоритм не обрабатывал одни и те же слова повторно.
  • Токенизация. Токенизация — термин, используемый для описания процесса преобразования обычных текстовых строк в список токенов, то есть слов. Токенизатор предложений используется для составления списка предложений. Токенизатор слов составляет список слов.

Пакет NLTK включает в себя предварительно обученный токенизатор Punkt для английского языка.

  • Удаление шума, то есть всего, что не является цифрой или буквой;
  • Удаление стоп-слов. Иногда из словаря полностью исключаются некоторые крайне распространенные слова, которые, как считается, не имеют большого значения для формирования ответа на вопрос пользователя. Эти слова называются стоп-словами (междометия, артикли, некоторые вводные слова);
  • Cтемминг: приведение слова к коренному значению. Например, если нам нужно провести стемминг слов «стемы», «стемминг», «стемированный» и «стемизация», результатом будет одно слово — «стем».
  • Лемматизация. Лемматизация — немного отличающийся от стемминга метод. Основное различие между ними заключается в том, что стемминг часто создает несуществующие слова, тогда как лемма — это реально существующее слово. Таким образом, ваш исходный стем, то есть слово, которое получается после стемминга, не всегда можно найти в словаре, а лемму — можно. Пример лемматизации: «run» — основа для слов «running» или «ran», а «better» и «good» находятся в одной и той же лемме и потому считаются одинаковыми.

Модифицируем код

Отлично! Теперь нам осталось заменить строку в функции на . Ваш код должен выглядеть так:

from telegram.ext import Updater, InlineQueryHandler, CommandHandlerimport requestsimport redef get_url():    contents = requests.get('https://random.dog/woof.json').json()    url = contents    return urldef get_image_url():    allowed_extension =     file_extension = ''    while file_extension not in allowed_extension:        url = get_url()        file_extension = re.search("(*)$",url).group(1).lower()    return urldef bop(bot, update):    url = get_image_url()    chat_id = update.message.chat_id    bot.send_photo(chat_id=chat_id, photo=url)def main():    updater = Updater('YOUR_TOKEN')    dp = updater.dispatcher    dp.add_handler(CommandHandler('bop',bop))    updater.start_polling()    updater.idle()if __name__ == '__main__':    main()

Всё должно работать идеально. Этот код можно найти на моём GitHub.

Поздравляю с окончанием урока, теперь у вас есть классный бот для Telegram.

Перевод статьи Dzaky Widya Putra: Learn to build your first bot in Telegram with Python

Установка

Почти все, что мы делаем, будет достигнуто, используя только стандартные библиотеки Python, но мы также будем использовать стороннюю Модуль, который предоставляет ряд улучшений для Python’s И позволяет нам делать HTTP-запросы очень просто и кратко. Установите это через PIP, используя команду, аналогичную следующему (вам может потребоваться использовать вместо и/или добавить флаг flag, основанный на том, как вы обычно устанавливаете Python Библиотеки).

pip3 install requests

Если вы обычно используете виртуальную среду для новых проектов Python, затем сначала установите один из них и установите запросы внутри этого.

Создание бота телеграммы

Первый шаг – сказать телеграмму, которую вы хотите создать новый бот. Все сообщения, которые наш бот отправляет и получает, пройдет через инфраструктуру телеграммы. Наш код периодически сделает запрос на получение всех новых сообщений на наш бот из серверов Telegram и затем отправит ответы на каждое сообщение по мере необходимости. Для того, чтобы зарегистрировать бот с телеграммой, вам сначала нужно создать личную учетную запись телеграммы. Посетить web.telegram.org и введите свой номер телефона. Telegram отправит вам текстовое сообщение (SMS), и затем вы можете создать учетную запись, следуя инструкциям на экране. Если у вас уже есть учетная запись Telegram, вы можете просто использовать это, и вы также можете использовать любой из настольных компьютеров Telegram и мобильных приложений, доступных из Telegram.org, вместо веб-приложения мы будем использовать для всех примеров в Это руководство.

После того, как у вас есть учетная запись Telegram, вы можете зарегистрировать новую телеграмму BOT с помощью отца BOT. Посетить Telegram.me/botfather Начать разговор с ботом телеграммы, который создает другие боты. Телеграмма боты могут получить Сообщения или Команды Отказ Первые – это просто текст, который вы отправляете, как если бы вы отправили сообщение другому человеку, в то время как последние префиксированы с помощью персонаж. Чтобы создать новый бот, отправьте следующую команду для бота отца в чате (точно так же, как будто вы разговаривали с другим человеком на телеграмме).

/newbot.

Вы должны получить ответ мгновенно, который просит вас выбрать имя для своего бота. Мы позвоним нашему боту Потому что к концу этого учебника он будет функционировать как простой список «делать». Отправьте следующее сообщение для бота Отца, когда он предложит вам имя:

Сделать бот

Бот отец теперь попросит вас выбрать имя пользователя для своего бота. Это имя пользователя должно закончиться и быть во всем мире уникальным. Когда телеграмма стала более популярной, она стала сложнее найти краткое и соответствующее имя пользователя для вашего бота. В этом руководстве мы будем использовать , но для остальной части этого учебника мы укажем имя пользователя BOT с Итак, вам придется заменить выбранное имя пользователя там, где нет необходимости. Отправьте выбранное имя пользователя на Бот Отец:

<Ваш-бот-имя пользователя>

Теперь бот отец отправит вам сообщение «поздравления», которое будет включать токен. Токен должен выглядеть что-то подобное:

2483457814: aahrlcx234_vskzwejdwjtsdfuwejhyu5mi.

Для остальной части этого учебника мы укажем, где вам нужно поставить свой токен, используя Отказ

Обратите внимание на токен, так как нам понадобится в код, который мы собираемся написать

Вступление

Что мы хотим сделать

Начнем с того, что определимся, что мы хотим сделать, это телеграмм бот который будет уметь показывать:

  • Статистику случаев заражения COVID-19 по геолокации
  • Статистику запросов стран пользователями
  • Статистику действий пользователей
  • Информацию о контактах
  • Справку, о том, как пользоваться ботом

Что мы будем с этого иметь

Чему мы научимся во время приготовления вакцина-бота:

  • Работой с базой данных mongodb(подключение, получение данных, сохранение)
  • Упаковка приложения в Docker контейнер

Регистрация бота в мессенджере Telegram

Затем необходимо зарегистрировать нашего бота в Telegram и получить токен для работы с ним из нашего кода. Процедура тривиальная, но все же для тех кто не знаком с платформой опишу пошагово:

  • Выполнить команду /start
  • Выполнить команду /newbot
  • Выбрать ник бота и адрес по которому он будет доступен в Telegram
  • Сохраняем token который бот вернул нам в ответе в блокнот

Подготовка машины для программирования бота

Для того чтобы подготовить машину к программированию бота для Telegram необходимо поставить на нее следующее программное обеспечение:

Структура приложения

Структура приложения может быть выбрана вами в зависимости от ваших потребностей, целей и опыта. Но перед этим предлагаю вам создать репозиторий на github с названием вашего бота и склонировать его к себе на машину, это необходимо для использования системы контроля версий и настройки CI в перспективе.

Наш вакцина-бот внутри будет иметь вот такую структуру

Используя длинный опрос

Последняя серьезная проблема с нашим ботом Echo – это то, что он должен сделать веб-запрос каждые 0,5 секунды. Это не отлично подходит для серверов Telegram (они явно просят людей не делать это вне тестирующих сценариев) и не отлично подходит для наших ресурсов. Длительное опрос использует тот факт, что большую часть времени мы получаем «пустые» ответы. Поскольку наш бот, вероятно, не будет получать сообщения каждой полторы, большую часть времени, когда мы просим обновления, нет. С длинным опросом, вместо телеграммы говорят нам, что нет обновлений, он просто держит соединение, пока нет обновлений, а затем отправляет их в открытую трубу. Конечно, нецелесообразно держать соединение открыть навсегда, поэтому мы можем указать количество секунд, пока мы хотим ждать. Это делается путем прохождения другого дополнительного аргумента для Звоните, а именно Отказ

Чтобы наш код использовать длинный опрос, просто обновите наши Способ следующим образом:

def get_updates(offset=None):
    url = URL + "getUpdates?timeout=100"
    if offset:
        url += "&offset={}".format(offset)
    js = get_json_from_url(url)
    return js

Теперь мы всегда проходим вдоль аргумент Потому что у нас сейчас есть два аргумента, нам также нужно менять, где мы ранее имели к (В URL-адресах мы указываем, что список аргументов начинается с A Но дальнейшие аргументы разделены с ).

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

Рассмотрим подробно, как можно написать бота python telegram.

Мы можем подумать, как писать своего робота

Первоначально важно вернутся к постановке своей определенной задачи. Проблемой сложнейших bot в том, что диалог требует постоянного сохранения

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

Пишем бота telegram на python. Чтобы зарегистрировать, требуется выполнить несколько простых шагов:

  • разыскать его под названием @BotFather;
  • набрать слово /start, или /newbot;
  • для этого нужно заполнить поле, которого он попросит (ввести наименование бота и его точное имя). В результате пользователь получает уведомление с его токеном и ссылку на необходимую документацию.

Шаг 1: реализация запросов курсов валют

Для начала необходимо написать код, выполняющий запросы. Воспользуемся при написании API ПриватБанка, ниже расположена ссылка на него: https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5. В коде нужно использовать эти методы:

  • load_exchange – находит курсы валют и выводит закодированную информацию;
  • get_exchange – выводит данные об определенной валюте;
  • get_exchanges – показывает перечисление валют согласно образцу.

В результате код в файле pb.py выглядит так:

import re  import requests  import json      URL = 'https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5'      def load_exchange():      return json.loads(requests.get(URL).text)      def get_exchange(ccy_key):      for exc in load_exchange():          if ccy_key == exc:              return exc      return False      def get_exchanges(ccy_pattern):      result = []      ccy_pattern = re.escape(ccy_pattern) + '.*'    for exc in load_exchange():          if re.match(ccy_pattern, exc, re.IGNORECASE) is not None:              result.append(exc) 

    return result

Программа может выдать такой ответ на указанные запросы:

Как задеплоить в продакшн

Выше я перечислил большой набор технологий, с которыми многие напрямую не работали. Всякие Redis и load balancers …. звучит сложно.

Год назад до меня дошло, что все, что я перечислил выше уже кто-то делал. И да, это стандартные задачи, которые приходится решать, когда ваш продукт начинает сильно расти. Значит ли это, что кто-то взял и автоматизировал весь процесс, позволив разработчикам не тратить время на уже стандартные действия? КОНЕЧНО.

Создание базы данных Postgres и Redis. Повесить домен и прикрутить HTTPs. Запуск еще одного инстанса приложения и запуск load balancer между ними. Автоматическая сборка новой версии приложения и, в случае успеха, zero-downtime замена старого приложения на новое?

Все эти и другие задачи уже давно автоматизированы. Есть платные платформы, которые это умеют (Google App Engine, Digital Ocean App Platform, Heroku). А есть и self-hosted решения (Dokku, CapRover). Self-hosted означает, что вы снимаете где-нибудь сервер (например, Digital Ocean), а потом простым запускаете бесплатный аналог платных платформ.

Почему я пользуюсь Dokku?

Я люблю Heroku за его простоту. Мне очень нравится их интеграция с GitHub репозиторием, которая максимально автоматизирует процесс деплоя. В итоге код, оказавшись в репозитории, автоматически превращается в рабочий сервис. Больше не надо заходить на серверы, скачивать свежую версию кода, собирать из этого контейнер, запускать его и ждать, что он не упадет сразу же по глупой ошибке, перенаправлять траффик со старого контейнера на новый и гасить старый контейнер. Это все происходит автоматически.

Разработка превращается в творческий процесс, а не в мучительную боль гугления на stackoverflow «установить докер», «как же открыть порт», «настроить https» и тп. Один раз вкусив этот плод, уже не сможешь вернуться обратно.

Основная проблема Heroku в том, что он становится очень дорогим, когда бесплатного инстанса перестает хватать: отдельно плати за сервер, отдельно за БД. Что же делать?

Как это обычно бывает, умельцы сделали Open Source self-hosted версию. Называется Dokku. Да, у нее нет красивого UI с кнопочками и one-click github integration, но зато есть очень понятная документация.

Аналогично Heroku, Dokku собирает ваш проект, используя open-source технологию Buildpacks, и позволяет в 2 строчки подключить базы данных и HTTPS шифрование траффика к проекту.

Dokku + Django

Чтобы buildpacks поняли, как запускать ваш проект, нужно указать а) какие зависимости поставить и б) какие команды запускать. Я предпочитаю это все указывать в файлах requirements.txt и Procfile.

В случае с Dokku существует еще третий вспомогательный файл DOKKU_SCALE, в котором указывается сколько копий сервисов нужно запустить. Например, если указать worker=4, это будет значит: возьми из Procfile команду под названием worker (в нашем случае, это Celery worker), запусти ее 4 раза в разных контейнерах, а потом между ними настрой load balancer. Удобно? Удобно.

Прелесть Dokku в том, что когда вы создаете «плагины» с Postgres или Redis, а потом прикрепляете их к вашему приложению, к нему автоматически добавляются переменные окружения и , поэтому возможно понадобится немного пошаманить в settings.py, чтобы код был готов читать эти переменные.

Автодеплои по коммиту делаются очень легко. Достаточно настроить CI так, чтобы во время нового изменения ветки Main он заходил по ssh на сервере и делал условный git pull (во внутренний репозиторий Dokku). Этот процесс легко автоматизируется через GitHub Actions, вот код.

Если вам нужна пошаговая инструкция, как создать Dokku приложение, как подключить к нему базы данных, как прикрутить HTTPs, автоматическую сборку через GitHub Actions по коммиту в мастер, читайте в Wiki страничке.

Очень надеюсь, что такая сумбурная статья кому-то будет полезной. Напомню, что вот сюда я выложил рабочий код — шаблон телеграм бота, где реализовано все, что упоминалось в статье. Также у меня есть свой Телеграм канал, где я делюсь своим опытом разработки ТГ ботов и не только.

Публикация бота на PAAS платформу Heroku

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

  • Также Heroku потребует у вас добавить платежную карту несмотря на то что план бесплатный, это обязательное условие сервиса к сожалению если вы хотите использовать addon-ы

После того как MongoDb добавлена к вашему приложению, переходим на страницу управления базой данных и копируем строку соединения с базой(connection string) и добавляем ее в переменную окружения. Пробуем вручную опубликовать на Heroku, убедитесь что приложение создано на Heroku и у вас установлено ПО для контейнеризации приложений Docker на машине.

На этом подготовка нашего Heroku приложения закончена, переходим к настройке CI.

Взаимодействуя с нашим ботом через ваш веб-браузер

Мы можем контролировать наш бот, отправив HTTPS-запросы на телеграмму. Это означает, что самый простой способ взаимодействовать с нашим ботом через веб-браузер. Посещая разные URL-адреса, мы отправляем разные команды нашу бот. SimpleSt Command – это то, где мы получаем информацию о нашем боте. Посетите следующий URL в вашем браузере (подставляя токен бота, который вы получили раньше)

https://api.telegram.org/bot/getme

Первая часть URL указывает, что мы хотим общаться с Telegram API (API.TELEGRAMAM.ORG). Мы следуем это с Чтобы сказать, что мы хотим отправить команду нашему боту, и сразу после того, как мы добавим наш токен, чтобы определить, какой бот мы хотим отправить команду и доказать, что у нас есть. Наконец, мы указываем команду, которую мы хотим отправить ( ), которая в этом случае только что возвращает базовую информацию о нашем боте, используя JSON. Ответ должен выглядеть похоже на следующее:

{"ok":true,"result":{"id":248718785,"first_name":"To Do Bot","username":"exampletodo_bot"}}

Получение сообщений, отправленных на наш бот

Самый простой способ для нас для получения сообщений, отправленных на наш бот, проходит через вызов. Если вы посетите , вы получите ответ JSON всех новых сообщений, отправленных на ваш бот. Наш бот – совершенно новый и, вероятно, еще не получил никаких сообщений, поэтому, если вы сейчас посетите это, вы должны увидеть пустой ответ.

Telegram Bots не могут говорить с пользователями, пока пользователь сначала не инициирует разговор (это уменьшить спам). Для того, чтобы попробовать Звоните, мы сначала отправлю сообщение на наш бот из нашей собственной учетной записи Telegram. Посетить Чтобы открыть разговор с вашим ботом в веб-клиенте (или найти в любой из клиентов Telegram). Вы должны увидеть ваш бот, отображаемый с . кнопка в нижней части экрана. Нажмите эту кнопку, чтобы начать общаться со своим ботом. Отправьте свой бот короткое сообщение, например «Hello».

Теперь посетите URL снова, и вы должны увидеть ответ JSON, показывающую сообщения, которые получили ваш бот (включая один из при нажатии кнопки «Пуск»). Давайте посмотрим на пример этого и выделите данные импорта, которые мы будем писать код для извлечения в следующем разделе.

{"ok":true,"result":[{"update_id":625407400,
"message":{"message_id":1,"from":{"id":24860000,"first_name":"Gareth","last_name":"Dwyer (sixhobbits)","username":"sixhobbits"},"chat":{"id":24860000,"first_name":"Gareth","last_name":"Dwyer (sixhobbits)","username":"sixhobbits","type":"private"},"date":1478087433,"text":"\/start","entities":}},{"update_id":625407401,
"message":{"message_id":2,"from":{"id":24860000,"first_name":"Gareth","last_name":"Dwyer (sixhobbits)","username":"sixhobbits"},"chat":{"id":24860000,"first_name":"Gareth","last_name":"Dwyer (sixhobbits)","username":"sixhobbits","type":"private"},"date":1478087624,"text":"test"}}]}

Раздел JSON – список обновлений, которые мы еще не подтвердили (мы поговорим о том, как подтвердить обновления позже). В этом примере наш бот имеет два новых сообщения. Каждое сообщение содержит кучу данных о том, кто его отправил, какой чат он является частью, и содержимое сообщения. Две детали информации, на которой мы сосредоточимся на данный момент, – это идентификатор чата, который позволит нам отправить ответное сообщение и текст сообщения, который содержит текст сообщения. В следующем разделе мы увидим, как извлечь эти две части данных с помощью Python.

Отправка сообщения от нашего бота

Окончательный вызов API, который мы попробуем в нашем браузере, которое используется для отправки сообщения. Для этого нам нужен идентификатор чата для чата, где мы хотим отправить сообщение. Есть куча разных идентификаторов в ответе JSON от Позвоните, так что убедитесь, что вы получите правильный. Это поле, которое находится внутри поле (24860000 в примере выше, но ваши будут разные). Как только у вас есть этот идентификатор, посетите следующий URL в вашем браузере, подставляя для вашего идентификатора чата.

https://api.telegram.org/bot/sendMessage?chat_id=&text=TestReply

После того, как вы посетили этот URL, вы должны увидеть сообщение от вашего бота, отправленного на ваш, который говорит «Testreply».

Теперь, когда мы знаем, как отправлять и получать сообщения, используя API Telegram, мы можем перейти с автоматическим использованием этого процесса, написав несколько логики в Python.

Часть 2 Написание кода

sudo apt-get install python python-pip

Далее воспользуемся системой управления пакетами PIP, которая используется для установки и управления программными пакетами, и установим библиотеку PyTelegramBotAPI (Telebot):

Создадим логику работы нашего бота. Используя полноценный IDE или простой текстовый редактор создадим файл ourbot.py и заполним его необходимой логикой.

import telebot 

bot = telebot.TeleBot(‘851216368:AAG6_JHHsIqAK-lX2CxOWQHTAM109zdrcZM’)

Теперь создадим метод, для получения сообщений.

Возможности PyTelegramBotAPI позволяют отправлять боту аудио (content_types=[‘audio’), видео (content_types=[‘video’), документы (content_types=[‘document’), текст (content_types=[‘text’), географический адрес (content_types=[‘location’), данные контакта (content_types=[‘contact’) и стикеры (content_types=[‘sticker’).  Мы, для простоты опыта, будем общаться с ботом только текстом:

@bot.message_handler(content_types=)
def handle_text_messages(message):

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

Видео курсы по схожей тематике:

UX/UI Design Стартовый

Артур Рыгус

UX/UI Design мобильных приложений

Владислав Шевченко

Создаем игру типа “Pokémon Go“

Роман Самчук

    if message.text == «Привет»:
        bot.send_message(message.from_user.id, «Привет»)
    elif message.text == «Кто ты?»:
        bot.send_message(message.from_user.id, «Я тестовый чатбот для учебного примера.»)
    elif message.text == «Как тебя зовут?»:
        bot.send_message(message.from_user.id, «Меня зовут MyFirstTestBot.»)
    elif message.text == «Что ты умеешь?»:
        bot.send_message(message.from_user.id, «Я умею отвечать на несколько простых вопросов — кто я, как меня зовут и что я умею делать.»)
    else:
        bot.send_message(message.from_user.id, «Я тебя не понимаю. Напиши что-то другое.»)

После тела метода, обрабатывающего наши запросы к боту, добавим вызов метода:

bot.polling(none_stop=True, interval=0)

Задачей этого метода является создание потока, в котором бот отправляет запросы на сервер, уточняя таким способом, не писал ли ему кто-то сообщение. Параметр none_stop: False означает, что наша программа будет продолжать отправлять запросы на сервер после получения сообщения об ошибке от сервера Telegram.

Сохраним наш код:

Мы можем протестировать работу нашего бота, запустив его код в той IDE, в которой мы писали. И написав нашему боту в мессенджере.

Все работает.

Наш учебный Telegram-бот создан. Мы можем запустить наш файл локально, и он будет отрабатывать запросы к нему через мессенджер прямо на нашем компьютере, выступающим в роли сервера. Но это не очень удобная практика. Для нормальной работы код желательно залить на отдельный сервер и запустить его там.

Вопросы заливки нашего простого бота на сервер мы рассмотрим в следующей статье.

Writing your first bot

A simple echo bot

The TeleBot class (defined in _init_.py) encapsulates all API calls in a single class. It provides functions such as (, etc.) and several ways to listen for incoming messages.

Create a file called .
Then, open the file and create an instance of the TeleBot class.

import telebot

bot = telebot.TeleBot("TOKEN", parse_mode=None) # You can set parse_mode by default. HTML or MARKDOWN

Note: Make sure to actually replace TOKEN with your own API token.

After that declaration, we need to register some so-called message handlers. Message handlers define filters which a message must pass. If a message passes the filter, the decorated function is called and the incoming message is passed as an argument.

Let’s define a message handler which handles incoming and commands.

@bot.message_handler(commands='start', 'help'])
def send_welcome(message):
	bot.reply_to(message, "Howdy, how are you doing?")

A function which is decorated by a message handler can have an arbitrary name, however, it must have only one parameter (the message).

Let’s add another handler:

@bot.message_handler(func=lambda m True)
def echo_all(message):
	bot.reply_to(message, message.text)

This one echoes all incoming text messages back to the sender. It uses a lambda function to test a message. If the lambda returns True, the message is handled by the decorated function. Since we want all messages to be handled by this function, we simply always return True.

Note: all handlers are tested in the order in which they were declared

We now have a basic bot which replies a static message to «/start» and «/help» commands and which echoes the rest of the sent messages. To start the bot, add the following to our source file:

bot.polling()

Alright, that’s it! Our source file now looks like this:

import telebot

bot = telebot.TeleBot("TOKEN")

@bot.message_handler(commands='start', 'help'])
def send_welcome(message):
	bot.reply_to(message, "Howdy, how are you doing?")

@bot.message_handler(func=lambda message True)
def echo_all(message):
	bot.reply_to(message, message.text)

bot.polling()

To start the bot, simply open up a terminal and enter to run the bot! Test it by sending commands (‘/start’ and ‘/help’) and arbitrary text messages.

Метод TF-IDF

Проблема «набора слов» заключается в том, что в тексте могут доминировать часто встречающиеся слова, которые не содержат ценную для нас информацию

Также «набор слов» присваивает большую важность длинным текстам по сравнению с короткими

Один из подходов к решению этих проблем состоит в том, чтобы вычислять частоту появления слова не в одном тексте, а во всех сразу. За счет этого вклад, например, артиклей «a» и «the» будет нивелирован. Такой подход называется TF-IDF (Term Frequency-Inverse Document Frequency) и состоит из двух этапов:

TF — вычисление частоты появления слова в одном тексте

TF = (Число раз, когда слово "t" встречается в тексте)/(Количество слов в тексте)

IDF — вычисление того, на сколько редко слово встречается во всех текстах

IDF = 1+log(N/n), где N - общее количество текстов, n - во скольких текстах встречается "t"

Коэффициент TF-IDF — это вес, часто используемый для обработки информации и интеллектуального анализа текста

Он является статистической мерой, используемой для оценки важности слова для текста в некотором наборе текстов

Пример

Рассмотрим текст, содержащий 100 слов, в котором слово «телефон» появляется 5 раз. Параметр TF для слова «телефон» равен (5/100) = 0,05.

Теперь предположим, что у нас 10 миллионов документов, и слово телефон появляется в тысяче из них. Коэффициент вычисляется как 1+log(10 000 000/1000) = 4. Таким образом, TD-IDF равен 0,05 * 4 = 0,20.

TF-IDF может быть реализован в scikit так:

from sklearn.feature_extraction.text import TfidfVectorizer

Создание скелета бота

Теперь, когда все настроено, мы можем приступить к программированию! Начнем с нашего файла :

import os

from telegram import Update #upm package(python-telegram-bot)
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, CallbackContext  #upm package(python-telegram-bot)


def help_command(update: Update, context: CallbackContext) -> None:
    htext = '''
Welcome
Send a message to store it.
Send /fetch to retrieve the most recent message'''
    update.message.reply_text(htext)


def main():
    updater = Updater(os.getenv("TOKEN"))

    dispatcher = updater.dispatcher
    dispatcher.add_handler(CommandHandler("start", help_command))
    dispatcher.add_handler(CommandHandler("help", help_command))

    updater.start_polling()

    updater.idle()


if __name__ == '__main__':
    main() 

Сначала мы импортируем модуль , чтобы получить доступ к токену как переменной окружения.

Затем мы импортируем некоторые классы из библиотеки Telegram.

Комментарии, начинающиеся с , не являются обязательными. Они используются Replit для загрузки правильного пакета. В общем случае это не нужно, но здесь необходимо, потому что подобных библиотек Telegram очень много.

Функция запускается всякий раз, когда пользователь отправляет нам команду или . Команда также выполняется автоматически, когда новый пользователь запускает ваш бот (как мы ранее запускали ). Бот будет знать, как использовать эту функцию, потому что мы сообщим ему об этом позже в теле функции .

В функции main мы инициализируем экземпляр класса , который использует наш токен.

updater = Updater(os.getenv("TOKEN"))

— это класс, который будет постоянно проверять Telegram на наличие новых сообщений в нашем боте.

Когда получает новое сообщение, он передает его в класс . Тот проверяет, есть ли у нас подходящий обработчик для данного сообщения. Как уже упоминалось выше, нужно задать обработчик для команд и . Мы cделаем это при помощи функции , например:

dispatcher.add_handler(CommandHandler("start", help_command))

и

dispatcher.add_handler(CommandHandler("help", help_command))

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

Затем нам нужно сказать классу , чтобы он начал проверку новых сообщений. Мы это сделаем при помощи следующей строки.

updater.start_polling()

Важно знать, что — это неблокирующая функция. Это означает, что код в ней не прекращает выполнение

Он будет исполняться, пока программа не завершится.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector