Привет! Это третья часть нашего анализа данных твиттера чемпионата мира, которые мы удалили. Мы проведем анализ настроений на основе наших данных, чтобы узнать, что люди думают о чемпионате мира по футболу в Катаре. Один мощный инструментарий, который я представлю здесь, — это 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) анализа чемпионата мира по футболу в Катаре здесь и здесь.