Привет! Это третья часть нашего анализа данных твиттера чемпионата мира, которые мы удалили. Мы проведем анализ настроений на основе наших данных, чтобы узнать, что люди думают о чемпионате мира по футболу в Катаре. Один мощный инструментарий, который я представлю здесь, — это Hugging Face, где вы можете найти различные модели, задачи, наборы данных, а также он предоставляет курсы для людей, которые только начинают изучать машинное обучение. В этом посте мы будем использовать одну модель анализа настроений и токен Hugging Face для нашей задачи.

Анализ настроений

Анализ настроений — это использование обработки естественного языка (НЛП) для выявления, извлечения и изучения аффективных состояний и субъективной информации. Мы можем применить эту технику к отзывам клиентов и ответам на опросы, чтобы узнать мое мнение о продуктах или услугах.

Давайте рассмотрим несколько примеров:

  • Мне нравится сегодняшняя погода! Метки: Позитив
  • В метеосводке сказано, что завтра будет облачно. Метки: Нейтральный
  • Дождь не прекратится. План пикника откладывается. БУММЕР... Метки: Негатив

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

  • Я не люблю дождливые дни. (Отрицание)
  • Я люблю бегать в ветреную погоду, но друзьям бы не порекомендовал. (Положительные настроения с условием, трудно поддающимся классификации)
  • Хорошая чашка кофе действительно требует времени, потому что я ждал 30 минут, чтобы сделать глоток. (саркастический)

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

Познакомьтесь с twitter-roberta-base-sentiment-latest

Twitter-roBERTa-base для анализа настроений — это базовая модель RoBERTa, обученная примерно на 124 миллионах твитов с января 2018 года по декабрь 2021 года и настроенная для анализа настроений с помощью эталонного теста TweetEval. Я не буду углубляться в детали базовой модели RoBERTa, но, проще говоря, RoBERTa удаляет задачу прогнозирования следующего предложения (NSP) из процесса предварительного обучения и вводит динамическое маскирование, поэтому замаскированный токен изменяется в течение эпох обучения. Для более подробного ознакомления рекомендую прочитать Статья Сулеймана Хана и Статья Чандан Дургиа.

Чтобы инициировать эту модель, мы можем использовать Inference API, созданный командой Hugging Face. API-интерфейс Inference позволяет отправлять текстовые сообщения и оценивать более 80 000 моделей машинного обучения в задачах НЛП, аудио и компьютерного зрения. Проверьте здесь для получения подробной документации. Inference API прост в использовании, все, что вам нужно сделать, чтобы получить токен Hugging Face (это бесплатно). Во-первых, вы должны создать аккаунт Hugging Face и зарегистрироваться. Затем нажмите Профиль и перейдите в Настройки.

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

  • Чтение: используйте эту роль, если вам нужно только читать контент из Hugging Face Hub (например, при загрузке частных моделей или выводе).
  • Запись: используйте этот токен, если вам нужно создать или отправить содержимое в репозиторий (например, при обучении модели или изменении карточки модели).

Теперь у нас есть все необходимое, давайте проведем анализ!

Подготовить наши данные

Сначала нам нужно импортировать некоторые зависимости и загрузить наши данные. Требуется некоторое время, чтобы провести анализ тональности 10 000 твитов, которые у нас есть. В демонстрационных целях мы случайным образом выберем 300 твитов из пула.

import pandas as pd
import pickle
import requests
import random

with open('world_cup_tweets.pkl', 'rb') as f:
    data = pickle.load(f)

tweets = data.Tweet_processed.to_list()
tweets = random.sample(tweets, 300)

Выполнить анализ

Затем мы передаем языковую модель и наш токен Hugging Face в переменные соответственно.

model = "cardiffnlp/twitter-roberta-base-sentiment-latest"
hf_token = "YOUR OWN TOKEN"

Мы определяем функцию для анализа, которая принимает единственный параметр: данные. Эта функция преобразует наши данные Twitter в формат JSON, который содержит результаты вывода модели на входных данных, переданных в функцию.

API_URL = "https://api-inference.huggingface.co/models/" + model
headers = {"Authorization": "Bearer %s" % (hf_token)}

def analysis(data):
    payload = dict(inputs=data, options=dict(wait_for_model=True))
    response = requests.post(API_URL, headers=headers, json=payload)
    return response.json()

