Как стать автором
Обновить

Парсим и определяем тональность сообщений в Telegram

Для работы использую Google Colaboratory.

Шаг 1. Получение  API ID и Hash.

До начала работы с  API Telegram необходимо получить собственный API ID и Hash. Это можно сделать пройдя по ссылке https://my.telegram.org/auth?to=apps, указав номер телефона привязанный к профилю, и заполнив App title и Short name. Platform - можно выбрать “Other (specify in description)”. Остальные параметры можно оставить пустыми.

После того как все шаги выполнены вы получите собственные API ID и Hash.

Важно: В Telegram в настройках конфиденциальности должна быть отключена двухэтапная аутентификация.

Шаг 2. Вход в аккаунт  Telegram.

Теперь переходим в  Google Colab и первым делом устанавливаем библиотеку telethon:

pip install telethon

Для начала работы нам понадобятся две библиотеки: pandas и TelegramClient:

import pandas as pd
from telethon.sync import TelegramClient

После того, как библиотеки установлены подключаемся к Telegram с помощью полученных ранее API ID и Hash:

api_id = Ваш API ID 
api_hash = 'Ваш Hash'
phone = 'ваш номер телефона, привязанный к профилю'

client = TelegramClient(phone, api_id, api_hash)
await client.start()
print(await client.get_me())

Если данные введены корректно, Google Colab запросит ваш телефон. Вводить телефон надо с 8 (не с +7).

После ввода телефона Telegram пришлет код подтверждения. Этот код используется для входа в ваш аккаунт в Telegram. Введите полученный код в ячейку с запросом.

Если все верно, Telegram пришлет сообщение, что вход выполнен.

Шаг 3. Парсим группу.

Создадим переменную адресом чата (начинается с https://t.me/….), сообщения из которого хотим спарсить (адрес можно посмотреть в Group info )

chat = 'адрес чата'

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

data_item = []
 
part_item = await client.get_participants(chat)
for item in part_item:
  data_item.append([item.first_name, item.last_name, item.id])

df = pd.DataFrame(data_item, columns=['first_name', 'last_name', 'id'])
df

Однако нас интересуют сообщения участников группы. Шаги выполнения те же, что при парсинге участников группы, за единственным исключением - необходимо установить количество сообщений, которые  хотим загрузить. Например, limit=100 позволяет выгрузить последние 100 сообщений. Если есть необходимость выгрузить все сообщения, limit=100 можно просто убрать.

data_message = []
part_mes= await client.get_messages(chat, limit=100)

for message in part_mes:
  data_message.append([message.sender_id, message.text])

df_message = pd.DataFrame(data_message, columns=['user_id', 'text'])
df_message

При желании полученный датафрейм можно сохранить в формате csv:

df_message.to_csv('message.csv')

Чтобы, при желании, загружать уже готовые данные в любое удобное время:

df_op = pd.read_csv('message.csv',  encoding="UTF-8")

Шаг 4. Определяем тональность сообщений.

Для начала необходимо установить transformers:

!pip install transformers

Импортируем библиотеку:

from transformers import pipeline

Создаем пайплайн для обработки естественного языка:

model=pipeline("sentiment-analysis",   
                      "blanchefort/rubert-base-cased-sentiment")

Создаем копию датафрейма:

df_model = df_message.copy()

Используем пайплайн  для определения тональности текста:

lst = []
for i in df_model["text"]:
  lst.append(model(str(i))[0]["label"])
df_model["Sentinent"]=pd.DataFrame(lst)
df_model

Готово.

Теперь (к примеру) можно посмотреть отдельно негативные сообщения и какой id из оставил:

df_NEGATIVE = df_model[df_model["Sentinent"]=="NEGATIVE"]
df_NEGATIVE

или позитивные сообщения:

df_POSITIVE = df_model[df_model["Sentinent"]=="POSITIVE"]
df_POSITIVE

Спасибо за внимание.

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.