Как написать Телеграмм бота на питоне

Чтобы придумать надежный и запоминающийся пароль, можно объединить несколько слов в последовательность, напоминающую сюжет. А после — разбавить специальными символами. Алгоритм простой, но его можно автоматизировать — написать Telegram-бота для генерации паролей. В тексте рассказываем, как это сделать.

1824 просмотров

Используйте навигацию, если нет времени читать текст целиком:

  • Требования к работе бота
  • Что понадобится для разработки бота
  • Как настроить бота
  • Деплой бота на сервер
  • Программируем кастомные пресеты
  • Что можно добавить

Требования к работе бота

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

  • Длина пароля должна быть от 2 до 8 слов. Так мы усложним задачу злоумышленнику: подобрать связку слов намного сложнее, чем одно слово.
  • Между словами могут быть разделители в виде цифр и спецсимволов. Это увеличит энтропию и затруднит подбор пароля. Пароль с разделителями может выглядеть так: unmovable8ENCRUST=macho.
  • Дополнительно в пароле могут использоваться спецсимволы в начале (префиксы) и в конце (суффиксы) слова, которые также помогут увеличить сложность подбора.
  • Количество слов, разделителей, префиксов и суффиксов должен настраивать пользователь. Для этого ему нужен интерфейс в виде сообщения с кнопками настроек.
  • Пользовательские настройки должны сохраняться даже после перезагрузки сервера с ботом. В качестве базы данных подойдет Redis.

Что понадобится для разработки бота

Telegram Bot на Python / Создания ботов для начинающих за 30 минут

Перед началом нужно подготовить среду разработки, установить нужные библиотеки и программы, а именно:

  • Python — от версии 3.9 и выше,
  • aiogram — асинхронный фреймворк для работы с Telegram Bot API,
  • Redis — быстрое key-value хранилище,
  • redis-py — клиент для работы с Redis,
  • XKCD-password-generator — библиотека для генерации паролей,
  • pydantic — библиотека для валидации данных и формирования настроек приложения.

Самое главное — репозиторий на GitHub. Его нужно импортировать в свое рабочее окружение и настроить.

Как настроить бота

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

Если используете среду разработки PyCharm, запустить бота будет максимально просто. После клонирования репозитория переключитесь на ветку article-tweaks (git checkout article-tweaks) и создайте новую конфигурацию запуска (Run Configuration). А затем установите параметры:

Должно получится, как на скриншоте:

После этого запустите созданную конфигурацию. Вы увидите в консоли следующий текст:

INFO:aiogram.dispatcher.dispatcher:Start polling

Если используете не PyCharm, то процесс запуска несколько отличается. Создайте виртуальное окружение bot (python3 -m venv bot) и установите зависимости (pip install -r requirements.txt), а после — запустите бота следующей командой:

КАК ОТКРЫТЬ СВОЙ МАГАЗИН В TELEGRAM | TELEGRAM БОТ НА PYTHON

BOT_TOKEN=ключ от BotFather STORAGE_MODE=memory WORDS__WORDFILE=/path/to/words.txt python -m bot

Теперь попробуйте отправить в личные сообщения с ботом команду /start. Если в ответ получили текстовое приветствие, бот работает.

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

  • /generate_weak –— два случайных слова без каких-либо дополнительных символов.
  • /generate_normal — три случайных слова, каждое из которых случайным образом может состоять из всех прописных или всех строчных букв, в качестве разделителей используются числа.
  • /generate_strong — то же, что и в предыдущем случае, но слов четыре, а в качестве разделителей, помимо цифр, возможны спецсимволы.

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

Также есть команда /settings — она выводит сообщение с настройками, и /generate — отправляет сгенерированный пароль с учетом новой конфигурации:

Деплой бота на сервер

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

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

Для начала зарегистрируемся в панели управления и создадим новый сервер в разделе Облачная платформа. Затем — настроим его.

Боту подойдет ОС Ubuntu 22.04 LTS, 2 виртуальных ядра с минимальной границей в 10% процессорного времени, 2 ГБ оперативной памяти, а также 10 ГБ на сетевом диске (базовый HDD).

