Анализ тональности текста (sentiment analysis) представляет собой задачу классификации текста на основе эмоциональной окраски — положительная, отрицательная или нейтральная. В среде JavaScript одной из библиотек, позволяющих строить нейронные сети для такой задачи, является Brain.js. Она обеспечивает удобный интерфейс для создания и обучения нейросетей, поддерживает как feedforward сети, так и рекуррентные сети для последовательных данных, что особенно важно при работе с текстом.
Для корректного обучения нейросети необходимо преобразовать текст в числовой формат. На практике применяется несколько подходов:
Пример простого преобразования текста в числовой формат для 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'
Для анализа длинных текстов лучше подходят 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); // восстановление модели
Это позволяет интегрировать обученную сеть в серверные приложения, где требуется быстрый анализ текста без повторного обучения.