Токенизация — это процесс разбиения текста на более мелкие единицы, называемые токенами. В контексте машинного обучения и обработки естественного языка (NLP) токены могут представлять собой слова, подслова, символы или даже байты. Для работы с текстом в TensorFlow.js токенизация является обязательным этапом подготовки данных перед обучением моделей или их использованием для предсказаний.
В TensorFlow.js токенизация реализуется с использованием как
стандартных инструментов JavaScript, так и специализированных библиотек,
совместимых с tfjs, например
@tensorflow-models/universal-sentence-encoder и
tokenizers из Hugging Face (через WebAssembly).
Ключевые задачи токенизации:
Словарь (vocabulary) — это объект, содержащий соответствие между токенами и уникальными идентификаторами. Формат обычно выглядит как объект или Map:
const vocabulary = {
"hello": 1,
"world": 2,
"[UNK]": 0
};
Использование словаря позволяет модели работать с числовыми данными вместо текстовых, что необходимо для работы с TensorFlow.js, поскольку тензоры поддерживают только числовые типы.
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 }
Для подачи данных в модель часто требуется фиксированная длина последовательности. Используются два подхода:
[PAD] для
выравнивания до заданной длины.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]
После токенизации и преобразования в числовые идентификаторы последовательности преобразуются в тензоры:
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.