С учетом выделенного IP-адреса такая конфигурация выйдет примерно в 28 ₽/день. При желании можно обойтись без маршрутизируемого IP, поскольку Telegram-бот может принимать события методом опроса (поллинга), даже находясь за NAT.

После подключения к серверу по SSH, бота необходимо перенести. Для этого выполните следующие шаги:

1. Откройте консоль сервера и обновите систему с помощью команды:

apt update apt upgrade -y

2. Создайте отдельного пользователя для нашего бота и добавьте его в группу sudoers:

Дальнейшие действия выполняйте от лица созданного пользователя.

3. Установите Redis и присоедините его к systemd, воспользовавшись удобной инструкцией от DigitalOcean. Шаги 4 и 5 можно пропустить.

4. Клонируйте репозиторий и переключитесь на нужную ветку:

5. Настройте виртуальное окружение:

python3 -m venv venv source /venv/bin/activate pip install -r requirements.txt

6. Создайте файл systemd-службы по пути /etc/systemd/system/passgenbot.service со следующим содержимым:

[Unit] Description=Telegram Password Generator Bot Requires=redis.service After=network.target redis.service [Service] Type=simple WorkingDirectory=/home/bot/passgenbot ExecStart=/home/bot/passgenbot/venv/bin/python -m bot User=bot Group=bot EnvironmentFile=/home/bot/passgenbot/.env KillMode=process Restart=always RestartSec=10 [Install] WantedBy=multi-user.target

7. Обратите внимание на директиву EnvironmentFile. Создайте этот файл и поместите туда необходимые переменные окружения:

Еще по теме:  В Телеграмме удалить исключения контакта

8. Убедитесь, что Redis запущен (systemctl status redis) и включите бота с добавлением в автозапуск:

sudo systemctl enable passgenbot —now
Программируем кастомные пресеты

Возможности бота можно в любой момент персонализировать под себя. Если пресетов станет недостаточно — добавить новые или изменить существующие. Это сделать достаточно просто.

За генерацию паролей по заданным пресетам отвечает класс XKCD. Под капотом наш бот выглядит так:

# bot/pwdgen.py from random import choice from xkcdpass import xkcd_password class XKCD: # Весь список разделителей, отдельно цифры, отдельно – спецсимволы delimiters_numbers = [«0», «1», «2», «3», «4», «5», «6», «7», «8», «9»] delimiters_full = [«!», «$», «%», «^», «, «*», «-«, «_», «+», «=», «:», «|», «~», «?», «/», «.», «;»] + delimiters_numbers def __init__(self, filename: str): # Загрузка словаря в память self.wordlist = xkcd_password.generate_wordlist( wordfile=filename, valid_chars=»[a-z]», min_length=4, max_length=10, ) def weak(self): # Слабый пароль: 2 слова без раздетилей return xkcd_password.generate_xkcdpassword( self.wordlist, numwords=2, delimiter=»», ) def normal(self): # Средний пароль: 3 слова, разделитель # в виде случайной цифры return xkcd_password.generate_xkcdpassword( self.wordlist, numwords=3, case=»random», random_delimiters=True, valid_delimiters=self.delimiters_numbers ) def strong(self): # Сильный пароль: 4 слова и большой выбор разделителей return xkcd_password.generate_xkcdpassword( self.wordlist, numwords=4, case=»random», random_delimiters=True, valid_delimiters=self.delimiters_full ) def custom(self, count: int, separators: bool, prefixes: bool): # Произвольный пароль: # сложность зависит от настроек пользователя pwd = xkcd_password.generate_xkcdpassword( self.wordlist, numwords=count, case=»random», delimiter=»», random_delimiters=separators, valid_delimiters=self.delimiters_full ) if prefixes == separators: return pwd elif separators and not prefixes: return pwd[1:-1] elif prefixes and not separators: return f»»

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

И последним этапом — добавить в обработчик commands функцию для вызова своего пресета. Это можно сделать по аналогии с существующими пресетами.

