Предыстория
Буквально месяц назад, мы с моим коллегой участвовали в HAKATON. Наша команда взялась за интересную задачу от компании МТС: на основе тысяч опросов, найти усредненный синоним к определенной категории ответов и визуализировать это в виде диаграммы, либо облака слов.
После выполнения задачи и защиты проекта мы задумались:
"А что если данную программу попробовать связать с тг ботом?"
Как раз после этого, мы решили это реализовать.
Ссылка на данный проект в github
https://github.com/onevay/Tg_Bot_Topic_Analyze/tree/main
Этапы работы
Выбор стека
Создание "кнопок и сырого текста"
База данных
Включение функций анализа текста
Оформление и доработка
Краткое описание функционала
Пользователь проходит анкету, результаты которой сохраняются в базе данных. Далее, пользователь может отправить csv-файл с большим количеством текста, бот проанализирует данный текст и ответом будет результат, состоящий из двух диаграмм:
Первая включает в себя ключевые слова каждой группы, отсортированные по своей значимости.Вторая диаграмма распределяет эти группы в процентном соотношении.
В качестве дополнения, пользователь может отправить запрос в chat gpt, где тот найдет каждой группе слов свою тему.
Библиотека aiogram
aiogram - это мощный и популярный асинхронный фреймворк для разработки ботов в Telegram на языке python. Он обеспечивает эффективный способ взаимодействия с Telegram Bot API.
Основные преимущества aiogram:
Асинхронность. Асинхронный подход позволяет боту обрабатывать множество запросов одновременно, не блокируя выполнение других задач.
Гибкость. Предоставляет множество возможностей для настройки и расширения функциональности бота. Он поддерживает различные типы сообщений, клавиатуры (inline и reply), коллбэки и многое другое.
Поддержка состояний (FSM). Библиотека имеет встроенную поддержку конечных автоматов, что упрощает создание сложных ботов с многошаговым взаимодействием с пользователем.
Минимализм. aiogram не навязывает лишних зависимостей, что делает его легким и быстрым.
Начало работы
Были созданы модули для более удобной работы.
ha1.py
from aiogram import F, Router
from aiogram.types import CallbackQuery, Message, ReplyKeyboardRemove, FSInputFile
from aiogram import filters
from aiogram.enums import ParseMode
import app.db as db
import topic_funcs.gensi as gn
from aiogram.fsm.context import FSMContext
from aiogram.fsm.state import State, StatesGroup
import re
import topic_funcs.vizualize as viz
import topic_funcs.probably as prob
import topic_funcs.textb as req
from decouple import config
import app.keyboard as kbkeyboard.py
from aiogram.types import ReplyKeyboardMarkup, \
KeyboardButton, InlineKeyboardButton, InlineKeyboardMarkupdb.py
import psycopg2
from decouple import configmain.py
from aiogram import Bot, Dispatcher
import asyncio
import logging
import app.db as db
from decouple import config
from app.ha1 import routerЗдесь импортируются все необходимые компоненты для построения Telegram-бота.
def extract_number(text):
match = re.search(r'\b(\d+)\b', text)
if match:
return int(match.group(1))
else:
return None
class UserData(StatesGroup):
name: str = State()
age: int | None = State()
aim: str = State()
gender: str | None = State()
class TopicAnalize(StatesGroup):
start_analize: str = State()
choice_rezult = State()Далее в файле ha1.py мы прописываем функцию extract_number(), для извлечения возраста из текстового ввода пользователя. Класс UserData(StatesGroup) определяет состояния для FSM, управляющего процессом заполнения анкеты пользователем. Класс TopicAnalize(StatesGroup) определяет состояния для FSM, управляющего процессом анализа тем текста.
topic_start = InlineKeyboardMarkup(
inline_keyboard=[
[InlineKeyboardButton(text=' 