Гид по технологиям

Анализ настроений на Python: практическое руководство

7 min read Машинное обучение Обновлено 08 Jan 2026
Анализ настроений на Python — практическое руководство
Анализ настроений на Python — практическое руководство

Человек, пишущий код на ноутбуке

Анализ настроений — это метод обработки естественного языка (обработка естественного языка — определение отношения автора к объекту) для определения тональности текста: положительная, отрицательная или нейтральная. Часто применяется для автоматической классификации отзывов клиентов, мониторинга бренда и аналитики пользователей.

Что вы получите из руководства

  • Рабочий пример: от CSV до сохранённой модели и токенизатора.
  • Объяснение архитектуры CNN для текста (Embedding → Conv1D → GlobalMaxPooling → Dense).
  • Советы по улучшению качества, критерии приёмки, тест-кейсы и чек-листы для ролей.
  • Когда метод не подойдёт и какие есть альтернативы.

Необходимое окружение и установка

Перед началом убедитесь, что знакомы с Python и можете запустить ноутбук в Google Colab или Jupyter. Создайте новый ноутбук и выполните установку библиотек:

! pip install tensorflow scikit-learn pandas numpy pickle5  

Важно: используйте совместимую версию TensorFlow (например, 2.x). В Colab обычно уже установлены основные пакеты; при локальной установке убедитесь, что у вас подходящая версия Python (3.7–3.10 на момент написания).

Полный исходный код проекта доступен в репозитории на GitHub (ссылка в оригинале).

Импорт необходимых библиотек

Импортируйте библиотеки, которые будут использоваться для предобработки, создания модели и оценки:

import numpy as np  
import pandas as pd  
import tensorflow as tf  
from sklearn.model_selection import train_test_split  
from sklearn.metrics import accuracy_score  
from tensorflow.keras.preprocessing.text import Tokenizer  
from tensorflow.keras.preprocessing.sequence import pad_sequences  
from tensorflow.keras.models import Sequential  
from tensorflow.keras.layers import Embedding, Conv1D, GlobalMaxPooling1D, Dense, Dropout  
import pickle5 as pickle

Краткое определение терминов:

  • Tokenizer: класс для преобразования слов в индексы.
  • Pad sequences: приведение последовательностей к одинаковой длине.

Загрузка датасета

В примере используется датасет Trip Advisor Hotel Reviews (Kaggle). Загрузите CSV и проверьте первые строки:

df = pd.read_csv('/content/tripadvisor_hotel_reviews.csv')  
print(df.head())

Вывод с первыми пятью строками датасета (таблица)

В датасете есть индекс, колонка Review и колонка Rating.

Предобработка данных

  1. Выделите колонки Review и Rating. Создайте новую колонку sentiment по правилам:
  • rating > 3 → positive
  • rating < 3 → negative
  • rating == 3 → neutral
  1. Оставьте только Review и sentiment, перемешайте строки и сбросьте индекс.
df = df[['Review', 'Rating']]  
df['sentiment'] = df['Rating'].apply(lambda x: 'positive' if x > 3  
                                    else 'negative' if x < 3  
                                    else 'neutral')  
df = df[['Review', 'sentiment']]  
df = df.sample(frac=1).reset_index(drop=True)
  1. Токенизация и приведение к последовательностям. В примере ограничиваем словарь 5000 токенами, вводим OOV-токен и обрезаем/дополняем до длины 100:
tokenizer = Tokenizer(num_words=5000, oov_token='')  
tokenizer.fit_on_texts(df['Review'])  
word_index = tokenizer.word_index  
sequences = tokenizer.texts_to_sequences(df['Review'])  
padded_sequences = pad_sequences(sequences, maxlen=100, truncating='post')
  1. Преобразуйте метки в one-hot encoding:
sentiment_labels = pd.get_dummies(df['sentiment']).values  

One-hot кодирование облегчает работу модели с категориальными метками.

Разделение на тренировочный и тестовый наборы

Используйте train_test_split для случайного разбиения данных (test_size=0.2 — 20% на тест):

x_train, x_test, y_train, y_test = train_test_split(padded_sequences, sentiment_labels, test_size=0.2)  

Это стандартный подход для оценки обобщающей способности модели.

Создание нейронной сети

Архитектура из 6 слоёв в примере:

model = Sequential()  
model.add(Embedding(5000, 100, input_length=100))  
model.add(Conv1D(64, 5, activation='relu'))  
model.add(GlobalMaxPooling1D())  
model.add(Dense(32, activation='relu'))  
model.add(Dropout(0.5))  
model.add(Dense(3, activation='softmax'))  
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])  
model.summary()  