# bot/handlers/commands.py from aiogram import types, Dispatcher from aiogram.utils.markdown import hcode from bot.pwdgen import XKCD async def cmd_generate_weak(message: types.Message): # вызов пресета weak pwd: XKCD = message.bot.get(«pwd») await message.answer(hcode(pwd.weak())) async def cmd_generate_normal(message: types.Message): # вызов пресета normal pwd: XKCD = message.bot.get(«pwd») await message.answer(hcode(pwd.normal())) async def cmd_generate_strong(message: types.Message): # вызов пресета strong pwd: XKCD = message.bot.get(«pwd») await message.answer(hcode(pwd.strong())) # вот здесь можно добавить свою функцию для вызова пресета # регистрация команд def register_commands(dp: Dispatcher): # обработчик вызывает пресет weak по команде generate_weak dp.register_message_handler(cmd_generate_weak, commands=»generate_weak») # обработчик вызывает пресет normal по команде generate_normal dp.register_message_handler(cmd_generate_normal, commands=»generate_normal») # обработчик вызывает пресет strong по команде generate_strong dp.register_message_handler(cmd_generate_strong, commands=»generate_strong») # вот здесь можно добавить свою команду

Что можно добавить

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

Напишите в комментариях, какого еще Telegram-бота можно разработать на Python. И подпишитесь на блог Selectel, чтобы не пропустить обзоры, новости, кейсы и полезные гайды из мира IT.

  • Как запустить динозаврика Google на тачбаре? Пишем игру на Python
  • Создаем подругу, записывающую кружочки в Telegram, с помощью 4 нейросетей
  • Telegram-бот для поиска подработки, Tinder по интересам и сегментация КТ-снимков: 10 проектов стипендиатов Selectel

Источник: vc.ru

Как написать бота в Телеграме на Python с нуля — пошаговая инструкция

Боты в Телеграме — это уже давно не новинка: каждый уважающий себя интернет-магазин внутри социальной сети обладает возможностью удобной навигации по меню, и даже некоторые новостные каналы настраивают таргет по пожеланиям пользователя с помощью автоматизированных систем.

Вопрос остается в другом: как сделать бота так, чтобы не растратить миллионы на отладку и работу? Несмотря на то, что существует огромное количество автоматических конструктов, все равно нужно потратить немало времени на разбор алгоритма и итогового кода. К тому же они не могут гарантировать корректную работу абсолютно всех функций. Например, когда кто-то захочет связать курс доллара с днями проигрышей «Спартака», ему придется самостоятельно настраивать логику в собственной программе.

Программирование — вот, за чем стоит создание качественного бота. И мы попросту не могли обойти эту тему стороной, потому что с помощью Python создать автоматизированную систему в Телеграме проще простого. Копируем код, исследуем каждую строчку и удивляемся результатам!

Действие 1. Немного теории-базы для понимания принципа работы API Telegram

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

Разработчики Telegram создали функционал для удобного использования API HTML. Он, в свою очередь, зависит от URL, общий вид функции:

При этом #названиеметода# — может быть как getChat (открыть чат), sendMessage (отправить сообщение), так и getUpdates (обновление). Для подтверждения подлинности бота в системе внутри каждой программной строки указывается токен — специальные символы, создающиеся при формировании бота.

Общий вид токена представлен далее:

