Анализ тональности пользовательских отзывов с использованием модели Naive Bayes

Бесплатный доступ

В данной работе разработана и реализована система анализа тональности пользовательских отзывов на примере текстов о смартфоне с использованием методов машинного обучения. Цель исследования заключается в автоматическом определении эмоциональной окраски отзывов — положительной, нейтральной или отрицательной — на основе текстового содержания и пользовательского рейтинга. Для достижения поставленной цели были последовательно реализованы этапы предобработки текста, его преобразование в числовое представление с помощью метода 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 и машинного обучения позволяют эффективно решать прикладные задачи анализа текстов в русскоязычной предметной области.