Коротко про слои:

  • Embedding: обучаемое представление слов (векторная эмбеддинг-матрица).
  • Conv1D: свёрточный слой для извлечения локальных n-gram признаков.
  • GlobalMaxPooling1D: выбирает наиболее выраженные признаки по каждому фильтру.
  • Dense + Dropout: классификация и регуляризация.
  • Выход (softmax): распределение вероятностей по трём классам.

Почему Conv1D? Простая и быстрая альтернатива LSTM/Transformer для задач классификации коротких текстов.

Обучение модели

Обучаем модель 10 эпох (можно менять):

model.fit(x_train, y_train, epochs=10, batch_size=32, validation_data=(x_test, y_test))  

После каждой эпохи выводится метрика на валидационном наборе.

Важно: следите за переобучением (разрыв между train/val accuracy) и при необходимости уменьшите архитектуру, добавьте регуляризацию или раннюю остановку.

Оценка качества модели

Предскажите метки и вычислите accuracy:

y_pred = np.argmax(model.predict(x_test), axis=-1)  
print("Accuracy:", accuracy_score(np.argmax(y_test, axis=-1), y_pred))  

В примере точность модели составила примерно 84% на тестовом наборе. Эта оценка зависит от качества и баланса датасета.

Сохранение модели и токенизатора

model.save('sentiment_analysis_model.h5')  
with open('tokenizer.pickle', 'wb') as handle:  
    pickle.dump(tokenizer, handle, protocol=pickle.HIGHEST_PROTOCOL)

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

Использование сохранённой модели для предсказаний

Загрузите модель и токенизатор и определите функцию предсказания:

# Load the saved model and tokenizer  
import keras  
  
model = keras.models.load_model('sentiment_analysis_model.h5')  
with open('tokenizer.pickle', 'rb') as handle:  
    tokenizer = pickle.load(handle)
def predict_sentiment(text):  
    # Tokenize and pad the input text  
    text_sequence = tokenizer.texts_to_sequences([text])  
    text_sequence = pad_sequences(text_sequence, maxlen=100)  
  
    # Make a prediction using the trained model  
    predicted_rating = model.predict(text_sequence)[0]  
    if np.argmax(predicted_rating) == 0:  
        return 'Negative'  
    elif np.argmax(predicted_rating) == 1:  
        return 'Neutral'  
    else:  
        return 'Positive'  

Пример использования:

text_input = "I absolutely loved my stay at that hotel. The staff was amazing and the room was fantastic!"  
predicted_sentiment = predict_sentiment(text_input)  
print(predicted_sentiment)

Результат работы модели анализа настроений в Google Colab

Модель корректно классифицировала все три отзыва на примере.

Когда этот подход не подойдёт

  • Тексты очень длинные (статьи, форумы) — Conv1D с фиксированным maxlen может терять контекст.
  • Сильно несбалансированные классы — модель будет предвзята к доминирующему классу.
  • Нужна тонкая семантика (ирония, сарказм) — простая CNN её плохо ловит.

Альтернативные подходы

  • Transformer-подходы (BERT, DistilBERT, XLM-R) — лучше улавливают контекст и сарказм, подходят при достаточных ресурсах.
  • Классические методы: TF-IDF + Logistic Regression или SVM — быстрее и часто хорошо работают на небольших данных.
  • Fine-tuning предобученных эмбеддингов (word2vec, GloVe, FastText) и последующая модель классификации.

Эвристики и модель мышления

  • Начинайте с простого: baseline (TF-IDF + линейный классификатор). Если не хватает качества, переходите к нейронным моделям.
  • Балансируйте набор: либо undersample/oversample, либо используйте class weights.
  • Оценивайте на релевантных метриках: accuracy, precision, recall, F1 по каждому классу.

Мини-методология разработки модели

  1. Исследование данных: распределение оценок, пропуски, дубликаты.
  2. Предобработка: очистка, нормализация, удаление шумов.
  3. Разбиение: train/val/test с сохранением репрезентативности.
  4. Базовая модель + метрики.
  5. Улучшения: архитектура, гиперпараметры, предобученные эмбеддинги.
  6. Тестирование и контроль качества.
  7. Сохранение, CI/CD и мониторинг в продакшн.

Критерии приёмки

  • Accuracy на тестовом наборе ≥ целевого порога (например, 80%) или улучшение относительно baseline.
  • F1-score для каждой важной категории не ниже заданного порога.
  • Отсутствие утечки данных между train и test.
  • Модель воспроизводима: зафиксированы seed, версия библиотек и конфигурация токенизатора.
  • Latency inference < требуемого времени для продакшн (например, <100 ms на request для онлайн-сервиса).