При этом стоит понимать, что большая часть методов требует предоставления дополнительных параметров. В случае с sendMessage — непосредственный текст и chat_id. Именно поэтому внутри ботов реализуются как POST, так и GET запросы, которые передаются как URL-строки (например, application/#x-www-form-urlencoded#) и могут быть представлены только в кодировке UTF-8.

После того, как API-функция получает запрос, бот отправляет ответ формата JSOM. Предположим, что ранее был выполнен запрос данных при помощи метода getME, в таком случае пользователь получит ответ следующего вида:

В том случае, если значение поля «ok» равно true, результат обработки появится в поле, именованном «field». В ином случае текст ошибки можно будет найти в «description».

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

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

Первый — ручная обработка методов при помощи getUpdates. То есть, бот будет получать объекты-массив формата Update. При этом сама функция работает как длинный опрос, то есть, изначально пользователи отправляют запросы, система обрабатывает их, выдает результат, и идет откат к первому действию, пока не закончится работа бота. Если не хочется производить повторную работу и тратить вычислительные мощности, лучше задуматься над параметром offset.

Еще по теме:  Где ссылка профиля в Телеграмме на Айфоне

Метод getUpdates настоятельно рекомендуется использовать, если:

Арбитраж трафика на крипту [2022] — ОПРОС ЭКСПЕРТОВ
  1. Нет желания формировать произвольную настройку HTTPS.
  2. Производится работа со скриптовыми языками, трудно встраиваемыми в деятельность веб-серверов.
  3. Бот находится время от времени в высокой нагрузке.
  4. Периодически производится смена сервера для бота.

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

Метод Webhooks является одним из оптимальных в том случае, если:

  1. Используется веб-язык для дополнения программирования (PHP, HTML).
  2. Бот не страдает от высокой нагрузки и нет необходимости самостоятельной обработки запросов.
  3. У бота есть стабильное место внутри веб-сервера.

Третий, не менее важный вопрос: каким образом производится регистрация бота внутри социальной сети Телеграм?

Касательно Python, одна из наиболее часто используемых библиотек — PyTelegramBotAPI. Она написана в соответствии с базовыми принципами ООП и является лишь оболочкой для HTML-запросов. При этом все типы данных представляют собой отдельные классы.

Действие 2. Подготовка плацдарма для взлета бота

Основа бота на Python — новейшая библиотека PyTelegramBotAPI (в простонародье «Телебот»). Прежде чем начинать работу непосредственно с программированием, необходимо убедиться, что на компьютере установлена актуальная версия программного обеспечения. Функция для Linux:

После этого при помощи командной строки (Windows) или терминала (Linux) необходимо произвести установку библиотеки:

На этом все приготовления закончены — настоятельно рекомендуется использовать версию Python 3-го поколения (3.7+). Это избавит от проблем с совместимостью, наиболее актуальные версии расположены на официальном сайте.

Действие 3. Настройка речевого аппарата бота

Вне зависимости от того, в какой именно среде будет писаться код (блокнот, Jupyter Notebook), программирование будет одинаковым — использование long pool, много упорства и немало фантазии под соусом из функционала библиотеки Телебота.

При этом стоит понимать, что поле «content_types» может принимать различные значения в зависимости от ситуаций — это может быть набор-массив, числа, знаки и тому подобное. Например:

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

Дальнейший код является сугубо демонстрационным и лишь описывает основной синтаксис взаимодействия библиотеки Телебот и Python. Постараемся создать такую программу, чтобы пользователь писал «Привет», а в ответ получал эксклюзивный «Привет от Партнеркина!».

if message.text == «Привет»:

bot.send_message(message.from_user.id, «Привет от Партнеркина!»)

elif message.text == «/help»:

bot.send_message(message.from_user.id, «Напиши «Привет»)»)

else:

bot.send_message(message.from_user.id, «Партнеркин помогает с /help»)

Каждая из указанных функций характеризует поведение пользователя — что именно он может ввести, и как на это должен реагировать бот. Остается добавить только одну строку, которая работает только с методом long pool:

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

Действие 4. Добавление логики и мозгов

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

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

def get_price(message):

global price;

while price == 0: #проверка, что цена не равна 0

try:

price = count*100 #проверка, что

except Exception:

bot.send_message(message.from_user.id, Некорректное количество товара);

keyboard = types.InlineKeyboardMarkup(); //кнопочки

key_yes = types.InlineKeyboardButton(text=’Да’, callback_data=’yes’); #кнопка «Да»

keyboard.add(key_yes); #добавление кнопки в клавиатуру

key_no= types.InlineKeyboardButton(text=’Нет’, callback_data=’no’);

keyboard.add(key_no);

question= ‘Итоговая стоимость ‘+str(age)+’ за ‘+name+’ в количестве ‘+price+’?’)

bot.send_message(message.from_user.id, text=question, reply_markup=keyboard)

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

Самый последний шаг — добавить типы из начальной библиотеки:

Действие 5. Расширение функционала

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

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

Классическая RelpyKeyboardMarkup — кнопки расположены непосредственно под полем ввода сообщения:

Современная InlineKeyboardMarkup — кнопки привязаны к конкретному сообщению:

Также стоит понимать, что полноценные проекты все равно рано или поздно потребуют дополнений в виде активных баз данных. Для организации подобного функционала рекомендуется использовать docker-compose — он объединяет множество массивов в один контейнер. Данная библиотека позволяет не только создавать новые базы данных, но и налаживает связь между существующими.

