Перейти к основному содержимому

Токенизация текста

Введение в токенизацию

При компьютерной обработке естественного языка сырой текст невозможно напрямую подать в математическую модель. Текст необходимо предварительно токенизировать — разбить на последовательность минимальных смысловых единиц, которые называются токенами (tokens). Этот процесс можно выразить следующей записью:

textt1t2tN\text{text} \to t_1 t_2 \dots t_N

где tit_i — это отдельный токен, а NN — общее число токенов в последовательности.

Однако нейросети не умеют работать с символьными строками. Поэтому каждый полученный токен tit_i заменяется на соответствующий ему эмбеддинг (embedding) — вектор вещественных чисел фиксированной размерности DD:

tieiRDt_i \to \mathbf{e}_i \in \mathbb{R}^D

После этого последовательность векторов-эмбеддингов передаётся на вход прогнозирующей модели ff, которая осуществляет целевое предсказание y^\hat{y}, такое как класс текста, следующий токен и т.д.:

f(e1,e2,,eN)=y^f(\mathbf{e}_1, \mathbf{e}_2, \dots, \mathbf{e}_N) = \hat{y}
Откуда берутся значения вектора эмбеддингов для каждого токена?

Существует три основных подхода к формированию векторных представлений токенов:

  1. Фиксированное one-hot кодирование: вектор состоит из нулей и одной единицы на позиции, соответствующей индексу токена в словаре. Получаемая размерность вектора будет совпадать с числом уникальных кодируемых сущностей, поэтому он применим лишь для токенизации текста на уровне символов, число которых невелико. Отметим также, что векторы получаются ортогональными и не несут информации о семантической близости кодируемых сущностей.
  2. Настраиваемые вместе с параметрами модели: векторы инициализируются случайным образом и обучаются совместно с весами самой сети под конкретную задачу.
  3. Предобученные (Transfer Learning): векторы берутся из уже обученных на огромных корпусах текстов моделей (например, Word2Vec, GloVe или извлекаются из скрытых слоев современных LLM). Это позволяет сразу наделить модель знаниями о семантике слов.

Простейшие виды токенизации

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

Пословная токенизация (Word-level)

При данном подходе текст разбивается строго на слова и знаки препинания.

Пример разбиения: Playing games. \to [Playing] [games] [.]

Преимущества:

  • Компактное представление текста: последовательность получается короткой.
  • Быстрая обработка: меньше токенов означает меньшее количество вычислений при проходе через модель.
  • Улучшенное понимание контекста: моделям легче устанавливать смысловые зависимости между словами, а ширина доступного контекста (измеряемая в токенах) охватывает больше реального текста.

Недостатки:

  • Проблема новых слов (Out-Of-Vocabulary, OOV): если модель при обучении не видела новое слово, она не будет знать, какой вектор ему сопоставить.

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

Посимвольная токенизация (Character-level)

Здесь минимальной единицей выступает каждый отдельный символ (включая пробелы).

Пример разбиения: Playing games. \to [P] [l] [a] [y] [i] [n] [g] [ ] [g] [a] [m] [e] [s] [.]

Преимущества:

  • Очень малый словарь: достаточно хранить только алфавит, цифры и спецсимволы.
  • Отсутствие проблемы OOV: любое новое слово можно собрать из известных букв.

Недостатки:

  • Последовательность токенов получается слишком длинной, что сильно замедляет инференс и обучение.
  • Модели тяжело улавливать долгосрочные зависимости, так как смысл «размазан» по множеству мелких токенов.
  • Текст кодируется большим числом токенов, что уменьшает эффективный контекст, который модель учитывает в работе.

Современный подход: подсловная токенизация

Чтобы объединить достоинства пословного и посимвольного подходов (и избавиться от их недостатков), в современных моделях машинного обучения применяется токенизация на уровне подслов (subword tokenization).

Суть подхода заключается в том, что текст делится на часто встречающиеся фрагменты (подслова или слоги). Частотные слова остаются целыми, а редкие — разбиваются на более мелкие, но осмысленные части.

Пример разбиения: Playing games. \to [Play] [ing] [ ] [game] [s] [.]

Ключевые преимущества подсловной токенизации
  1. Существенное уменьшение словаря при сохранении высокой выразительности. Это особенно важно для морфологически богатых языков (русский, немецкий, финский).
  2. Высокая скорость обработки, так как токены остаются достаточно крупными по сравнению с символами.
  3. Эффективная обработка новых (OOV) слов. Если модель никогда не видела слово playing, но видела play и окончания ing (например, в словах working, running), она сможет составить векторное представление нового слова из известных ей частей.
  4. Способность генерировать новые слова. Генерируя текст токен за токеном, модель сможет генерировать новые слова, отсутствовавшие в обучающей выборке, склоняя известные ей корни.

Алгоритмы токенизации для LLM

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

BPE

Алгоритм BPE (Byte-Pair Encoding, [1]) пришёл в NLP из алгоритмов сжатия данных. Он стартует от отдельных символов текста. На каждой итерации алгоритм ищет пару соседних токенов, которая чаще всего встречается вместе в обучающем корпусе, и объединяет их в новый, единый токен. Процесс повторяется до достижения заданного размера словаря. Алгоритм применялся в архитектуре классического трансформера (Attention Is All You Need) и модели GPT-1.

Byte-level BPE (BBPE)

