Оглавление

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

Что такое токенизация и почему она существует?

Языковые модели не могут работать с сырым текстом (так же как и с сырым аудио или целыми изображениями). Текст необходимо дискретизировать в единицы, которые модель знает — элементы её словаря. Независимо от того, являются ли эти единицы целыми словами, словосочетаниями, отдельными битами, пикселями, аудиосегментами и т.д., сегментация текста на дискретные единицы и есть определение токенизации. Независимо от того, как вы делите входные данные, вы занимаетесь токенизацией.

Эволюция подходов к токенизации

Традиционно вычислительные лингвисты часто сегментировали текст на слова, поскольку слова были атомарными единицами анализа для таких задач, как синтаксический разбор. Однако слова — сложная концепция. Лингвисты не могут договориться об определении слова.

Для английского языка простой операционализацией является любая орфографическая единица, разделённая пробелами (иногда называемая орфографическими словами). В английском, безусловно, есть крайние случаи, но этот подход будет работать достаточно хорошо. При таком подходе словарь состоит из орфографических слов. Это означает, что ваш словарь должен быть довольно большим. В английском языке есть как минимум миллион слов, в зависимости от того, как считать. (И действительно, word2vec, который использовал пробелы для определения токенов, изначально включал эмбеддинги для 1,4 млн слов). Однако такой размер словаря нежизнеспособен для современных больших моделей.

Проблемы словоуровневой токенизации

  • Проблема OOV (out-of-vocabulary) при использовании только 50 000–100 000 самых частых слов
  • Ошибки правописания и нестандартное написание (langauge вместо language)
  • Новые слова, заимствованные из других языков (arrancini, bibimbap, sriracha)
  • Неологизмы и словоформы (skibidi, delulu)
  • Языки с богатой морфологией (турецкий — до миллиона форм одного глагола)
  • Языки без пробелов (китайский, тайский)

Альтернативные подходы

Некоторые предлагали использовать морфемы в качестве токенов. Это даёт преимущество создания всех возможных словоформ с уменьшенным словарём. Вместо того чтобы иметь «walk», «walking», «walks», «walked» и т.д. в вашем словаре, вы могли бы иметь записи для основ типа «walk» и «listen» и записи для грамматических маркеров типа «ing», «s», «ed». Это было бы особенно полезно для таких языков, как турецкий, где многие грамматические маркеры могут комбинироваться для получения очень специфических словоформ.

Все «токенизатор-фри» подходы на самом деле просто другие формы токенизации. Байтовые и символьные методы — это просто крайние случаи того же самого процесса сегментации. Вместо поиска волшебной пули стоит признать: любая дискретизация входных данных — это токенизация, и вопрос лишь в том, насколько эффективно она работает для конкретной задачи.

Субсловная токенизация — современный стандарт

Субсловные токенизаторы изучают словарь фиксированного размера. Токены могут быть отдельными UTF-8 байтами, символами Unicode, целыми словами или частями слов. Очень частые формы, такие как «walking», могут храниться как один токен, но другие слова могут кодироваться несколькими токенами: «disadvantaging» → [«dis», «advantag», «ing»] или [«disad», «van», «taging»]. Даже с небольшим размером словаря у вас никогда не возникнет проблема OOV, потому что в худшем случае он сегментирует текст на отдельные байты или символы.

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

Байтовые и символьные подходы

Что если использовать символы вместо слов? Преимущество в том, что это может работать для любого языка при условии использования правильного набора символов. Проблема в том, что существует более 150 000 символов Unicode, что приведёт к довольно большому размеру словаря. И есть другая проблема: наши последовательности будут очень длинными. Слово «walking» будет представлено семью токенами на уровне символов, тогда как субсловные токенизаторы обычно токенизируют это слово как один или два токена.

Ещё более детализированным подходом является использование UTF-8 байтов в качестве токенов. Байты — это последовательности из восьми битов (1 и 0), которые могут использоваться для представления символов. Это приведёт к той же последовательности…

По материалам Hugging Face.