В современном мире онлайн-обзоры стали решающим фактором в процессе принятия решений для людей, желающих забронировать отель. Потенциальные клиенты часто полагаются на онлайн-обзоры, чтобы оценить качество отеля, прежде чем сделать выбор. Однако из-за огромного количества обзоров, доступных в Интернете, может быть сложно точно определить общее настроение отзывов. Здесь в игру вступает анализ настроений.

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

Python — популярный язык программирования, используемый в науке о данных и машинном обучении. Он имеет множество библиотек и инструментов, которые делают его отличным выбором для проектов анализа тональности. В этом проекте мы будем строить модель анализа настроений с использованием Python для анализа отзывов об отелях. Используя алгоритмы машинного обучения, мы обучим модель, которая сможет точно определять тональность отзывов об отелях. Для более детального понимания этот проект будет разделен на две части. Первая часть будет основана на анализе настроений, а вторая часть будет основана на построении модели машинного обучения для прогнозирования оценок настроений.

Этот набор данных содержит отзывы пользователей об отелях, собранные с сайта Tripadvisor. Здесь — ссылка на набор данных.

Первый шаг

Импорт библиотек Python, которые мы будем использовать для этого проекта.

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import nltk
from nltk.sentiment.vader import SentimentIntensityAnalyzer
sentiments = SentimentIntensityAnalyzer()
from nltk import word_tokenize, sent_tokenize
from nltk.corpus import stopwords
from nltk.stem import PorterStemmer
from wordcloud import WordCloud, STOPWORDS
from textblob import TextBlob
import string
import re
import emoji

Далее мы импортируем и распечатываем CSV-файл отзывов об отелях.

data = pd.read_csv("7282_1.csv")
data

Шаг второй

Выбор необходимых столбцов: в этом анализе мы будем использовать столбцы «Имя», «reviews.rating» и «reviews.text». Но прежде чем мы это сделаем, я бы хотел, чтобы мы изменили столбец «reviews.text» на просто обзоры.

data = data.rename(columns={"reviews.text": "reviews"})

df=data[["name","reviews.rating","reviews"]]
df

Шаг третий

Проверка пропущенных значений: на этом этапе мы будем проверять пропущенные значения, чтобы увидеть, являются ли они значимыми.

#check for missing values
​
check_missing_val_total=df.isnull().sum()
print(check_missing_val_total)

OUTPUT:
name                0
reviews.rating    862
reviews            22
dtype: int64

Из вывода видно, что количество пропущенных значений незначительно. Итак, мы можем продолжить процесс.

Давайте взглянем на распределение оценок клиентов:

ratings = df["reviews.rating"].value_counts()
numbers = ratings.index
quantity = ratings.values

custom_colors = ["skyblue", "yellowgreen", 'tomato', "blue", "red", "purple", "blue", "orange"]
plt.figure(figsize=(8, 8))
plt.pie(quantity, labels=numbers, colors=custom_colors)
central_circle = plt.Circle((0, 0), 0.5, color='white')
fig = plt.gcf()
fig.gca().add_artist(central_circle)
plt.rc('font', size=14)
plt.title("Hotel Reviews Ratings", fontsize=20)
plt.show()

Далее мы собираемся напечатать различные названия всех отелей в наборе данных.

print(df.name.unique())

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

x=(df.groupby('name')['reviews.rating'].mean())
print(x)

Из приведенных выше данных видно, что самый высокий средний рейтинг имеет отель под названием «Дом 1900».

Предварительная обработка данных

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

Нижний регистр

В науке о данных перевод в нижний регистр является важным шагом для обеспечения согласованности данных. Различные варианты капитализации входных данных могут иногда приводить к различным типам выходных данных. Например, Нигерия, nigeriA и NIGERIA сопоставляются одной и той же строчной форме. Следовательно, использование нижнего регистра обычно считается стандартной практикой для согласованности данных.

# Lower casing

# Change the reviews type to string

df['reviews'] = df["reviews"].astype(str)
print(df['reviews'][2])

#Lowercase all reviews

df['reviews']= df["reviews"].apply(lambda x: x.lower())
print(df["reviews"][2]) 

# to see the difference

смайлики

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

#check if there is any special character
alphabet = string.ascii_letters+string.punctuation
print(df.reviews.str.strip(alphabet).astype(bool).any())

extracted_emojis=[]

def extract_emojis(s):
    expe = re.compile("[\U00010000-\U0010ffff]", flags=re.UNICODE)
    #return expe.findall(s)
    return expe.sub(r"",s)

for y in df["reviews"]:
    print(str(extract_emojis(y)))
    extracted_emojis.append(str(extract_emojis(y)))

Стоп-слова

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

# stop words

stop_words=stopwords.words('english')
df['extracted_emojis'] = extracted_emojis
df['extracted_emojis']= df['extracted_emojis'].apply(lambda x:x if x not in stop_words else None)
print(df['extracted_emojis'][5])

Стемминг

Стемминг также является важным процессом анализа данных; он отсекает конец слова и превращает его в корневую форму. Все суффиксы типа -s, -es, -ed, -ing удаляются. Давайте перейдем к коду!

# stemming

def stemming(x):
    st = PorterStemmer()
    if x is not None:
       for word in x.split():
           st.stem(word)

df['extracted_emojis'].apply(lambda x:stemming(x))
print(df['extracted_emojis'][100])

Оценка настроения

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

def senti_sc(x):
    if x is not None:
       return TextBlob(x).sentiment

df["Sentiment_score"]= df["extracted_emojis"].apply(senti_sc)
print(df.loc[0:19,['extracted_emojis','Sentiment_score']])

df

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

x = sum(data["Positive"])
y = sum(data["Negative"])
z = sum(data["Neutral"])

def sentiment_score(a, b, c):
    if (a>b) and (a>c):
        print("Positive 😊 ")
    elif (b>a) and (b>c):
        print("Negative 😠 ")
    else:
        print("Neutral 🙂 ")
sentiment_score(x, y, z)

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

print("Positive: ", x)
print("Negative: ", y)
print("Neutral: ", z)

Согласно приведенным выше результатам, более 25 000 отзывов классифицируются как нейтральные, а около 8 000 отзывов — как положительные. Таким образом, можно сказать, что люди действительно довольны услугами отелей, в которых они останавливались, так как отрицательных отзывов меньше 2000.

Заключение

Информация, полученная в результате этого проекта, может помочь менеджерам отелей улучшить свои услуги и предложения, что в конечном итоге приведет к повышению удовлетворенности и лояльности клиентов. Как пользователь, лучший способ узнать, подходит ли вам тот или иной отель, — это узнать, что другие люди говорят об отеле в различных социальных сетях или новостных агентствах. Надеюсь, вам понравился этот проект по анализу тональности отзывов об отелях с помощью Python. Не стесняйтесь вносить предложения и задавать ценные вопросы в разделе комментариев ниже.

Следите за второй частью.

Кредиты набора данных идут в репозиторий машинного обучения, UCI.

Автор: Кавита Ганесан и Чэн Сян Чжай.

Ссылка на код — GitHub