Анализ тональности пользовательских отзывов с использованием модели Naive Bayes
Автор: М. А. Зуев, В. К. Денисенко
Журнал: Informatics. Economics. Management - Информатика. Экономика. Управление.
Рубрика: Информатика, вычислительная техника
Статья в выпуске: 4 (3), 2025 года.
Бесплатный доступ
В данной работе разработана и реализована система анализа тональности пользовательских отзывов на примере текстов о смартфоне с использованием методов машинного обучения. Цель исследования заключается в автоматическом определении эмоциональной окраски отзывов — положительной, нейтральной или отрицательной — на основе текстового содержания и пользовательского рейтинга. Для достижения поставленной цели были последовательно реализованы этапы предобработки текста, его преобразование в числовое представление с помощью метода TF-IDF и последующая классификация с применением наивного байесовского алгоритма. В работе использован набор из 200 отзывов, представленных в формате CSV-файла. В качестве инструментов были задействованы библиотеки языка программирования Python: pandas, re и scikit-learn. Проведённые эксперименты показали, что даже при использовании сравнительно простой модели можно достичь устойчивых результатов классификации. Разработанная система способна обрабатывать как обучающую выборку, так и новые, ранее не встречавшиеся отзывы. Результаты подтверждают эффективность предложенного подхода для прикладных задач анализа пользовательского мнения, мониторинга репутации и предварительной фильтрации контента. Перспективы развития включают расширение модели за счёт внедрения более сложных алгоритмов и дополнительных этапов обработки текста.
Анализ тональностимашинное обучениеобработка естественного языкаTF-IDFнаивный байесовский классификаторотзывы пользователейклассификация текста
Короткий адрес: https://sciup.org/14135070
IDR: 14135070 | DOI: 10.47813/2782-5280-2025-4-3-5001-5007
Текст статьи Анализ тональности пользовательских отзывов с использованием модели Naive Bayes
DOI:
В эпоху цифровизации пользовательские отзывы стали важным источником информации как для покупателей, так и для производителей товаров и услуг. Прежде чем принять решение о покупке, потенциальные клиенты обращаются к мнению других пользователей, делая выводы на основе субъективных оценок, впечатлений и опыта. Для компаний отзывы служат ценным каналом обратной связи, позволяющим оперативно реагировать на проблемы, улучшать продукты и выявлять ключевые ожидания целевой аудитории.
Однако с ростом объемов текстовых данных ручная обработка отзывов становится неэффективной. Решение этой задачи требует автоматизации с использованием методов анализа текстов на естественном языке (NLP — Natural Language Processing). Одной из основных задач в данной области является анализ тональности (sentiment analysis) — определение эмоциональной окраски текста: положительной, нейтральной или отрицательной. Это позволяет быстро оценить общую атмосферу отзывов и выделить проблемные зоны [1].
В рамках данной работы была реализована система анализа тональности пользовательских отзывов на смартфон. В качестве методов использовались: предварительная очистка и нормализация текстов, преобразование текстов в числовое представление методом TF-IDF, а также классификация с помощью наивного байесовского алгоритма. Выбор этих подходов обусловлен их простотой, высокой скоростью работы и доказанной эффективностью на текстовых данных [2]. Все этапы обработки реализованы средствами языка Python.
МАТЕРИАЛЫ И МЕТОДЫ
Выбор набора данных
Для реализации и тестирования модели анализа тональности был использован набор данных, содержащий отзывы пользователей на один конкретный товар — смартфон. Данный подход позволяет сосредоточиться на структуре текста и субъективной оценке потребительского опыта, исключая влияние тематической разнородности. Отзывы представлены в формате CSV-файла, каждая запись включает следующие поля:
-
1. id - уникальный идентификатор отзыва.
-
2. product - наименование товара.
-
3. review - текст отзыва, написанный пользователем.
-
4. rating - числовая оценка товара (от 1 до
-
5. date - дата публикации отзыва.
-
6. username - имя пользователя.
Всего в выборке присутствует 200 записей, что обеспечивает достаточную основу для демонстрации работоспособности модели на малых объемах данных.
Выбор инструментов решения задачи
Для реализации программы анализа тональности был использован язык программирования Python и среда Visual Studio Code. А также библиотеки:
-
1. pandas – для чтения данных.
-
2. re - очистка текста с помощью регулярных выражений.
-
3. scikit-learn – преобразование текста в
векторное представление и реализация наивного байесовского классификатора.
Подготовка данных
Перед обучением модели машинного обучения необходимо провести очистку и нормализацию текстов отзывов, чтобы исключить «шум» и привести данные к унифицированному виду. В начале работы данные были загружены из CSV-файла с помощью функции pandas.read_csv(). Пропущенные значения в текстовой колонке review заменялись на пустые строки с использованием метода fillna(''), чтобы избежать ошибок на последующих этапах [3].
Для очистки текста применялась функция preprocess_text_simple(), в которой с помощью регулярных выражений (re.sub) удалялись все знаки препинания и цифры, а также выполнялось приведение текста к нижнему регистру. Далее текст разбивался на отдельные слова (токены), из которых с помощью фильтрации исключались общеязыковые и тематические стоп-слова, указанные в списке SIMPLE_STOPWORDS (рисунок 1). Также удалялись слишком короткие слова (длиной менее двух символов) [4].
-
# Добавлены слова, специфичные для тематики, которые не несут информации о тональности. SIMPLE_STOPWORDS = [
"и", "в”, "во", "не", "что", "он", "на", "я", "с”, "со", "как", "а", "то", "все", "она", "так", "его", "но", "да", "ты", "к", "у", "же", "вы", "за", "бы", "по", "только", "ее", "мне", "было", "вот", "от", "меня", "еще", "нет", "о", "из", "ему", "теперь", "когда", "даже", "ну", "вдруг", "ли", "если", "уже", "или", "ни", "быть", "был", "него”, "до", "вас", "нибудь", "опять", "уж", "вам", "ведь", "там", "потом", "себя", "ничего", "ей", "может", "они", "тут", "где", "есть", "надо", "ней", "для", "мы", "тебя", "их", "чем", "была", "сам", "чтоб", "без", "будто", "чего", "раз", "тоже", "себе", "под", "будет", "ж", "тогда", "кто", "этот", "того", "потому", "этого", "какой", "совсем", "ним", "здесь", "этом", "один", "почти", "мой", "тем", "чтобы", "нее", "сейчас", "были", "куда", "зачем", "всех", "никогда”, "можно", "при", "наконец", "два", "об", "другой", "хоть", "после", "над", "больше", "тот", "через", "эти", "нас", "про", "всего", "них", "какая", "много", "разве", "три", "эту", "моя", "впрочем", "свою", "этой", "перед", "иногда", "лучше", "чуть", "том", "нельзя", "такой", "им", "более", "всегда", "конечно", "всю", "между", "смартфон", "телефон", "х100", "модель" # специфичные для домена слова
]
def preprocess_text_simple(text):
"""Упрощенная предобработка текста."""
if not isinstance(text, str): # Базовая проверка на тип return ""
-
# Удаление стоп-слов и очень коротких слов (1 буква) filtered_tokens = [
word for word in tokens if word not in SIMPLESTOPWORDS and len(word) > 1
]
return " ".join(filtered_tokens)
Р исунок 1. Ф ункция preprocess _ TEXT _ SIMPLE () и список SIMPLE_STOPWORDS.
F igure 1. T he preprocess _ text _ simple () function and the SIMPLE_STOPWORDS list .
Для задания целевой переменной классификации была использована функция map_rating_to_sentiment(), преобразующая числовые рейтинги в три категории тональности: «положительный» (рейтинги 4 и 5), «нейтральный» (рейтинг 3) и «отрицательный» (рейтинги 1 и 2). Эта категория присваивалась каждому отзыву на основе значения в колонке rating с помощью метода apply() (рисунок 2).
def inap_rating_to_sentiment(rating):
......Преобразование числового рейтинга в категорию тональности.""" if rating >= 4: return "положительный"
elif rating = 3: return "нейтральный" else: # 1 или 2 return "отрицательный”
Р исунок 2. Ф ункция map _ RATING _ TO _ SENTIMENT ().
F igure 2. map _ rating _ to _ sentiment () function .
В результате этих действий был сформирован очищенный и размеченный набор отзывов, готовый к этапу векторизации и обучению модели машинного обучения (рисунок 3).
try:
df = pd.read_csv(csv_filepath)
except FileNotFoundError:
print(f"Ошибка: Файл '{csv_filepath}' не найден.") return except Exception as e:
print(f"Ошибка при чтении CSV: {e}") return if 'review' not in df.columns or 'rating' not in df.columns:
print("Ошибка: CSV файл должен содержать колонки 'review' и 'rating'.") return print("l. Предобработка текста...")
df[’review'] = df['review'].fillna(‘') # Заменяем NaN на пустую строку df['pracessedreview'] - ^['review'].apply(preprocesstextsimple)
df['sentimentbyrating'] = df['rating'].apply(mapratingtosentiment)
-
# Удаляем строки, где после предобработки отзыв стал пустым (TfidfVectorizer не любит пустые строки) df_clean = df[df['processed_review'].str.strip().astype(bool)].copy()
print("He найдено непустых отзывов для анализа после предобработки.") return print(f"Обработано {len(df clean)} непустых отзывов.")
print("ХпРаспределение по тональности (на основе рейтинга):")
print(df_clean['sentimentbyrating'].valuecounts())
Р исунок 3. П одготовка данных .
-
F igure 3. D ata preparation .
РЕЗУЛЬТАТЫ И ОБСУЖДЕНИЕ
Векторизация текста и построение модели
МАШИННОГО ОБУЧЕНИЯ
После подготовки данных программа переходит к этапу векторизации текста и построения модели машинного обучения. Для преобразования очищенных текстов в числовой формат был использован метод TfidfVectorizer из библиотеки scikit-learn [5]. Этот метод формирует матрицу признаков, где каждая строка соответствует отдельному отзыву, а столбцы представляют собой наиболее информативные термины, отобранные по метрике TF-IDF. Количество признаков было ограничено до 1000 с помощью параметра max_features, что позволяет сократить размерность и снизить риск переобучения.
После векторизации текстов модель машинного обучения обучалась на полученной матрице признаков. В качестве алгоритма классификации использовался наивный байесовский классификатор MultinomialNB, реализованный в scikit-learn [6]. Обучение выполнялось методом fit(), где в качестве входных данных передавались TF-IDF-векторы, а в качестве целевых меток — категории тональности, полученные на предыдущем этапе (рисунок 4).
# Векторизация текста vectorizer = TfidfVectorizer(max_features=1000) # Ограничиваем количество признаков
X_vectors = vectorizer.fit_transform(df_clean['processed_review'])
y_labels = df_clean['sentiment_by_rating']
print("\n2. Обучение модели на всех данных...”)
model = MultinomialNB()
print("\n3. Предсказание тональности для всех (использованных в обучении) отзывов...”)
predictedsentimentson traindata = model.predict(X vectors)
df_clean['predicted_sentiment_model'] = predicted_sentiments_on_train_data print("\n— Примеры анализа отзывов (модель обучена на этих же данных) —")
print(f"\n0T3WB ID {row['id’]}: \"{row['review']}\"") # Показываем оригинальный текст отзыва print(f"Рейтинг: {row['rating']} (Интерпретация: {row['sentiment_by_rating']})")
print(f"Предсказанная тональность моделью: {row['predicted_sentiment_model']}”)
print("\n— Итоговое распределение предсказанной тональности (моделью на обучающих данных) —") print(df_clean['predicted_sentiment_model'].value_counts())
Р исунок 4. О бучение модели .
-
F igure 4. M odel training .
Предсказание результатов
Сразу после обучения модель использовалась для предсказания тональности тех же отзывов, на которых она была обучена. Это было выполнено с помощью метода predict(), который выдаёт массив предсказанных меток. Результаты предсказания были добавлены в датафрейм в виде новой колонки predicted_sentiment_model (рисунок 5). Это позволило сопоставить исходные оценки, целевую разметку и предсказания модели [7].
print("\n3. Предсказание тональности для всех (использованных в обучении) отзывов...”) predicted_sentinents_on_train_data = model.predict(X_vectors)
df_clean['predicted_sentiment_model‘] = predicted_sentiments_on_train_data print("\n— Примеры анализа отзывов (модель обучена на этих же данных) —")
print(f"\п0тзыв ID {row['id’ ]}: \"{row[ ’review' ]}\"") # Показываем оригинальный текст отзыва print(f"Рейтинг: {row[’rating']} (Интерпретация: {row['sentiment_by_rating']})")
print(f"Предсказанная тональность моделью: {row['predicted_sentiment_model']}")
print("\n— Итоговое распределение предсказанной тональности (моделью на обучающих данных) —") print(df_clean['predictedsentimentmodel'].value counts())
Р исунок 5. П редсказание отзывов .
-
F igure 5. P redicting R eviews
-
3. Предсказание тональности для всех (использовамам в обучении) отзывов...
Дополнительно программа выводила на экран примеры произвольно выбранных отзывов с отображением оригинального текста, числового рейтинга, истинной категории тональности (на основе рейтинга) и предсказания модели [8]. Для выборки случайных примеров использовался метод sample() с заданным random_state для воспроизводимости (рисунок 6).
-
*•- Прючрры анамза отзывов (модель обучена на этих и» дама) —-
- Отзыв ID 96: "Отличим телефон! Батареи хватает на весь день, камера супер."
Рейтинг: 5 (Интерлретащя: положи телыый)
Предсказанная тональность моделью: поданителывй
Отзыв 10 16: "Поддерживает быструю зарядку - это супер!"
Рейтинг: 4 (Интерлрстацш: полежи тела**)
Предсказанная тональность моделью: положитель»**
Отзыв ID 31: "Прописка сырая, но надеюсь, обновления исправят."
Рейтинг: 4 (Интерпретация: положителыый) Прсдсказдаыя тональность моделью: нейтралы**
Отзыв ID 159: "Купил по акц* - доволен на 10вК."
Рейтинг: 5 (Интерлретащя: положи тел»**) Предсказанная тональность моделью; положитель»**
Отзыв ID >29: "Слабый аккумулятор. прикуется заряжать длапцы ■ дм^ ’
Рейтинг: 3 (Лнерпретащи: нейтралами) Предсказателя тональность моделью: нейтралы**
Отзыв ID 116: "Отличный телефон! Батарея хватает на весь деты, камера супер."
Рейтинг: 5 (интерпретация: положите ль»**)
Предсказанная тональность поде лыс: наложи тель»**
Отзыв ID 70: "Вотографирует отлично даже при плохом освеценми."
Рейтинг: 4 (Интерлретащя: положи тела**)
Предсказанная тональность моделью: отрицатель»**
Отав ID 171: "Нравится интерфейс, всё понятно и удобно."
Рейтинг: 3 (Интерпретации: нейтрал»**}
Предсказанная тональность моделью: полежи тель»**
Отзыв ID 175: "После месяца использования всё устраивает."
Рейтинг: 5 (кЫтерпротащя: полежмтглаый)
Предсказанном тональность моделью; положи телы**
Отзыв ID 46: ‘неудобно расположены кнопки громкости."
Рейтинг: 3 (Интерпретация: нейтрала**)
Предсказанная тональность моделью: положи тель»**
Р исунок 6. Р езультат предсказания случайных отзывов .
-
F igure 6. R andom review prediction result .
Тестирование на новых данных
В заключение программа демонстрирует работу модели на новых, заранее не обученных отзывах (рисунок 7). Эти текстовые строки задаются вручную в коде и проходят ту же процедуру предобработки, что и основная выборка. После предобработки они преобразуются в TF-IDF- вектора с помощью ранее обученного TfidfVectorizer [9]. Для каждого нового отзыва вычисляется предсказанная моделью тональность, которая затем выводится пользователю. Это демонстрирует способность модели классифицировать произвольные пользовательские отзывы, поступающие в систему в реальном времени.
-
# Пример анализа нового., произвольного отзыва
print("\n— Анализ нового отзыва (с использованием обученной модели) —”) newreviewtexts = [
"Очень хороший телеки, камера супер и батарея держит долго!",
"Ужасно тормозит, не рекомендую никому.",
"Обычный телефон, ничего особенного, но и не плохой.”,
"Аккумулятор слабый, заряжать надо часто." ]
for new_text in new_review_texts:
processednewreview = preprocess_text_simple(new_text)
print(€"\пНовый отзыв: \"{new_text}\"")
if processednewreview:
newreviewvector = vectorizer.transform([processed_new_review])
predictedsentimentnew = model.predict(new_review_vector)[0]
# print(f"Предобработанный: \"{processed_new_review}\"") # Для отладки print(f"Предсказанная тональность: {predictedsentimentnew}")
else:
print("Отзыв пуст после предобработки, невозможно классифицировать.")
-
--- Предсказания для новых отзывов --
- Новый отзыв: "Очень хороший телефон, камера супер и батарея держит долго!"
Предсказанная тональность: положительный
Новый отзыв: "Ужасно тормозит, не рекомендую никому."
Предсказанная тональность: отрицательней
Новый отзыв: "Обычай телефон, ничего особенного, но и не плохой."
Предсказанная тональность: положительней
Новый отзыв: "Аккумулятор слабый, заряжать надо часто."
Предсказанная тональность: нейтральный
Р исунок 6. В ызов и результат предсказания нового отзыва . F igure 6. C all and prediction result of new review
ЗАКЛЮЧЕНИЕ
В ходе работы была разработана и реализована программа автоматического анализа тональности пользовательских отзывов на товар с использованием методов машинного обучения. На примере отзывов о смартфоне продемонстрированы основные этапы обработки текстовых данных: очистка и нормализация текста, формирование обучающей выборки, векторизация методом TF-IDF и классификация с помощью наивного байесовского алгоритма.
Предложенное решение отличается простотой реализации, быстрой обучаемостью и высокой интерпретируемостью результатов. Несмотря на ограниченность набора данных, модель продемонстрировала устойчивую способность различать положительные, нейтральные и отрицательные отзывы, в том числе и при классификации новых, ранее не встречавшихся текстов.
Данный подход может быть применён в задачах мониторинга пользовательского мнения, анализа репутации, автоматической фильтрации отзывов и построения рекомендательных систем. В дальнейшем возможна доработка системы за счёт внедрения более сложных моделей (например, нейросетей), лемматизации, морфологического анализа, а также добавления валидации на тестовых данных для повышения точности оценки модели.
Результаты показывают, что даже базовые методы NLP и машинного обучения позволяют эффективно решать прикладные задачи анализа текстов в русскоязычной предметной области.