BBPE [2] - развитие алгоритма BPE, которое решает проблему огромного количества символов в Unicode. Алгоритм стартует не от символов алфавита, а от отдельных байтов. Это позволяет создать компактный базовый словарь (256 значений), который полностью покрывает абсолютно любой текст, включая редкие иероглифы, новые эмодзи и технические символы. Данный подход является де-факто стандартом и используется в моделях GPT-2, GPT-3, RoBERTa, LLaMA, DeepSeek V3.

WordPiece

Алгоритм WordPiece [3] концептуально похож на BPE — он также стартует от базовых символов и итеративно объединяет их. Однако критерий объединения иной. WordPiece объединяет те фрагменты, которые совстречаются неслучайно часто. На каждом шаге алгоритм выбирает ту пару токенов, слияние которых приведет к максимальному увеличению правдоподобия (вероятности) всего обучающего корпуса. Именно WordPiece используется в семействе моделей BERT, ALBERT, DistilBERT.

SentencePiece

SentencePiece [4] представляет собой полноценный end-to-end токенизатор, поскольку он работает над исходным текстом, не требуя предварительного разбиения на слова (pre-tokenization). Он рассматривает пробел как обычный символ (часто обозначаемый как _).

  • Это крайне удобно для языков, где пробелы не используются (например, японский и китайский).

  • SentencePiece включает в себя поддержку неоднозначности токенизации через алгоритм Unigram, что позволяет на лету генерировать разные варианты разбиения одного и того же слова, делая модель устойчивой к опечаткам и нетипичным формам слов.

    Для повышения устойчивости BPE к опечаткам можно использовать подход BPE-Dropout [5].

SentencePiece применяется в таких моделях, как T5 и ALBERT.

Нормализация текста

Нормализация — это важнейший этап препроцессинга, который применяется до токенизации. Его цель — привести текст к единообразному виду, удалив шум и лишнюю вариативность.

Основные шаги нормализации могут включать:

  • Приведение к нижнему регистру (заглавные буквы \to строчные): Apple, APPLE \to apple.
  • Удаление или унификация акцентов и диакритических знаков: ёлка \to елка, café \to cafe.
  • Обработка пробельных символов: замена табуляций и переносов строк на обычные пробелы, сворачивание нескольких подряд идущих пробелов в один.
  • Удаление системных и невидимых символов (например, символа конца файла или управляющих символов Unicode).
  • Разбиение текста на слова в случае использования алгоритмов вроде классического BPE или WordPiece.
Когда нормализация может навредить?

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

  1. Сохранение регистра и пробелов критически важно, если модель должна уметь писать программный код (где важны отступы, а строчные буквы не эквивалентны заглавным) или улавливать эмоции в тексте (например, я очень рад и я ОЧЕНЬ рад).
  2. Сохранение акцентов и пунктуации повышает понимание моделью авторского стиля, сарказма и интонаций.

Большинство современных LLM (на базе Byte-level BPE) минимизируют этап нормализации, предпочитая передавать текст в модель «как есть», чтобы нейросеть сама выучила смысловую разницу между различными написаниями.

Специальные токены

Помимо фрагментов слов, словари токенизаторов всегда содержат зарезервированные служебные токены. Они нужны для управления поведением модели:

  • [UNK] (unknown): используется для замены символов или слов, которых нет в словаре. В Byte-level BPE он не нужен.
  • [BOS] / [EOS] (begin/end of sequence): указывают модели на начало и конец обрабатываемого текста.
  • [PAD] (padding): используется для выравнивания длин последовательностей в минибатче. Эти токены обычно игнорируются моделью за счет маскированного внимания (masked attention).
  • [MASK]: используется в моделях типа BERT для задачи маскированного языкового моделирования (MLM), когда модель должна предсказать промежуточные слова текста.

Регуляризация через подслова (Subword Regularization)

Как заставить модель быть более устойчивой к опечаткам? Если мы всегда разбиваем слово hello как hel + lo, модель переобучается на этот паттерн. Методы вроде BPE-Dropout и вероятностного сэмплирования Unigram позволяют во время обучения случайным образом разбивать слово по-разному (например, h + ello, he + llo). Таким образом, модель видит разные репрезентации одного и того же слова, что \uparrow улучшает её обобщающую способность на зашумленных данных.

Выбор размера словаря

В любом токенизаторе нужно зафиксировать размер словаря, который обычно выбирается в диапазоне V[30.000,100.000]V \in [30.000, 100.000].

При увеличении VV токены становятся длиннее и ближе к целым словам, что ускоряет обработку текста и увеличивает эффективный контекст модели.

Однако увеличение VV увеличивает размер модели (поскольку эмбеддинги новых слов нужно хранить) и усложняет настройку модели. Если нейросеть генерирует текст токен за токеном, то увеличивается и размерность выхода сети.


В последующих главах мы подробно разберём работу токенизаторов BPE, BBPE, WordPiece и SentencePiece.

Литература

  1. Sennrich R., Haddow B., Birch A. Neural machine translation of rare words with subword units. – Proceedings of the 54th Annual Meeting of the Association for Computational Linguistics. – 2016.
  2. Radford A., Wu J., Child R., Luan D., Amodei D., Sutskever I. Language models are unsupervised multitask learners. – OpenAI blog. – 2019.
  3. Schuster M., Nakajima K. Japanese and korean voice search. – 2012 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP). – 2012.
  4. Kudo T., Richardson J. Sentencepiece: A simple and language independent subword tokenizer and detokenizer for neural text processing. – Empirical Methods in Natural Language Processing. – 2018.
  5. Provilkov I., Emelianenko D., Voita E. BPE-dropout: Simple and effective subword regularization //Proceedings of the 58th Annual Meeting of the Association for Computational Linguistics. – 2020. – С. 1882-1892.