Skip to content

Instantly share code, notes, and snippets.

@iliakonnov
Created May 31, 2023 07:39
Show Gist options
  • Save iliakonnov/30181218cbac2ec3a0285bcfe8f4b678 to your computer and use it in GitHub Desktop.
Save iliakonnov/30181218cbac2ec3a0285bcfe8f4b678 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
" # Телеграм-боты с ml-моделями"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Предисловие\n",
"\n",
"Этот файл, со всеми его инструциями и кусочками кода, называют тетрадкой (notebook). Для того, чтобы его открыть, нужно иметь установленный jupyter notebook. Эту платформу лучше всего установить вместе с пакетом anaconda - набором популярных питоновских библиотек. Если вы планируете заниматься ml (машинное обучение) в дальнейшем, она вам понадобится :)\n",
"\n",
"Эту тетрадку можно переслать себе на почту и доработать ее дома. Для того, чтобы код работал, необходимо вбить в гугл **Anaconda install** и действовать по инструкции. Потом тетрадку можно будет открыть через jupyter."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Что такое модель?\n",
"\n",
"ML-модель \"обучается\" на очень большой выборке данных, так, чтобы в дальнейшем, обрабатывая новые данные, могла сделать точные прогнозы. Компьютер строит модели, используя алгоритмы, которые варьируются от простых уравнений (например, уравнение прямой) до очень сложных систем логики/математики, которые позволяют компьютеру сделать самые лучшие прогнозы. \n",
"\n",
"Какие задачи могут решать предварительно обученные модели:\n",
"1. Text classification - определение эмоциональной окраски текста\n",
"2. Text generation - генерация текста на заданную тему\n",
"3. Question answering - отвечает на вопрос по тексту\n",
"4. Summarization - получение краткого содержания текста\n",
"5. Translation - переводит с одного языка на другой\n",
"6. Image classification - определение содержания картинки\n",
"7. Object detection - определяет границы изображения и тип\n",
"8. Audio classification - определение эмоциональной окраски аудио\n",
"9. Automatic speech recognition - распознавание речи\n",
"10. Visual question answering - ответ на вопрос по изображению\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Скачиваем модели\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Чтобы использовать предварительно обученные модели, нам понадобится модуль [Transformers](https://huggingface.co/docs/transformers/index).\n",
"\n",
"*Восклицательный знак означает, что команда запускается не с помощью питоновского интерпретатора, а через терминал*."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"!conda install -c huggingface transformers\n",
"!conda install pytorch\n",
"!conda install tensorflow"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Команда <code>pipeline(task)</code> позволяет воспользоваться готовой моделью для конкретной задачи.\n",
"\n",
"Список возможных моделей можно посмотреть по [ссылке](https://huggingface.co/docs/transformers/quicktour#:~:text=The%20pipeline()%20supports%20many%20common%20tasks%20out%2Dof%2Dthe%2Dbox%3A)"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"from transformers import pipeline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"No model was supplied, defaulted to distilbert-base-uncased-finetuned-sst-2-english (https://huggingface.co/distilbert-base-uncased-finetuned-sst-2-english)\n"
]
}
],
"source": [
"# Обучим модель, которая будет определять эмоциональную окраску текста\n",
"classifier = pipeline(\"sentiment-analysis\")"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"No model was supplied, defaulted to dbmdz/bert-large-cased-finetuned-conll03-english (https://huggingface.co/dbmdz/bert-large-cased-finetuned-conll03-english)\n"
]
}
],
"source": [
"ner_task = pipeline(task='ner')"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"you are a such good friend! is POSITIVE\n",
"do you think that you are the smartest????! is POSITIVE\n",
"higher school of economics is POSITIVE\n",
"you are died is NEGATIVE\n",
"higher school of economics is POSITIVE\n",
"you are died is NEGATIVE\n",
":( is NEGATIVE\n",
":) is POSITIVE\n",
"morgenshtern is POSITIVE\n",
"amogus is NEGATIVE\n"
]
}
],
"source": [
"text = [\"you are a such good friend!\",\n",
" \"do you think that you are the smartest????!\",\n",
" \"higher school of economics\",\n",
" \"you are died\",\n",
" \"higher school of economics\",\n",
" \"you are died\",\n",
" \":(\", \n",
" \":)\",\n",
" \"morgenshtern\",\n",
" \"amogus\"]\n",
"\n",
"for phrase in text:\n",
" print(phrase, \"is\", classifier(phrase)[0][\"label\"])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Потренируйся использовать другие модели!"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Телеграмм API"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"В общем смысле, API — описание способов, которыми одна компьютерная программа может взаимодействовать с другой программой. [Telegram API](https://core.telegram.org/) позволяет пользоваться всеми открытыми функциями телеграмма через код.\n",
"\n",
"Через telegram api можно как создать бота, так и полностью переписать клиент приложения (например, добавить функции, которых вам давно не хватало).\n",
"\n",
"Обычно API представляет собой некий запрос к сервису. Для того, чтобы не посылать непонятные запросы, а пользоваться удобными функциями, написано множество библиотек. Мы будем использовать библиотеку pytelegrambotapi, но если какой-то важной функции там нет - можно воспользовать любой другой, или даже посылать запросы напрямую.\n",
"\n",
"Открытое api есть у многих сервисов. Пользуясь api, можно написать программу, которая выкачивает все посты любой открытой группы вк, ищет аниме в соответствии с запросом или выкачивает все локации эпизодов Рика и Морти.\n",
"\n",
"Несколько полезных ссылок:\n",
"1. [17 интересных сервисов с открытым api](https://habr.com/ru/company/macloud/blog/562700/)\n",
"2. [И еще немного](https://apptractor.ru/all-api/10-rest-api.html)\n",
"2. [API вк](https://dev.vk.com/method)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Делаем тг бота"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Напишем телеграм бота, который будет по-разному разговаривать с пользователем в зависимости от окраски его сообщений. \\\n",
"Скачиваем нужную библиотеку: "
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Requirement already satisfied: pytelegrambotapi in /home/eva/anaconda3/lib/python3.7/site-packages (4.6.0)\n",
"Requirement already satisfied: requests in /home/eva/anaconda3/lib/python3.7/site-packages (from pytelegrambotapi) (2.22.0)\n",
"Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /home/eva/anaconda3/lib/python3.7/site-packages (from requests->pytelegrambotapi) (1.25.8)\n",
"Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /home/eva/anaconda3/lib/python3.7/site-packages (from requests->pytelegrambotapi) (3.0.4)\n",
"Requirement already satisfied: certifi>=2017.4.17 in /home/eva/anaconda3/lib/python3.7/site-packages (from requests->pytelegrambotapi) (2019.11.28)\n",
"Requirement already satisfied: idna<2.9,>=2.5 in /home/eva/anaconda3/lib/python3.7/site-packages (from requests->pytelegrambotapi) (2.8)\n"
]
}
],
"source": [
"!pip install pytelegrambotapi"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Для того, чтобы написать своего бота, необходимо написать https://t.me/BotFather и ввести команду /newbot. Ответив на все вопросы бота, вы получите токен - уникальный идентификатор вашего бота."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"token = \"вставьте свой токен\""
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import telebot\n",
"\n",
"# подключаемся к телеграму\n",
"bot = telebot.TeleBot(token=token)\n",
"\n",
"# content_types=['text'] - функция, которая вызовется, если в бот пришлют текстовое сообщение\n",
"@bot.message_handler(content_types=['text'])\n",
"def text_response(message):\n",
" # message - входящее сообщение\n",
" # message.text - это его текст\n",
" # message.chat.id - это уникальный номер чата\n",
" text = message.text\n",
" chat = message.chat.id\n",
"\n",
" # оцениваем настроение пользователя с помощью модельки\n",
" mood = classifier(text)[0][\"label\"]\n",
" \n",
" # если окраска сообщения положительна, отправляем позитивный стикер, иначе негативный\n",
" \n",
" if mood == \"POSITIVE\":\n",
" sticker_id =\"CAACAgIAAxkBAAEFYiRi3_xKlJaqNPHTcUu5w4hSrR_TtAAClgEAAlERmR-WRNMOCbPRrCkE\"\n",
" else:\n",
" sticker_id = \"CAACAgIAAxkBAAEFYiJi3_wJEZIa9c5pQOypk27lXroBswACjxcAApE42UlLi3-V6U-0SykE\"\n",
" \n",
" bot.send_sticker(chat, sticker_id)\n",
" \n",
"\n",
"# поллинг - вечный цикл с обновлением входящих сообщений\n",
"# если не написать это команду, бот отреагирует только на самое первое сообщение\n",
"bot.polling(none_stop=True)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Идеи для бота\n",
"\n",
"Что можно сделать в телеграмме:\n",
"1. [Как написать кнопки](https://habr.com/ru/sandbox/163347/)\n",
"2. [Телеграмм-вложения](https://core.telegram.org/bots/api#senddocument)\n",
"3. [Документация по боту](https://github-com.translate.goog/eternnoir/pyTelegramBotAPI?_x_tr_sl=auto&_x_tr_tl=ru&_x_tr_hl=ru&_x_tr_pto=nui)\n",
"\n",
"Как можно использовать модели:\n",
"1. Visual question answering: отвечать на вопросы пользователей по картинкам из аниме\n",
"2. Text generation: генерация текста на основе волчьих цитат\n",
"3. Text classification: разговаривать с пользователем стикерами \n",
"4. Automatic speech recognition + Text classification : определять эмоциональную окраску текста песни\n",
"5. Image classification + Test classification: определять эмоциональную окраску аватарок\n",
"6. Visual question answering / Image classification + Text generation: ответы на вопросы пользователя по его аватаркам\n",
"7. Translation + Text generation + Summarization: генерировать текст по ответу пользователя, переводить его на татарский, переводить на русский, суммаризировать и отвечать"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Дальнейшее развитие\n",
"\n",
"На этом наш мастер-класс закончен! Но что делать, если душа требует программирования?\n",
"\n",
"В первую очередь, важно решить, хочешь ли ты всерьез этим заниматься. Если ты пока не уверен, имеет смысл освоить несколько интересных не самых сложных инструментов (языков, фреймворков, концептов), которые позволят создать что-то прикладное. \n",
"\n",
"Список ресурсов для изучения (не стесняйся загуглить что это и какой смысл в этом разбираться):\n",
"1. Тонкости Python\n",
"https://pythontutor.ru/\n",
"https://proglib.io/p/python-books\n",
"2. Django\n",
"https://metanit.com/python/django/\n",
"4. Html и css\n",
"https://htmlacademy.ru/\n",
"5. Javascript\n",
"https://learn.javascript.ru/\n",
"6. Arduino\n",
"https://amperka.ru/page/what-is-arduino\n",
"7. Олимпиадное программирование\n",
"https://codeforces.com/\n",
"\n",
"Если ты уже уверен, что хочешь работать в этой сфере, можно:\n",
"1. Разобраться в том, зачем люди пишут олимпиады (https://vk.com/page-76552532_51415898) и как поступить в хороший вуз\n",
"2. Сделать себе хорошее портфолио: поучаствовать в проектных школах и олимпиадах или просто написать качественно оформленный проект\n",
"3. Освоить базовые инструменты: git, sql, алгоритмы и структуры данных; детально изучить один из востребованных языков программирования\n",
"4. Учить английский и математику\n",
"5. Посмотреть, какие материалы предлагают крупные компании для подготовки к стажировкам\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.6"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment