Работа с текстовыми данными

Brain.js — это библиотека на JavaScript для построения и обучения нейронных сетей, ориентированная на простоту использования. Помимо числовых данных, она поддерживает работу с текстовыми последовательностями, что позволяет применять нейросети для задач классификации текста, генерации текста и предсказания последовательностей символов.


Представление текста для нейросети

Нейронные сети работают с числовыми данными, поэтому текст необходимо преобразовать в числовой формат. Существуют несколько подходов:

  1. One-hot encoding символов

    • Каждому символу сопоставляется вектор длиной N (где N — количество уникальных символов), в котором только одна позиция равна 1, а остальные — 0.
    • Например, для алфавита {a, b, c} символ b кодируется как [0, 1, 0].
    • Этот метод хорошо работает для коротких алфавитов, но масштабируется плохо при больших объемах текста.
  2. One-hot encoding слов

    • Аналогично кодированию символов, но применяется к словам. Полезно для задач генерации текста на уровне слов.
  3. Векторизация с нормализацией

    • Символы или слова преобразуются в числа от 0 до 1. Например, индекс символа делится на длину алфавита.
    • Подходит для быстрых прототипов и небольших наборов данных.

Настройка рекуррентной нейронной сети

Для работы с последовательностями текста используется recurrent neural network (RNN). В Brain.js есть несколько типов RNN:

  • recurrent.LSTM — сеть на основе LSTM, способная хранить долгосрочные зависимости в последовательности.
  • recurrent.GRU — GRU-сеть, более простая по архитектуре, быстрее обучается, но может уступать LSTM в точности на длинных последовательностях.

Пример создания сети на символах:

const brain = require('brain.js');
const net = new brain.recurrent.LSTM();

const trainingData = [
  { input: "привет", output: "мир" },
  { input: "как", output: "дела" }
];

net.train(trainingData, {
  iterations: 2000,
  log: true,
  logPeriod: 100,
  learningRate: 0.01
});

Ключевые параметры тренировки:

  • iterations — количество проходов по данным.
  • learningRate — скорость обучения, слишком большая может привести к нестабильности.
  • logPeriod — частота вывода прогресса обучения.
  • errorThresh — порог ошибки, при достижении которого обучение останавливается.

Генерация текста

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

const output = net.run("при");
console.log(output); // Возможный результат: "вет"

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

let seed = "пр";
let result = seed;

for (let i = 0; i < 10; i++) {
  const nextChar = net.run(result.slice(-3)); // последние 3 символа
  result += nextChar;
}

console.log(result);

Классификация текста

Brain.js поддерживает классификацию текстовых данных через NeuralNetwork или recurrent.LSTM:

const net = new brain.recurrent.LSTM();

const trainingData = [
  { input: "холодно и дождливо", output: "плохая погода" },
  { input: "солнечно и тепло", output: "хорошая погода" }
];

net.train(trainingData, { iterations: 1000 });

const prediction = net.run("тепло и солнечно");
console.log(prediction); // "хорошая погода"
  • Для классификации важно подготавливать тексты последовательно и стандартизировано: приведение к одному регистру, удаление лишних символов и пробелов улучшает качество предсказаний.
  • Выбор сети (NeuralNetwork vs LSTM) зависит от длины и структуры текста: LSTM лучше справляется с длинными последовательностями.

Советы по работе с текстовыми данными

  • Нормализация текста: удаление знаков препинания, пробелов в начале и конце, приведение к нижнему регистру.
  • Ограничение длины последовательностей: слишком длинные последовательности замедляют обучение, слишком короткие могут терять контекст.
  • Аугментация данных: создание дополнительных вариантов текста повышает точность сети.
  • Регуляризация: для предотвращения переобучения рекомендуется использовать небольшое количество слоев и умеренный learningRate.

Примеры практических задач

  1. Предсказание следующего символа в слове Обучение сети на словарном наборе позволяет предсказывать вероятное продолжение слова.

  2. Автозаполнение текста Используется seed-фраза, из которой сеть генерирует завершение, применимо для чат-ботов или редакторов текста.

  3. Классификация настроений Короткие отзывы или комментарии преобразуются в метки «положительно/отрицательно» с помощью LSTM или GRU.

  4. Простая генерация кода или шаблонов Обучение на примерах кода позволяет генерировать заготовки или подсказки для разработчиков.


Работа с текстом в Brain.js сочетает простоту настройки и мощность рекуррентных сетей, позволяя строить решения для разнообразных задач обработки естественного языка прямо на JavaScript.