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

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

Настройка проекта и подключение Brain.js

Для начала работы требуется установка библиотеки через npm:

npm install brain.js

Подключение в коде:

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

Для генерации текста используется класс recurrent.LSTM, который реализует долгую краткосрочную память (LSTM) — одну из разновидностей RNN. Она хорошо справляется с последовательными данными, сохраняя контекст на протяжении нескольких шагов.

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

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

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

  1. По символам — каждый символ рассматривается как отдельный элемент последовательности.
  2. По словам — каждый токен (слово) является элементом последовательности. Этот способ требует предварительной токенизации текста.

Пример подготовки данных по символам:

const trainingData = [
  "Привет, как дела?",
  "Привет, что нового?",
  "Привет, давно не виделись."
];

Для больших текстовых корпусов рекомендуется предварительно очистить данные: удалить лишние пробелы, нормализовать регистр, исключить неподходящие символы.

Настройка параметров сети

RNN в Brain.js имеет несколько важных параметров:

  • inputSize — размер входного слоя (по умолчанию вычисляется автоматически).
  • hiddenLayers — массив, задающий количество нейронов в скрытых слоях, например [20, 20].
  • outputSize — размер выходного слоя.
  • learningRate — скорость обучения, обычно значение 0.01–0.05.
  • iterations — количество проходов обучения.

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

const net = new brain.recurrent.LSTM({
  hiddenLayers: [50, 50],
  learningRate: 0.02
});

Обучение сети

Обучение проводится методом train, который принимает массив текстовых примеров:

net.train(trainingData, {
  iterations: 2000,
  log: true,
  logPeriod: 100
});
  • iterations — количество циклов обучения.
  • log — вывод процесса обучения.
  • logPeriod — через сколько итераций выводить лог.

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

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

const result = net.run("Привет, ");
console.log(result); // например: "как дела?"

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

Настройка случайности и длины выхода

Метод run можно расширять через дополнительные параметры:

  • Температура (temperature) — управляет степенью случайности при выборе следующего символа. Низкая температура делает текст более предсказуемым, высокая — более разнообразным.
  • Максимальная длина (maxLength) — ограничивает количество сгенерированных символов.

Пример реализации функции генерации текста с настройкой температуры:

function generateText(seed, length = 100, temperature = 0.5) {
  let output = seed;
  for (let i = 0; i < length; i++) {
    const nextChar = net.run(output).slice(-1);
    if (Math.random() < temperature) {
      output += nextChar;
    } else {
      output += seed[Math.floor(Math.random() * seed.length)];
    }
  }
  return output;
}

console.log(generateText("Привет, ", 50, 0.7));

Практические рекомендации

  • Для больших текстов рекомендуется обучать сеть на корпусе не менее нескольких тысяч строк.
  • Длинные скрытые слои увеличивают способность сети к запоминанию контекста, но замедляют обучение.
  • Чистка текста и нормализация значительно повышают качество генерации.
  • Смешивание разных источников текста позволяет создать более разнообразные и естественные последовательности.

Пример применения

RNN на Brain.js подходит для:

  • Генерации диалогов.
  • Продолжения литературных текстов.
  • Создания текстовых шаблонов для автоматизации.
  • Игровых ботов, которые подражают стилю определённого персонажа.

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