Эксперты отвечают

М Михаил

Телеграм-боты могут всё, что угодно?

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

Если планируется работа с достаточно крупными проектами, рекомендуется также начать работу с виртуальным выделенным сервером (VPS). В отличие от стандартного AWS он обладает большими возможностями для гибкого программирования, а также устанавливается в процессе использования библиотеки Docker.

Вывод

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

Еще по теме:  Как узнать информацию о человеке по номеру телефона Телеграмм

Источник: partnerkin.com

Пишем чат-бот на Python + PostgreSQL и Telegram

Пошаговое руководство написания чат-бота на языке Python.

  • Установим Python и библиотеки;
  • Получим вопросы и ответы из БД PostgreSQL;
  • Подключим морфологию;
  • Подключим чат-бот к каналу Telegram.

Colaboratory от Google

Изучение Python можно начать используя сервис Colaboratory от Google, или просто Colab. Сервис позволяет писать и выполнять код Python в браузере, не требуя собственного сервера.

Пример кода. Вопросы и ответы для чат-бота подгрузим с https://drive.google.com из текстового файла

# Однократно после запуска виртуальной машины устанавливаем библиотеки pymorphy2 и numpy !pip install pymorphy2 numpy # —————————- # подключим библиотеки import csv import pymorphy2 import re morph = pymorphy2.MorphAnalyzer(lang=’ru’) # Массив вопросов questions=[] # Массив ответов answer=[] # Подключаем файл с Google диска, содержащий вопросы/ответы # Есть ли жизнь на марсе;Есть with open(«/content/drive/MyDrive/robo-bot/question.txt», «r») as f_obj: reader = csv.reader(f_obj) for row in reader: r=s.split(‘;’) questions.append(r[0]) answer.append(r[1]) # выведем список вопросов и ответов print (questions) print (answer)

Запуск в Production

Наигравшись с кодом в Colaboratory и освоив Python развернем систему на боевом сервере Debian

Установим Python и PIP (установщик пакетов).

Так как Debian не самый новый, устанавливается версия 3.5

aptitude install python3 python3-pip # обновим пакеты если они были установлены ранее pip3 install —upgrade setuptools pip

Установим необходимые пакеты Python

# Из за устаревшей версии Debian установить psycopg2 не удалось, поставлен скомпилированный psycopg2-binary # Библиотека psycopg2 нужна для подключения к базе данных PostgreSQL # pip3 install psycopg2 pip3 install psycopg2-binary scikit-learn numpy pymorphy2

Пишем код в файле Chat_bot.py

# Импортируем библиотеки import pymorphy2 import re import psycopg2 import sklearn import numpy as np # Подключаемся к PostgreSQL conn = psycopg2.connect(dbname=’energy’, user=’mao’, password=’darin’, host=’localhost’) cursor = conn.cursor() # Настраиваем язык для библиотеки морфологии morph = pymorphy2.MorphAnalyzer(lang=’ru’) # объявляем массив кодов ответов и ответов answer_id=[] answer = dict() # получаем из PostgreSQL список ответов и проиндексируем их. # Работая с PostgreSQL обращаемся к схеме app, в которой находятся таблицы с данными cursor.execute(‘SELECT id, answer FROM app.chats_answer;’) records = cursor.fetchall() for row in records: answer[row[0]]=row[1]

Структура таблицы ответов chats_answer, формат SQL

CREATE TABLE app.chats_answer ( id SERIAL, answer VARCHAR(512), CONSTRAINT chats_answer_pkey PRIMARY KEY(id) ) WITH (oids = false); ALTER TABLE app.chats_answer OWNER TO mao;

Да, я готов об этом поговорить

Я тоже хочу спать

Продолжаем код в файле Chat_bot.py

