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

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

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

В TensorFlow.js токенизация реализуется с использованием как стандартных инструментов JavaScript, так и специализированных библиотек, совместимых с tfjs, например @tensorflow-models/universal-sentence-encoder и tokenizers из Hugging Face (через WebAssembly).

Ключевые задачи токенизации:

  • Разделение текста на токены: слово или подслово.
  • Очистка текста: удаление лишних символов, приведение к единому регистру.
  • Преобразование токенов в числовые идентификаторы: создание словаря токенов (vocabulary).

Структура словаря

Словарь (vocabulary) — это объект, содержащий соответствие между токенами и уникальными идентификаторами. Формат обычно выглядит как объект или Map:

const vocabulary = {
  "hello": 1,
  "world": 2,
  "[UNK]": 0
};
  • [UNK] — специальный токен для неизвестных слов.
  • [PAD] — токен для дополнения последовательностей до одинаковой длины.
  • [CLS] и [SEP] — токены для обозначения начала и конца предложений в моделях трансформеров.

Использование словаря позволяет модели работать с числовыми данными вместо текстовых, что необходимо для работы с TensorFlow.js, поскольку тензоры поддерживают только числовые типы.

Примеры токенизации в JavaScript

1. Простая разметка словами

function simpleTokenizer(text) {
  return text
    .toLowerCase()
    .replace(/[^a-zA-Zа-яА-Я0-9 ]/g, '')
    .split(/\s+/);
}

const tokens = simpleTokenizer("Пример текста для токенизации!");
console.log(tokens); // ["пример", "текста", "для", "токенизации"]

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

const vocabulary = { "[UNK]": 0 };
let nextIndex = 1;

function tokensToIds(tokens) {
  return tokens.map(token => {
    if (!(token in vocabulary)) {
      vocabulary[token] = nextIndex++;
    }
    return vocabulary[token];
  });
}

const tokenIds = tokensToIds(tokens);
console.log(tokenIds); // [1, 2, 3, 4]
console.log(vocabulary); // { "[UNK]": 0, "пример": 1, "текста": 2, "для": 3, "токенизации": 4 }

Работа с последовательностями

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

  • Padding — добавление токенов [PAD] для выравнивания до заданной длины.
  • Truncating — обрезка последовательности, если она превышает максимальную длину.
function padSequence(seq, maxLength, padId = 0) {
  if (seq.length > maxLength) {
    return seq.slice(0, maxLength);
  }
  while (seq.length < maxLength) {
    seq.push(padId);
  }
  return seq;
}

const padded = padSequence(tokenIds, 6);
console.log(padded); // [1, 2, 3, 4, 0, 0]

Интеграция с TensorFlow.js

После токенизации и преобразования в числовые идентификаторы последовательности преобразуются в тензоры:

import * as tf from '@tensorflow/tfjs';

const tensor = tf.tensor([padded]);
console.log(tensor.shape); // [1, 6]

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

const texts = ["Пример текста", "Другой пример"];
const sequences = texts.map(t => padSequence(tokensToIds(simpleTokenizer(t)), 6));
const batchTensor = tf.tensor(sequences);
console.log(batchTensor.shape); // [2, 6]

Особенности токенизации для подслов

Современные модели NLP часто используют подсловные токенизаторы (BPE, WordPiece, SentencePiece). Преимущество подслов:

  • Меньше неизвестных токенов ([UNK]).
  • Возможность разбирать редкие или новые слова на известные фрагменты.
  • Более компактный словарь.

Пример использования подсловной токенизации с @tensorflow-models/universal-sentence-encoder:

import * as use from '@tensorflow-models/universal-sentence-encoder';

const model = await use.load();
const embeddings = await model.embed(["Пример текста"]);
embeddings.print();

Модель автоматически выполняет токенизацию, нормализацию и преобразование в векторное представление.

Управление словарём и токенизацией

В практических проектах:

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

Эффективная токенизация и грамотное построение словаря напрямую влияют на точность и производительность модели в TensorFlow.js.