Анализ тональности текста

Основы анализа тональности

Анализ тональности текста (sentiment analysis) представляет собой задачу классификации текста на основе эмоциональной окраски — положительная, отрицательная или нейтральная. В среде JavaScript одной из библиотек, позволяющих строить нейронные сети для такой задачи, является Brain.js. Она обеспечивает удобный интерфейс для создания и обучения нейросетей, поддерживает как feedforward сети, так и рекуррентные сети для последовательных данных, что особенно важно при работе с текстом.

Подготовка данных

Для корректного обучения нейросети необходимо преобразовать текст в числовой формат. На практике применяется несколько подходов:

  1. Bag of Words (мешок слов) — текст представляется как вектор, где каждая позиция соответствует слову из словаря, а значение — частота появления слова в тексте.
  2. One-Hot Encoding — каждая уникальная единица текста (слово или символ) кодируется бинарным вектором.
  3. TF-IDF — учитывает не только наличие слова, но и его значимость относительно всего корпуса.

Пример простого преобразования текста в числовой формат для Brain.js:

const textToVector = (text, vocabulary) => {
  const vector = Array(vocabulary.length).fill(0);
  text.toLowerCase().split(/\W+/).forEach(word => {
    const index = vocabulary.indexOf(word);
    if (index !== -1) vector[index] = 1;
  });
  return vector;
};

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

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

Для анализа тональности чаще всего используют Feedforward Neural Network. В Brain.js она реализуется через класс NeuralNetwork:

const brain = require('brain.js');

const net = new brain.NeuralNetwork({
  hiddenLayers: [10, 10], // два скрытых слоя по 10 нейронов
  activation: 'sigmoid'   // функция активации
});

Ключевые параметры:

  • hiddenLayers — массив, задающий количество нейронов в скрытых слоях. Для текстовых данных рекомендуется 1–3 слоя.
  • activation — функция активации нейронов. Чаще всего используют 'sigmoid' или 'relu'.
  • learningRate — скорость обучения сети. Значения 0.01–0.3 подходят для большинства задач.

Формирование обучающего набора

Обучающий набор представляет собой массив объектов с полями input и output:

const trainingData = [
  { input: textToVector("Я люблю этот продукт", vocabulary), output: { positive: 1 } },
  { input: textToVector("Это ужасное обслуживание", vocabulary), output: { negative: 1 } },
  { input: textToVector("Просто обычный день", vocabulary), output: { neutral: 1 } }
];

Особенности:

  • input — числовой вектор, соответствующий тексту.
  • output — объект с ключами, представляющими классы тональности, значением 1 для соответствующего класса и 0 для остальных.

Обучение нейронной сети

Обучение проводится методом обратного распространения ошибки. В Brain.js процесс выглядит следующим образом:

net.train(trainingData, {
  iterations: 20000,      // количество итераций обучения
  errorThresh: 0.005,     // допустимый уровень ошибки
  log: true,              // вывод прогресса
  logPeriod: 1000,        // интервал логирования
  learningRate: 0.1       // скорость обучения
});

Рекомендации при обучении:

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

Использование сети для анализа текста

После обучения сеть можно использовать для прогнозирования тональности новых текстов:

const output = net.run(textToVector("Обслуживание на высоте", vocabulary));
console.log(output);

output возвращает объект с вероятностями для каждого класса. Для классификации выбирается класс с наибольшей вероятностью:

const sentiment = Object.keys(output).reduce((a, b) => output[a] > output[b] ? a : b);
console.log(sentiment); // 'positive', 'negative' или 'neutral'

Улучшение точности анализа

  1. Расширение словаря — добавление всех уникальных слов корпуса.
  2. Нормализация текста — приведение к нижнему регистру, удаление знаков препинания.
  3. Стемминг и лемматизация — приведение слов к базовой форме для уменьшения размерности входных данных.
  4. Увеличение тренировочного корпуса — чем больше примеров для каждой категории, тем точнее сеть.
  5. Регуляризация и Dropout — для предотвращения переобучения при работе с большими сетями.

Работа с рекуррентными сетями

Для анализа длинных текстов лучше подходят Recurrent Neural Network (RNN), доступные в Brain.js через recurrent.LSTM:

const netRNN = new brain.recurrent.LSTM();
netRNN.train([
  { input: "Я очень доволен сервисом", output: "positive" },
  { input: "Мне не понравилось качество", output: "negative" }
], {
  iterations: 1000,
  learningRate: 0.01
});

const result = netRNN.run("Супер обслуживание!");
console.log(result); // 'positive'

Преимущества RNN:

  • Учет последовательности слов.
  • Возможность работать с переменной длиной текста.
  • Более высокая точность для сложных предложений и контекста.

Интеграция с реальными приложениями

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

  • Автоматической классификации отзывов на сайтах.
  • Мониторинга социальных сетей для анализа настроений.
  • Фильтрации негативных комментариев и выявления токсичного контента.
  • Генерации аналитических отчетов по тональности отзывов или сообщений.

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

const json = net.toJSON();        // сериализация модели
net.fromJSON(json);               // восстановление модели

Это позволяет интегрировать обученную сеть в серверные приложения, где требуется быстрый анализ текста без повторного обучения.