Токенизация и словарь

Основы токенизации

Токенизация — процесс преобразования текстовых данных в отдельные элементы, которые могут быть обработаны нейронной сетью. В контексте Brain.js токены обычно представляют собой слова, символы или подстроки фиксированной длины (n-grams). Правильная токенизация критически важна для обучения сети, так как она напрямую влияет на качество распознавания паттернов и генерации текста.

В Brain.js входные данные для текстовой сети должны быть представлены в числовой форме. Для этого каждый токен кодируется в виде вектора чисел, обычно бинарного или с плавающей точкой, где каждый элемент вектора соответствует наличию или частоте токена.

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

Словарь — это структура, сопоставляющая каждому уникальному токену числовой идентификатор или вектор. В Brain.js словарь используется для двух задач:

  1. Преобразование текста в обучающие примеры.
  2. Преобразование выхода сети обратно в текст.

Этапы построения словаря:

  1. Сбор токенов: перебор всех текстов из корпуса и выделение уникальных токенов.
  2. Присвоение идентификаторов: каждому токену назначается индекс или код в бинарном/one-hot представлении.
  3. Создание структуры хранения: обычно используется объект или Map, где ключ — токен, значение — его индекс.

Пример структуры словаря для сети с символами:

const tokens = ['a', 'b', 'c', 'd'];
const dictionary = {};
tokens.forEach((token, index) => {
  dictionary[token] = index;
});

One-hot кодирование

One-hot кодирование — базовый способ представления токенов для Brain.js. Для каждого токена создается вектор длиной N, где N — количество уникальных токенов. Вектор состоит из нулей, за исключением позиции, соответствующей токену, где стоит единица.

Пример one-hot вектора для токена 'b' из словаря ['a','b','c','d']:

[0, 1, 0, 0]

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

Использование токенизации в сетях Brain.js

Brain.js предоставляет классы NeuralNetwork и recurrent.LSTM для работы с текстом. Входные данные для обучения должны быть заранее токенизированы и преобразованы в числовую форму:

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

const trainingData = [
  { input: 'hello', output: 'world' },
  { input: 'hi', output: 'there' }
];

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

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

Подходы к токенизации

  1. Символьная токенизация: каждый символ является токеном. Подходит для генерации текста на уровне букв, работы с неизвестными словами или создания языковых моделей с минимальной предобработкой.
  2. Словесная токенизация: токены — это слова. Используется для анализа текста и предсказания следующего слова. Требует предварительной очистки текста.
  3. N-граммы: токены — последовательности из N символов или слов. Эффективны для обнаружения паттернов в словах и фразах, могут уменьшить потери контекста при обучении коротких последовательностей.

Обработка редких и неизвестных токенов

При построении словаря часто встречаются токены, встречающиеся лишь один раз или не встречающиеся в обучающих данных. Для них обычно создается специальный токен <UNK> (unknown). Все неизвестные элементы текста заменяются на этот токен, что предотвращает ошибки на этапе предсказания.

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

  • Минимизация словаря: объединение синонимов и приведение к нормальной форме уменьшает размер словаря и ускоряет обучение.
  • Очистка текста: удаление лишних символов, нормализация регистров и токенизация по смысловым единицам повышают точность сети.
  • Балансировка данных: равномерное распределение токенов в обучающих примерах предотвращает смещение сети в сторону часто встречающихся токенов.

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