Токенизация — процесс разбиения текста на отдельные элементы, называемые токенами. Токеном может быть слово, часть слова, символ или любой другой логически выделяемый элемент текста. В контексте нейронных сетей и библиотек вроде Keras.js токенизация необходима для подготовки текстовых данных к числовому представлению, которое можно подавать на вход модели.
В JavaScript токенизацию можно реализовать несколькими способами:
Разделение по пробелам и знакам препинания Самый простой метод — использование регулярных выражений для разделения текста на слова.
const text = "Пример токенизации текста в JavaScript.";
const tokens = text.toLowerCase().match(/\b\w+\b/g);
console.log(tokens); // ["пример", "токенизации", "текста", "в", "javascript"]Использование сторонних библиотек Существуют
библиотеки для более сложной токенизации, учитывающие морфологию языка и
специальные символы. Например, natural для английского или
wink-tokenizer.
Перед разбиением текста на токены часто выполняются следующие операции:
Пример реализации базовой очистки в Jav * aScript:
function cleanText(text) {
return text.toLowerCase()
.replace(/[^\w\s]/g, '') // удаление пунктуации
.replace(/\s+/g, ' ') // удаление лишних пробелов
.trim();
}
const cleaned = cleanText("Пример, текста для очистки!");
console.log(cleaned); // "пример текста для очистки"
Словарь (vocabulary) — это объект, в котором каждому уникальному токену сопоставлен числовой индекс. Этот индекс используется для представления текста в числовом виде при работе с Keras.js.
Создание словаря из массива токенов:
function buildVocabulary(tokens) {
const vocab = {};
let index = 1; // часто 0 зарезервирован для паддинга
tokens.forEach(token => {
if (!(token in vocab)) {
vocab[token] = index;
index++;
}
});
return vocab;
}
const tokens = ["пример", "текста", "пример", "для", "словаря"];
const vocabulary = buildVocabulary(tokens);
console.log(vocabulary);
// { "пример": 1, "текста": 2, "для": 3, "словаря": 4 }
Особенности построения словаря:
Паддинг и токен неизвестного слова (OOV) Для нейросетей необходимо зарезервировать индексы для отсутствующих токенов и для выравнивания последовательностей:
const PAD = 0; // пустой токен
const OOV = 1; // неизвестный токенЧастотная фильтрация Можно включать в словарь только N самых частых слов, чтобы уменьшить размер входных данных.
После построения словаря текст преобразуется в массив чисел. Этот массив пригоден для подачи на вход модели Keras.js.
function textToSequence(tokens, vocab, oovIndex = 1) {
return tokens.map(token => vocab[token] || oovIndex);
}
const sequence = textToSequence(["пример", "неизвестное", "текста"], vocabulary);
console.log(sequence); // [1, 1, 2]
Keras.js ожидает фиксированную длину входных последовательностей. Для этого используется padding:
function padSequence(seq, maxLength, padValue = 0) {
if (seq.length > maxLength) {
return seq.slice(0, maxLength);
}
while (seq.length < maxLength) {
seq.push(padValue);
}
return seq;
}
const padded = padSequence(sequence, 5);
console.log(padded); // [1, 1, 2, 0, 0]
Ключевые моменты работы с токенами и словарем:
После подготовки последовательностей они могут быть переданы в модель
Keras.js в виде Float32Array или обычного массива чисел.
Модель принимает последовательности на вход и возвращает прогнозы:
const inputData = new Float32Array(padded);
model.predict({ input_1: inputData }).then(output => {
console.log(output);
});
Формирование словаря, токенизация, очистка текста и подготовка последовательностей являются критически важными этапами предобработки данных. Эти шаги напрямую влияют на качество обучения и точность предсказаний модели.