# объявляем массив вопросов questions=[] # загрузим вопросы и коды ответов cursor.execute(‘SELECT question, answer_id FROM app.chats_question;’) records = cursor.fetchall() # посчитаем количество вопросов transform=0 for row in records: # Если текст вопроса не пустой if row[0]>»»: # Если в БД есть код ответа на вопрос if row[1]>0: phrases=row[0] # разбираем вопрос на слова words=phrases.split(‘ ‘) phrase=»» for word in words: # каждое слово из вопроса приводим в нормальную словоформу word = morph.parse(word)[0].normal_form # составляем фразу из нормализованных слов phrase = phrase + word + » » # Если длинна полученной фразы больше 0 добавляем ей в массив вопросов и массив кодов ответов if (len(phrase)>0): questions.append(phrase.strip()) answer_id.append(row[1]) transform=transform+1 # выведем на экран вопросы, ответы и коды ответов print (questions) print (answer) print (answer_id) # Закроем подключение к PostgreSQL cursor.close() conn.close()

Векторизация и трансформация

# Векторизируем вопросы в огромную матрицу # Перемножив фразы на слова из которых они состоят получим числовые значения from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.decomposition import TruncatedSVD vectorizer_q = TfidfVectorizer() vectorizer_q.fit(questions) matrix_big_q = vectorizer_q.transform(questions) print («Размер матрицы: «) print (matrix_big_q.shape) # Трансформируем матрицу вопросов в меньший размер для уменьшения объема данных # Трансформировать будем в 200 мерное пространство, если вопросов больше 200 # Размерность подбирается индивидуально в зависимости от базы вопросов, которая может содержать 1 млн. или 1к вопросов и 1 # Без трансформации большая матрицу будет приводить к потерям памяти и снижению производительности if transform>200: transform=200 svd_q = TruncatedSVD(n_components=transform) svd_q.fit(matrix_big_q) # получим трансформированную матрицу matrix_small_q = svd_q.transform(matrix_big_q) print («Коэффициент уменьшения матрицы: «) print ( svd_q.explained_variance_ratio_.sum())

Функция поиска ответа

# Тело программы поиска ответов from sklearn.neighbors import BallTree from sklearn.base import BaseEstimator def softmax(x): #создание вероятностного распределения proba = np.exp(-x) return proba / sum(proba) class NeighborSampler(BaseEstimator): def __init__(self, k=5, temperature=10.0): self.k=k self.temperature = temperature def fit(self, X, y): self.tree_ = BallTree(X) self.y_ = np.array(y) def predict(self, X, random_state=None): distances, indices = self.tree_.query(X, return_distance=True, k=self.k) result = [] for distance, index in zip(distances, indices): result.append(np.random.choice(index, p=softmax(distance * self.temperature))) return self.y_[result] from sklearn.pipeline import make_pipeline ns_q = NeighborSampler() # answer_id — код ответа в массиве, который получается при поиске ближайшего ответа ns_q.fit(matrix_small_q, answer_id) pipe_q = make_pipeline(vectorizer_q, svd_q, ns_q)

Проверка из консоли

# код для проверки работы из консоли print(«Пишите ваш вопрос, слова exit или выход для выхода») request=»» while request not in [‘exit’, ‘выход’]: # получим текст от ввода request=input() # разберем фразу на слова words= re.split(‘W’,request) phrase=»» for word in words: word = morph.parse(word)[0].normal_form # морфируем слово вопроса в нормальную словоформу # Нормализуем словоформу каждого слова и соберем обратно фразу phrase = phrase + word + » » # запустим функцию и получим код ответа reply_id = int(pipe_q.predict([phrase.strip()])) # выведем текст ответа print (answer[reply_id])

Запустим и проверим

python3 Chat_bot.py

Подключим Telegram

# установим не самую последнюю версию для валидности дальнейшего кода #pip3 install PyTelegramBotAPI pip3 install PyTelegramBotAPI==3.6.7

Все просто, зарегистрируем нового бота и получим token.

В целом все готово. Вопросы в базу данных добавляются автоматически от службы тех. поддержки. Остаётся маркетологу в админ панели на YII назначать ответы вопросам. Раз в сутки cron перезапускает скрипт чат-бота, новые фразы поступают в работу.

Весь код чат бота

В теле программы есть переменные k=5 и temperature=10.0. Их можно менять, что будет влиять на поиск, делая его более мягким или более жестким.

P.S. Умышленно привожу весь код для практики. Теорию машинного обучения с картинками можно почитать, например, в другой статье.

Источник: temofeev.ru

Рейтинг
( Пока оценок нет )
Загрузка ...