Нейронные сети обрабатывают числовые данные, поэтому текстовую информацию необходимо преобразовать в числовой формат. Прямое использование символов или слов в исходном виде невозможно, так как нейронные сети оперируют векторыми представлениями данных. Для успешного обучения сети важно выбирать подходящий метод кодирования текста.
Ключевые задачи при работе с текстом:
Одним из базовых подходов является one-hot encoding. Каждому уникальному символу или слову текста соответствует отдельный вектор, в котором все элементы равны нулю, кроме позиции, отвечающей за конкретный символ или слово, которая равна единице.
Пример для символов ['a', 'b', 'c']:
a → [1, 0, 0]b → [0, 1, 0]c → [0, 0, 1]Этот метод хорошо подходит для коротких последовательностей и ограниченного словаря, но быстро увеличивает размер входного пространства при росте числа уникальных символов или слов.
Для упрощения структуры можно использовать числовые
представления символов, например, их Unicode-коды. Такой подход
уменьшает размерность входных данных, однако вводит ложную иерархию:
сеть может ошибочно интерпретировать, что символ b ближе к
a, чем к c, что не всегда корректно для
семантики текста.
Пример:
const input = 'abc'.split('').map(char => char.charCodeAt(0) / 255);
Нормализация к диапазону [0, 1] обязательна для
предотвращения проблем с градиентным спуском.
Для обучения сети на предсказание текста важно разбивать текст на последовательности фиксированной длины. Каждая последовательность становится входом сети, а следующий символ — целевым выходом.
Пример: текст "hello" при длине последовательности
3:
hel → Выход: lell → Выход: oТакой подход используется в рекуррентных сетях, где важно учитывать контекст предыдущих символов.
Brain.js предоставляет удобные методы для работы с входными и выходными данными. Основной формат для обучения:
const trainingData = [
{ input: [...], output: [...] },
...
];
Для текста:
Пример подготовки данных для символов:
const text = 'hello';
const chars = Array.from(new Set(text));
const charToIndex = {};
chars.forEach((char, idx) => charToIndex[char] = idx);
function oneHot(char) {
return chars.map(c => (c === char ? 1 : 0));
}
const sequences = [];
for (let i = 0; i < text.length - 1; i++) {
sequences.push({
input: oneHot(text[i]),
output: oneHot(text[i + 1])
});
}
Brain.js позволяет создавать recurrent neural network (RNN), которая учитывает последовательность данных:
const brain = require('brain.js');
const net = new brain.recurrent.LSTM();
net.train(sequences, {
iterations: 2000,
log: true,
logPeriod: 100
});
RNN способна учитывать контекст предыдущих символов и прогнозировать последующие символы с высокой точностью. При работе с длинными текстами стоит регулировать длину последовательности и число нейронов, чтобы обеспечить баланс между качеством предсказаний и производительностью.
Для более сложной семантики текста используют векторные представления слов, где каждое слово кодируется как числовой вектор фиксированной длины. В Brain.js можно реализовать простое подобие embeddings через one-hot с последующим слоем скрытых нейронов, который обучается выявлять скрытые зависимости между словами.
После обучения можно использовать модель для:
Формат генерации текста с Brain.js:
const output = net.run('hel');
console.log(output); // прогноз следующего символа
Использование последовательностей и правильное представление текста обеспечивает эффективное обучение и высокую точность модели при работе с текстовыми данными в Brain.js.