Анализ настроений в отзывах Trip Advisor с помощью модели трансформеров Hugging Face
В современном мире, основанном на данных, предприятия и организации в значительной степени полагаются на отзывы и рецензии клиентов для совершенствования своих продуктов и услуг. Анализ настроений в этих отзывах может дать ценную информацию о восприятии и мнениях клиентов. В этой статье мы рассмотрим, как выполнить анализ настроений в коллекции отзывов о гостиницах с помощью методов обработки естественного языка (NLP). Мы рассмотрим весь процесс – от загрузки данных до их визуализации – с использованием языка Python и популярных библиотек NLP.
1. Введение
Отзывы покупателей играют важнейшую роль в формировании бизнес-решений. Анализ настроения, подобласть NLP, предполагает определение настроения, выраженного в тексте, например, в отзыве. В данном анализе мы будем использовать комбинацию NLTK и библиотеки трансформаторов для анализа настроения отзывов о гостиницах и визуализации результатов.
2. Библиотеки и загрузка данных
Начнем с импорта необходимых библиотек Python и загрузки данных обзора в pandas DataFrame. Набор данных можно загрузить по этой ссылке Kaggle.
# Importing libraries
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import nltk
# Load data
df = pd.read_csv('reviews.csv')
3. Исследование данных
Прежде чем перейти к анализу, рассмотрим несколько первых строк набора данных, чтобы понять его структуру и содержание.
df.head(10)
4. Предварительная обработка текста
Чтобы подготовить текст к анализу настроений, необходимо провести токенизацию слов и тегирование части речи. Кроме того, мы определим в тексте именованные сущности.
import nltk
from nltk.sentiment import SentimentIntensityAnalyzer
# Tokenization and part-of-speech tagging
ex = df['Review'][6778]
tk = nltk.word_tokenize(ex)
pos = nltk.pos_tag(tk)
# Named entity recognition
entity = nltk.chunk.ne_chunk(pos)
entity.pprint()
5. Анализ настроений с помощью NLTK
Для анализа настроений NLTK предоставляет класс SentimentIntensityAnalyzer. С его помощью мы можем вычислить оценки полярности для негативных, нейтральных и позитивных настроений.
sia = SentimentIntensityAnalyzer()
sia.polarity_scores(ex)
6. Анализ настроений с использованием трансформаторов
Библиотека transformers предлагает предварительно обученные модели для различных задач НЛП, в том числе и для анализа настроений. Для анализа настроений мы будем использовать модель “cardiffnlp/twitter-roberta-base-sentiment”.
from transformers import AutoTokenizer, AutoModelForSequenceClassification
from scipy.special import softmax
MODEL = "cardiffnlp/twitter-roberta-base-sentiment"
tokenizer = AutoTokenizer.from_pretrained(MODEL)
model = AutoModelForSequenceClassification.from_pretrained(MODEL)
en_text = tokenizer(ex, return_tensors='pt')
result = model(**en_text)
ratings = result[0][0].detach().numpy()
ratings = softmax(ratings)
ratings_dict = {
'rob_neg': ratings[0],
'rob_neu': ratings[1],
'rob_pos': ratings[2],
}
print(ratings_dict)
7. Создание кадра данных результата
Перебирая отзывы, мы применим функцию анализа настроения и сохраним результаты в DataFrame.
res = {}
for i, row in tqdm(df.iterrows(), total=len(df)):
try:
review = row['Review']
rob_res = polarity_scores_rob(review)
res[i] = rob_res
except RuntimeError as e:
res[i] = np.nan
print(f"Error occurred at id {i}: {str(e)}")
continue
except IndexError as e:
res[i] = np.nan
print(f"IndexError occurred at id {i}: {str(e)}")
continue
result_df = pd.DataFrame(res).T
result_df = result_df.reset_index().rename(columns={'index': "Id"})
result_df = pd.concat([result_df, df], axis=1)
8. Визуализация результатов анализа настроений
Наконец, мы визуализируем результаты анализа настроений, построив парную диаграмму, которая показывает взаимосвязь между оценками настроений и рейтингами отзывов.
8.1 Парный график оценок настроений
Мы уже создали парный график, демонстрирующий взаимосвязь между оценками настроения (rob_neg, rob_neu, rob_pos) и рейтингами отзывов. Эта диаграмма позволяет быстро получить представление о том, как распределяются настроения и оценки по набору данных.
sns.pairplot(data=result_df, vars=['Id', 'rob_neg', 'rob_neu', 'rob_pos'], hue='Rating', palette='tab10')
plt.show()
8.2 Распределение оценок настроений
Визуализируем распределение каждого балла настроения (отрицательного, нейтрального, положительного) с помощью гистограмм. Это поможет нам понять общую тенденцию изменения настроения в отзывах.
plt.figure(figsize=(10, 6))
sns.histplot(data=result_df, x='rob_neg', bins=20, color='red', label='Negative')
sns.histplot(data=result_df, x='rob_neu', bins=20, color='gray', label='Neutral')
sns.histplot(data=result_df, x='rob_pos', bins=20, color='green', label='Positive')
plt.xlabel('Sentiment Score')
plt.ylabel('Frequency')
plt.title('Distribution of Sentiment Scores')
plt.legend()
plt.show()
8.3 График распределения оценок настроений по рейтингам
Графическая диаграмма позволяет наглядно представить, как меняются оценки настроений в зависимости от различных рейтингов отзывов. Это может дать представление о том, как настроения связаны с воспринимаемым качеством услуг отеля.
plt.figure(figsize=(10, 6))
sns.boxplot(data=result_df, x='Rating', y='rob_pos', palette='viridis')
plt.xlabel('Review Rating')
plt.ylabel('Positive Sentiment Score')
plt.title('Distribution of Positive Sentiment by Review Rating')
plt.show()
Заключение
Анализ настроений – мощный инструмент для понимания мнений и отношения клиентов, выраженных в отзывах. Объединив библиотеки NLTK и transformers, мы продемонстрировали комплексный подход к анализу настроений в коллекции отзывов о гостиницах. Этот анализ позволяет получить ценные сведения, которые могут помочь компаниям принимать обоснованные решения, направленные на повышение удовлетворенности клиентов и совершенствование своих продуктов и услуг.
В этой статье мы рассмотрели загрузку данных, исследование данных, предварительную обработку текста, анализ настроений с помощью NLTK и трансформаторов, обработку ошибок и визуализацию данных. Выполнив эти шаги, вы сможете самостоятельно провести анализ настроений в отзывах клиентов и получить значимые сведения для развития своего бизнеса.