- •A method for applying an ensemble of neural network models and lexical methods to sentiment analysis of russian-language texts
- •Методика применения ансамбля нейросетевых моделей и словарных методов для решения задачи анализа тональности русскоязычных текстов
- •1 Примеры программных средств, автоматизирующих решение задачи классификации текста
- •2 Методика применения архитектуры трансформер для решения задач классификации текста
- •2.1 Обзор архитектуры трансформер и принципов её работы
- •2.2 Подготовка данных для классификации с использованием трансформеров
- •2.3 Выбор и настройка предобученной модели
- •2.4 Оценка и интерпретация результатов
- •2.5 Практические рекомендации по реализации и оптимизации
- •3 Методика применения ансамбля нейросетевых моделей для анализа тональности русскоязычных текстов
- •3.1 Практические рекомендации по внедрению
- •Приложение
2.4 Оценка и интерпретация результатов
После обучения модели необходимо оценить её производительность на тестовом наборе данных. Для задач классификации текста используются следующие основные метрики:
Точность (англ. Accuracy) — доля правильно классифицированных текстов среди всех текстов.
Точность в терминах информационного поиска (англ. Precision) — доля истинно положительных результатов среди всех положительных предсказаний.
Полнота (англ. Recall) — доля истинно положительных результатов среди всех реальных положительных примеров.
F1-мера — гармоническое среднее между точностью и полнотой.
AUC-ROC (Площадь под кривой операционной характеристики приемника, англ. Area Under the Receiver Operating Characteristic curve) — мера способности модели различать классы (“Классификация текста с использованием моделей трансформеров,” 2022).
Для интерпретации работы модели могут использоваться методы объяснимости, такие как LIME (Локальное интерпретируемое модельно-агностическое объяснение, англ. Local Interpretable Model-agnostic Explanations) или SHAP (Объяснение на основе значений Шепли, англ. SHapley Additive exPlanations), которые позволяют определить, какие слова или фразы в тексте наиболее сильно повлияли на решение модели (Ribeiro et al., 2016).
2.5 Практические рекомендации по реализации и оптимизации
Для реализации методики рекомендуется использовать современные фреймворки глубокого обучения в сочетании с библиотекой Transformers от Hugging Face.
При работе с моделями на основе трансформеров важно учитывать их вычислительные требования. Рекомендации по оптимизации процесса:
Использование смешанной точности (англ. Mixed Precision Training) — обучение с использованием как 32-битных, так и 16-битных операций с плавающей точкой.
Градиентная аккумуляция (англ. Gradient Accumulation) — обновление весов модели после накопления градиентов за несколько мини-батчей.
Параллелизм данных (англ. Data Parallelism) — распределение обработки батчей между несколькими GPU.
Обрезка последовательностей (англ. Sequence Truncation) — ограничение длины входных последовательностей до разумного максимума (обычно 128-512 токенов).
Дистилляция знаний (англ. Knowledge Distillation) — обучение меньшей модели (ученика) имитировать поведение большей модели (учителя) (Dodge et al., 2020; “Transformers Documentation,” n.d.; Wolf et al., 2020).
3 Методика применения ансамбля нейросетевых моделей для анализа тональности русскоязычных текстов
В последние годы разработано множество специализированных моделей для анализа русскоязычных текстов, каждая из которых имеет свои особенности и преимущества. Комбинирование нескольких моделей в единый ансамбль позволяет существенно повысить точность и надежность анализа за счет компенсации ограничений отдельных подходов. В данном разделе представлена методика создания и применения такого ансамбля для решения задачи определения тональности текстов на русском языке. Вся реализация выполнена с использованием среды разработки VS Code1, которая обеспечивает удобный интерфейс работы с кодом, подсветку синтаксиса, интеграцию с системами контроля версий и возможность удобной отладки Python-скриптов.
Этап 1 - Анализ доступных моделей и выбор компонентов ансамбля
Эффективность ансамблевого подхода во многом зависит от разнообразия и взаимодополняемости используемых моделей. Для создания комплексной системы анализа тональности русскоязычных текстов предлагается использовать несколько ключевых компонентов. В первую очередь, это специализированные трансформерные модели для анализа тональности, такие как RuBERT для сентимент-анализа (blanchefort/rubert-base-cased-sentiment) – модель, специально настроенная на классификацию тональности русских текстов по трем категориям (позитивная, нейтральная, негативная). Далее включаются модели общего назначения с финальным классификатором, например, RuBERTa (DeepPavlov/rubert-base-cased-conversational) – оптимизированная для диалогов версия RuBERT с дополнительным классификационным слоем. Третьим важным компонентом являются специализированные модели для определения эмоций, такие как EmotionBERT (cointegrated/rubert-tiny2-cedr-emotion-detection) – легковесная модель для распознавания эмоциональных состояний в тексте. Наконец, для обеспечения интерпретируемости и работы в условиях ограниченных вычислительных ресурсов, в ансамбль включается оригинальный словарный компонент, основанный на словарях эмоционально окрашенной лексики с учетом отрицаний и контекстуальных маркеров.
Установка и подготовка необходимых компонентов выполняется с использованием стандартных библиотек Python (Листинг 1).
Листинг 1 - Установка и импорт необходимых библиотек
# Установка необходимых библиотек
pip install torch transformers pandas tabulate numpy
# Импорт основных модулей
import torch
from transformers import AutoModelForSequenceClassification, AutoTokenizer, pipeline
import numpy as np
import re
import pandas as pd
from tabulate import tabulate
Далее загружаются предобученные модели из хранилища Hugging Face2(Листинг 2).
Листинг 2 - Загрузка предобученных моделей
# Загрузка модели RuBERT для сентимент-анализа
model1_name = "blanchefort/rubert-base-cased-sentiment"
tokenizer1 = AutoTokenizer.from_pretrained(model1_name)
model1 = AutoModelForSequenceClassification.from_pretrained(model1_name)
# Загрузка и настройка модели RuBERTa через pipeline
model2_name = "DeepPavlov/rubert-base-cased-conversational"
sentiment_analyzer = pipeline(
task="text-classification",
model=model2_name,
tokenizer=model2_name
)
# Загрузка модели для определения эмоций
model3_name = "cointegrated/rubert-tiny2-cedr-emotion-detection"
model3 = AutoModelForSequenceClassification.from_pretrained(model3_name)
tokenizer3 = AutoTokenizer.from_pretrained(model3_name)
Для словарного компонента необходимо определить словари эмоционально окрашенной лексики и маркеры нейтральности (Листинг 3).
Листинг 3 - Определение словарей эмоционально окрашенной лексики
# Словари для словарного метода
positive_words = {
'отличный', 'замечательный', 'превосходный', 'великолепный', 'прекрасный',
'хороший', 'приятный', 'понравился', 'понравилась', 'понравилось', 'понравились',
'рекомендую', 'советую', 'классный', 'супер', 'круто', 'здорово', 'позитивный',
'вкусный', 'качественный', 'чистый', 'уютный', 'комфортный', 'дружелюбный',
'вежливый', 'приветливый', 'достойный', 'лучший', 'удобный', 'радует', 'доволен',
'невероятно', 'красивый', 'интересный', 'прекрасно'
}
negative_words = {
'плохой', 'ужасный', 'отвратительный', 'кошмарный', 'неприятный', 'разочаровывающий',
'грубый', 'некачественный', 'отстой', 'фигня', 'жуткий', 'негативный', 'грязный',
'неудобный', 'разочаровал', 'разочаровала', 'разочаровало', 'разочаровали',
'не рекомендую', 'не советую', 'ужас', 'кошмар', 'плохо', 'не понравился',
'не оправдывает', 'ужасное', 'никогда не вернусь', 'разочаровали'
}
neutral_patterns = [
'обычный', 'ничего особенного', 'средний', 'нормальный', 'как обычно',
'стандартный', 'типичный', 'не хорошо и не плохо', 'неплохой', 'ничего такого'
Этап 2 - Разработка функций предобработки и анализа текста
Важным компонентом методики является качественная предобработка текста и реализация алгоритмов анализа для каждой модели. Предобработка включает приведение текста к нижнему регистру, удаление лишних пробелов и специальных символов (Листинг 4).
Листинг 4 - Функция предобработки текста
def preprocess_text(text):
"""
Предобработка текста перед анализом
"""
# Приведение к нижнему регистру
text = text.lower()
# Удаление лишних пробелов
text = re.sub(r'\s+', ' ', text).strip()
return text
Функция словарного анализа учитывает не только наличие эмоционально окрашенных слов, но и конструкции с отрицаниями, которые могут инвертировать тональность (Листинг 5).
Листинг 5 - Функция словарного анализа тональности
def analyze_sentiment_with_lexicons(text):
"""
Анализ тональности с использованием словарей
"""
text_lower = text.lower()
# Подсчет позитивных и негативных слов
positive_count = sum(1 for word in positive_words if word in text_lower)
negative_count = sum(1 for word in negative_words if word in text_lower)
# Проверка на наличие фраз, указывающих на нейтральную тональность
neutral_match = any(pattern in text_lower for pattern in neutral_patterns)
# Обработка отрицаний
if "не " in text_lower and positive_count > 0:
for word in positive_words:
if f"не {word}" in text_lower:
positive_count -= 1
negative_count += 1
# Обработка особых случаев
if "очень доволен" in text_lower:
return "Позитивная", 0.9
if "ужасное обслуживание" in text_lower or "никогда не вернусь" in text_lower:
return "Негативная", 0.9
if "обычный день" in text_lower and "ничего особенного" in text_lower:
return "Нейтральная", 0.85
# Определение тональности на основе словарей
if neutral_match and abs(positive_count - negative_count) < 2:
return "Нейтральная", max(0.6, 0.7 - 0.1 * abs(positive_count - negative_count))
elif positive_count > negative_count:
return "Позитивная", min(0.9, 0.5 + 0.1 * (positive_count - negative_count))
elif negative_count > positive_count:
return "Негативная", min(0.9, 0.5 + 0.1 * (negative_count - positive_count))
else:
return "Нейтральная", 0.5
Для каждой нейросетевой модели необходимо реализовать функцию получения результатов в унифицированном формате (Листинг 6).
Листинг 6 - Функции получения результатов от нейросетевых моделей
# Функция для получения результатов модели RuBERT Sentiment
def get_model1_results(text):
preprocessed_text = preprocess_text(text)
encoded_input = tokenizer1(preprocessed_text, padding=True, truncation=True, max_length=512, return_tensors='pt')
with torch.no_grad():
output = model1(**encoded_input)
scores = torch.nn.functional.softmax(output.logits, dim=1).numpy()[0]
label_idx = np.argmax(scores)
# Порядок меток: Позитивная, Нейтральная, Негативная
labels = ['Позитивная', 'Нейтральная', 'Негативная']
return labels[label_idx], float(scores[label_idx])
# Функция для получения результатов модели для определения эмоций
def get_model3_results(text):
preprocessed_text = preprocess_text(text)
encoded_input = tokenizer3(preprocessed_text, padding=True, truncation=True, max_length=512, return_tensors='pt')
with torch.no_grad():
output = model3(**encoded_input)
scores = torch.nn.functional.softmax(output.logits, dim=1).numpy()[0]
label_idx = np.argmax(scores)
# Преобразуем эмоции в категории тональности
labels = ['нейтральность', 'радость', 'грусть', 'удивление', 'страх', 'гнев']
emotion = labels[label_idx]
if emotion in ['радость']:
sentiment = 'Позитивная'
elif emotion in ['грусть', 'страх', 'гнев']:
sentiment = 'Негативная'
else:
sentiment = 'Нейтральная'
return sentiment, float(scores[label_idx])
Этап 3 - Реализация системы голосования и интеграция компонентов
Ключевым элементом предлагаемой методики является система голосования, которая объединяет результаты всех компонентов ансамбля для формирования окончательного вердикта о тональности текста (Листинг 7).
Листинг 7 - Система голосования для определения итоговой тональности
# Определение согласованного результата через голосование
sentiments = [dict_sentiment, model1_sentiment, model2_sentiment, model3_sentiment]
if sentiments.count("Позитивная") > sentiments.count("Негативная") and sentiments.count("Позитивная") > sentiments.count("Нейтральная"):
final_sentiment = "Позитивная"
elif sentiments.count("Негативная") > sentiments.count("Позитивная") and sentiments.count("Негативная") > sentiments.count("Нейтральная"):
final_sentiment = "Негативная"
else:
final_sentiment = "Нейтральная"
Для определения уровня уверенности в итоговом результате используется средняя уверенность тех моделей, чье мнение совпало с итоговым вердиктом (Листинг 8).
Листинг 8 - Расчет уровня уверенности в итоговом результате
# Вычисление средней уверенности для итогового сентимента
confidences = [conf for sent, conf in [
(dict_sentiment, dict_confidence),
(model1_sentiment, model1_confidence),
(model2_sentiment, model2_confidence),
(model3_sentiment, model3_confidence)
] if sent == final_sentiment]
final_confidence = sum(confidences) / len(confidences) if confidences else 0.5
Такой подход позволяет не только определить наиболее вероятную тональность текста, но и оценить уровень согласованности различных моделей, что является важным индикатором надежности результата.
Этап 4 - Тестирование и оценка эффективности ансамбля
Для демонстрации работы предложенной методики рассмотрим анализ нескольких примеров текстов с различной эмоциональной окраской (Листинг 9).
Листинг 9 - Примеры текстов для анализа тональности
# Примеры текстов для анализа
texts = [
"Я очень доволен этим товаром, он превзошел все мои ожидания!",
"Сегодня обычный день, ничего особенного не произошло.",
"Ужасное обслуживание, больше никогда не вернусь в этот магазин.",
"Фильм был интересным, но некоторые моменты меня разочаровали.",
"Невероятно красивый вид открывается с этой горы!"
]
Результаты анализа представлены на Рисунок 1.
Рисунок 1 - Результаты анализа тональности текстов ансамблем моделей
Как видно из рисунка, для каждого текста ансамбль моделей формирует итоговую оценку тональности и уровень уверенности в ней. Интересно отметить, что в некоторых случаях (например, для текста 3) модели дают противоречивые оценки, но система голосования позволяет принять наиболее обоснованное решение.
Особенно показателен пример текста 2 ("Сегодня обычный день..."), где только две модели (словарный анализ и EmotionBERT) правильно определили его нейтральную тональность, но благодаря системе голосования именно их мнение стало решающим, что соответствует интуитивному пониманию смысла текста. EmotionBERT показал уверенность 1 для каждого текста, но это связано с преобразованием предсказанных эмоций в тональность.
Результаты демонстрируют, что ансамблевый подход обеспечивает существенно более высокую точность по сравнению с любым отдельным компонентом, что подтверждает эффективность предложенной методики.
