Search
Write a publication
Pull to refresh

Парсим и определяем тональность сообщений в 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

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

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.