Мы инициализируем пустой список для хранения результатов анализа тональности каждого твита. Мы используем цикл для каждого твита в списке. Затем мы используем технику блока try-except:

  • Для твитов, которые можно проанализировать, мы вызываем функцию анализа, которую мы определили с текущим твитом в качестве входных данных, и извлекаем первый результат из возвращаемого списка. Этот результат должен быть списком словарей, каждый из которых содержит метку тональности и оценку. Мы используем встроенную функцию max, чтобы найти словарь в результатах тональности с наивысшим баллом. Мы добавляем новый словарь в список tweets_analysis с твитом и соответствующей меткой, которая содержит настроение с наивысшим баллом.
  • Для твитов, которые невозможно проанализировать, мы использовали блок exclude, который перехватывает любые исключения, возникающие в блоке try, и выводит сообщение об ошибке. Возможно, что функция анализа тональности может не проанализировать некоторые твиты, поэтому этот блок включен для обработки таких случаев.
tweets_analysis = []
for tweet in tweets:
    try:
        sentiment_result = analysis(tweet)[0]
        top_sentiment = max(sentiment_result, key=lambda x: x['score']) # Get the sentiment with the higher score
        tweets_analysis.append({'tweet': tweet, 'sentiment': top_sentiment['label']})
 
    except Exception as e:
        print(e)

Затем мы можем загрузить данные во фрейм данных и увидеть некоторые предварительные результаты.

# Load the data in a dataframe
df = pd.DataFrame(tweets_analysis)
 
# Show a tweet for each sentiment
print("Positive tweet:")
print(df[df['sentiment'] == 'positive']['tweet'].iloc[0])
print("\nNeutral tweet:")
print(df[df['sentiment'] == 'neutral']['tweet'].iloc[0])
print("\nNegative tweet:")
print(df[df['sentiment'] == 'negative']['tweet'].iloc[0])
# Outputs: (edited by author to remove vulgarity)

Positive tweet:
Messi, you finally get this World Cup trophy. Happy ending and you are officially called球王  

Neutral tweet:
Nicholas the Dolphin picks 2022 World Cup Final winner     

Negative tweet:
Yall XXXX and this XXXX world cup omg who XXXX CARESSS

Мы также должны использовать функцию groupby, чтобы увидеть, сколько твитов являются положительными или отрицательными в нашей выборке.

sentiment_counts = df.groupby(['sentiment']).size()
print(sentiment_counts)

# Outputs: 
sentiment
negative     46
neutral      63
positive    166
dtype: int64

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

import matplotlib.pyplot as plt
fig = plt.figure(figsize=(6,6), dpi=100)
ax = plt.subplot(111)
sentiment_counts.plot.pie(ax=ax, autopct='%1.1f%%', startangle=270, fontsize=12, label="")

Кажется, что большинство довольны чемпионатом мира по футболу в Катаре. Большой!

О чем люди говорят в позитивных и негативных твитах? Мы можем использовать wordcloud, чтобы показать ключевые слова в этих группах.

# pip install first if you have not installed wordcloud in your environment 

from wordcloud import WordCloud
from wordcloud import STOPWORDS
 
# Wordcloud with positive tweets
positive_tweets = df[df['sentiment'] == 'positive']['tweet']
stop_words = ["https", "co", "RT"] + list(STOPWORDS)
positive_wordcloud = WordCloud(max_font_size=50, max_words=50, background_color="white", stopwords = stop_words).generate(str(positive_tweets))
plt.figure()
plt.title("Positive Tweets - Wordcloud")
plt.imshow(positive_wordcloud, interpolation="bilinear")
plt.axis("off")
plt.show()

# Wordcloud with negative tweets
negative_tweets = df[df['sentiment'] == 'negative']['tweet']
stop_words = ["https", "co", "RT"] + list(STOPWORDS)
negative_wordcloud = WordCloud(max_font_size=50, max_words=50, background_color="white", stopwords = stop_words).generate(str(negative_tweets))
plt.figure()
plt.title("Negative Tweets - Wordcloud")
plt.imshow(negative_wordcloud, interpolation="bilinear")
plt.axis("off")
plt.show()

Сводка

Теперь я надеюсь, что вы узнали, как использовать Inference API в Hugging Face для анализа тональности твитов. Это мощный инструмент, который широко применим в различных областях. Следуйте за мной для получения дополнительных идей и методов.

👀Проверьте часть (1) и часть (2) анализа чемпионата мира по футболу в Катаре здесь и здесь.