Тестовые случаи и критерии приёмки

  • Короткий положительный отзыв → классификация как positive.
  • Нейтральный отзыв с рейтингом 3 → neutral.
  • Негативный отзыв с руганью → negative.
  • Невалидный/пустой ввод → аккуратно обработать и вернуть предупреждение.

Напишите unit-тесты для функции predict_sentiment, покрывающие эти сценарии.

Чек-листы по ролям

Data Engineer:

  • Подготовить пайплайн загрузки CSV.
  • Реализовать валидацию колонок и типов.
  • Обеспечить reproducibility (фиксировать seed).

ML Engineer:

  • Настроить токенизатор и pipeline предобработки.
  • Реализовать обучение, валидацию и сохранение модели.
  • Провести анализ ошибок и построить отчёт.

Product Manager:

  • Определить целевые метрики и допустимые латентности.
  • Утвердить сценарии использования (dashboard, триггеры).

DevOps:

  • Подготовить контейнер для инференса.
  • Настроить мониторинг качества (drift) и логирование.

Риски и смягчения

  • Бессознательная предвзятость в данных → аудит данных, балансировка классов.
  • Утечка персональных данных → удаление PII, шифрование хранилищ.
  • Падение качества в продакшн (data drift) → мониторинг метрик и периодическое переобучение.

Приватность и соответствие регуляциям

Если в отзывах есть персональные данные (имена, контакты), предусмотреть анонимизацию и хранить данные в соответствии с требованиями GDPR: минимизация данных, право на удаление, документирование целей обработки.

Советы по улучшению качества модели

  • Используйте более широкий словарь или предобученные эмбеддинги.
  • Применяйте stratified split для сохранения распределения классов.
  • Попробуйте fine-tuning предобученных трансформеров для повышения качества в сложных случаях.
  • Применяйте class_weight при сильном дисбалансе.

Пример решения проблем с классами

Если модель плохо распознаёт нейтральные отзывы, рассмотрите: увеличение примеров neutral, добавление усиленной предобработки (удаление эмодзи/шумов), или перевод задачи в иерархическую (сначала позитив/негатив vs neutral, затем детальная классификация).

Решение для развёртывания (мини-playbook)

  1. Экспортировать model.h5 и tokenizer.pickle.
  2. Упаковать инференс в контейнер (например, FastAPI + Uvicorn).
  3. Настроить эндпоинт POST /predict, который принимает JSON с полем text.
  4. Инструментировать логирование: входной текст, предсказание, вероятность.
  5. Мониторить показатели (latency, error rate, распределение меток).
  6. План переобучения при дрейфе данных.

Decision tree для выбора подхода

flowchart TD
  A[Есть готовый большой датасет?] -->|Да| B[Использовать трансформер 'BERT']
  A -->|Нет| C[Много ограниченных ресурсов?]
  C -->|Да| D[TF-IDF + Logistic Regression]
  C -->|Нет| E[CNN или LSTM с эмбеддингами]
  B --> F[Тонкая настройка и деплой]
  D --> F
  E --> F

Примеры приемочных тестов

  • Тест эффективности: accuracy >= требуемого порога на holdout.
  • Тест устойчивости: модель корректно обрабатывает пустую строку и возвращает детектируемое значение без исключений.
  • Тест интеграции: REST API возвращает результат в течение SLA и сохраняет логи.

Итог и дальнейшие шаги

Коротко: приведённый пример демонстрирует, как из обычного CSV-файла собрать рабочую систему классификации тональности отзывов с помощью Keras и TensorFlow. Для продакшена рекомендуются дополнительные этапы: мониторинг, защита приватности, тестирование и, при необходимости, переход на более мощные архитектуры (Transformer).

Ключевые действия для внедрения:

  • Проведите аудит данных и очистку.
  • Начните с baseline и постепенно улучшайте архитектуру.
  • Реализуйте CI для обучения и тестирования, а также мониторинг в продакшне.

Примечание: пример показывает одну из базовых архитектур. Выбор архитектуры и гиперпараметров зависит от объёма данных, длины текстов и требований к задержке.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

RDP: полный гид по настройке и безопасности
Инфраструктура

RDP: полный гид по настройке и безопасности

Android как клавиатура и трекпад для Windows
Гайды

Android как клавиатура и трекпад для Windows

Советы и приёмы для работы с PDF
Документы

Советы и приёмы для работы с PDF

Calibration в Lightroom Classic: как и когда использовать
Фото

Calibration в Lightroom Classic: как и когда использовать

Отключить Siri Suggestions на iPhone
iOS

Отключить Siri Suggestions на iPhone

Рисование таблиц в Microsoft Word — руководство
Office

Рисование таблиц в Microsoft Word — руководство