Huggingface Tokenizers
Быстрые токенизаторы, оптимизированные для исследований и продакшена. Реализация на Rust токенизирует 1 ГБ менее чем за 20 секунд. Поддерживает алгоритмы BPE, WordPiece и Unigram. Обучайте собственные словари, отслеживайте выравнивания, управляйте дополнением/усечением. Бесшовно интегрируется с transformers. Используйте, когда требуется высокопроизводительная токенизация или обучение собственного токенизатора.
Метаданные навыка
| Источник | Опционально — установка с помощью vibeos skills install official/mlops/huggingface-tokenizers |
| Путь | optional-skills/mlops/huggingface-tokenizers |
| Версия | 1.0.0 |
| Автор | Orchestra Research |
| Лицензия | MIT |
| Зависимости | tokenizers, transformers, datasets |
| Платформы | linux, macos, windows |
| Теги | Tokenization, HuggingFace, BPE, WordPiece, Unigram, Fast Tokenization, Rust, Custom Tokenizer, Alignment Tracking, Production |
Справочник: полный SKILL.md
Ниже приведено полное описание навыка, которое VibeOS загружает при его активации. Это те инструкции, которые видит агент, когда навык активен.
HuggingFace Tokenizers — Быстрая токенизация для NLP
Быстрые, готовые к продакшену токенизаторы с производительностью Rust и простотой использования Python.
Когда использовать HuggingFace Tokenizers
Используйте HuggingFace Tokenizers, когда:
- Требуется чрезвычайно быстрая токенизация (<20 с на ГБ текста)
- Необходимо обучить собственный токенизатор с нуля
- Нужно отслеживать выравнивание (токен → позиция в исходном тексте)
- Строите продакшен-пайплайны NLP
- Требуется эффективно токенизировать большие корпуса
Производительность:
- Скорость: <20 секунд на токенизацию 1 ГБ на CPU
- Реализация: Ядро на Rust с привязками к Python/Node.js
- Эффективность: в 10-100 раз быстрее чистых реализаций на Python
Используйте альтернативы вместо этого:
- SentencePiece: Языконезависимый, используется в T5/ALBERT
- tiktoken: Токенизатор BPE от OpenAI для моделей GPT
- transformers AutoTokenizer: Загрузка только предобученных (внутри использует эту библиотеку)
Быстрый старт
Установка
# Установка tokenizers
pip install tokenizers
# С интеграцией transformers
pip install tokenizers transformers
Загрузка предобученного токенизатора
from tokenizers import Tokenizer
# Загрузка из HuggingFace Hub
tokenizer = Tokenizer.from_pretrained("bert-base-uncased")
# Кодирование текста
output = tokenizer.encode("Hello, how are you?")
print(output.tokens) # ['hello', ',', 'how', 'are', 'you', '?']
print(output.ids) # [7592, 1010, 2129, 2024, 2017, 1029]
# Декодирование обратно
text = tokenizer.decode(output.ids)
print(text) # "hello, how are you?"
Обучение собственного токенизатора BPE
from tokenizers import Tokenizer
from tokenizers.models import BPE
from tokenizers.trainers import BpeTrainer
from tokenizers.pre_tokenizers import Whitespace
# Инициализация токенизатора с моделью BPE
tokenizer = Tokenizer(BPE(unk_token="[UNK]"))
tokenizer.pre_tokenizer = Whitespace()
# Настройка тренера
trainer = BpeTrainer(
vocab_size=30000,
special_tokens=["[UNK]", "[CLS]", "[SEP]", "[PAD]", "[MASK]"],
min_frequency=2
)
# Обучение на файлах
files = ["train.txt", "validation.txt"]
tokenizer.train(files, trainer)
# Сохранение
tokenizer.save("my-tokenizer.json")
Время обучения: ~1-2 минуты для корпуса 100 МБ, ~10-20 минут для 1 ГБ
Пакетное кодирование с дополнением
# Включение дополнения
tokenizer.enable_padding(pad_id=3, pad_token="[PAD]")
# Кодирование пакета
texts = ["Hello world", "This is a longer sentence"]
encodings = tokenizer.encode_batch(texts)
for encoding in encodings:
print(encoding.ids)
# [101, 7592, 2088, 102, 3, 3, 3]
# [101, 2023, 2003, 1037, 2936, 6251, 102]
Алгоритмы токенизации
BPE (Byte-Pair Encoding)
Как это работает:
- Начало с посимвольного словаря
- Поиск наиболее частой пары символов
- Слияние в новый токен, добавление в словарь
- Повтор до достижения нужного размера словаря
Используется в: GPT-2, GPT-3, RoBERTa, BART, DeBERTa
from tokenizers import Tokenizer
from tokenizers.models import BPE
from tokenizers.trainers import BpeTrainer
from tokenizers.pre_tokenizers import ByteLevel
tokenizer = Tokenizer(BPE(unk_token="<|endoftext|>"))
tokenizer.pre_tokenizer = ByteLevel()
trainer = BpeTrainer(
vocab_size=50257,
special_tokens=["<|endoftext|>"],
min_frequency=2
)
tokenizer.train(files=["data.txt"], trainer=trainer)
Преимущества:
- Хорошо обрабатывает неизвестные слова (разбивает на подслова)
- Гибкий размер словаря
- Подходит для морфологически богатых языков
Компромиссы:
- Токенизация зависит от порядка слияний
- Может неожиданно разбивать распространенные слова
WordPiece
Как это работает:
- Начало с посимвольного словаря
- Оценка пар для слияния:
frequency(pair) / (frequency(first) × frequency(second)) - Слияние пары с наивысшей оценкой
- Повтор до достижения нужного размера словаря
Используется в: BERT, DistilBERT, MobileBERT
from tokenizers import Tokenizer
from tokenizers.models import WordPiece
from tokenizers.trainers import WordPieceTrainer
from tokenizers.pre_tokenizers import Whitespace
from tokenizers.normalizers import BertNormalizer
tokenizer = Tokenizer(WordPiece(unk_token="[UNK]"))
tokenizer.normalizer = BertNormalizer(lowercase=True)
tokenizer.pre_tokenizer = Whitespace()
trainer = WordPieceTrainer(
vocab_size=30522,
special_tokens=["[UNK]", "[CLS]", "[SEP]", "[PAD]", "[MASK]"],
continuing_subword_prefix="##"
)
tokenizer.train(files=["corpus.txt"], trainer=trainer)
Преимущества:
- Приоритезирует осмысленные слияния (высокая оценка = семантическая связь)
- Успешно используется в BERT (передовые результаты)
Компромиссы:
- Неизвестные слова становятся
[UNK], если нет совпадения подслова - Сохраняет словарь, а не правила слияния (файлы большего размера)
Unigram
Как это работает:
- Начало с большого словаря (все подстроки)
- Вычисление потерь для корпуса с текущим словарем
- Удаление токенов с минимальным влиянием на потери
- Повтор до достижения нужного размера словаря
Используется в: ALBERT, T5, mBART, XLNet (через SentencePiece)
from tokenizers import Tokenizer
from tokenizers.models import Unigram
from tokenizers.trainers import UnigramTrainer
tokenizer = Tokenizer(Unigram())
trainer = UnigramTrainer(
vocab_size=8000,
special_tokens=["<unk>", "<s>", "</s>"],
unk_token="<unk>"
)
tokenizer.train(files=["data.txt"], trainer=trainer)
Преимущества:
- Вероятностный (находит наиболее вероятную токенизацию)
- Хорошо работает для языков без границ слов
- Обрабатывает разнообразные лингвистические контексты
Компромиссы:
- Вычислительно затратное обучение
- Больше гиперпараметров для настройки
Пайплайн токенизации
Полный пайплайн: Нормализация → Предтокенизация → Модель → Постобработка
Нормализация
Очистка и стандартизация текста:
from tokenizers.normalizers import NFD, StripAccents, Lowercase, Sequence
tokenizer.normalizer = Sequence([
NFD(), # Нормализация Unicode (разложение)
Lowercase(), # Преобразование в нижний регистр
StripAccents() # Удаление диакритических знаков
])
# Вход: "Héllo WORLD"
# После нормализации: "hello world"
Распространенные нормализаторы:
NFD,NFC,NFKD,NFKC— Формы нормализации UnicodeLowercase()— Преобразование в нижний регистрStripAccents()— Удаление диакритических знаков (é → e)Strip()— Удаление пробеловReplace(pattern, content)— Замена по регулярному выражению
Предтокенизация
Разбиение текста на словообразные единицы:
from tokenizers.pre_tokenizers import Whitespace, Punctuation, Sequence, ByteLevel
# Разбиение по пробелам и пунктуации
tokenizer.pre_tokenizer = Sequence([
Whitespace(),
Punctuation()
])
# Вход: "Hello, world!"
# После предтокенизации: ["Hello", ",", "world", "!"]
Распространенные предтокенизаторы:
Whitespace()— Разбиение по пробелам, табуляциям, переводам строкByteLevel()— Побайтовое разбиение в стиле GPT-2Punctuation()— Изоляция пунктуацииDigits(individual_digits=True)— Разбиение цифр по отдельностиMetaspace()— Замена пробелов на ▁ (в стиле SentencePiece)
Постобработка
Добавление специальных токенов для входа модели:
from tokenizers.processors import TemplateProcessing
# Стиль BERT: [CLS] предложение [SEP]
tokenizer.post_processor = TemplateProcessing(
single="[CLS] $A [SEP]",
pair="[CLS] $A [SEP] $B [SEP]",
special_tokens=[
("[CLS]", 1),
("[SEP]", 2),
],
)
Распространенные шаблоны:
# GPT-2: предложение <|endoftext|>
TemplateProcessing(
single="$A <|endoftext|>",
special_tokens=[("<|endoftext|>", 50256)]
)
# RoBERTa: <s> предложение </s>
TemplateProcessing(
single="<s> $A </s>",
pair="<s> $A </s> </s> $B </s>",
special_tokens=[("<s>", 0), ("</s>", 2)]
)
Отслеживание выравнивания
Отслеживание позиций токенов в исходном тексте:
output = tokenizer.encode("Hello, world!")
# Получение смещений токенов
for token, offset in zip(output.tokens, output.offsets):
start, end = offset
print(f"{token:10} → [{start:2}, {end:2}): {text[start:end]!r}")
# Вывод:
# hello → [ 0, 5): 'Hello'
# , → [ 5, 6): ','
# world → [ 7, 12): 'world'
# ! → [12, 13): '!'
Сценарии использования:
- Распознавание именованных сущностей (сопоставление предсказаний с текстом)
- Ответы на вопросы (извлечение фрагментов ответа)
- Классификация токенов (выравнивание меток с исходными позициями)
Интеграция с transformers
Загрузка с AutoTokenizer
from transformers import AutoTokenizer
# AutoTokenizer автоматически использует быстрые токенизаторы
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
# Проверка, используется ли быстрый токенизатор
print(tokenizer.is_fast) # True
# Доступ к базовому tokenizers.Tokenizer
fast_tokenizer = tokenizer.backend_tokenizer
print(type(fast_tokenizer)) # <class 'tokenizers.Tokenizer'>
Преобразование пользовательского токенизатора для transformers
from tokenizers import Tokenizer
from transformers import PreTrainedTokenizerFast
# Обучение пользовательского токенизатора
tokenizer = Tokenizer(BPE())
# ... обучение токенизатора ...
tokenizer.save("my-tokenizer.json")
# Обертка для transformers
transformers_tokenizer = PreTrainedTokenizerFast(
tokenizer_file="my-tokenizer.json",
unk_token="[UNK]",
pad_token="[PAD]",
cls_token="[CLS]",
sep_token="[SEP]",
mask_token="[MASK]"
)
# Использование как любого токенизатора transformers
outputs = transformers_tokenizer(
"Hello world",
padding=True,
truncation=True,
max_length=512,
return_tensors="pt"
)
Распространенные шаблоны
Обучение из итератора (большие наборы данных)
from datasets import load_dataset
# Загрузка набора данных
dataset = load_dataset("wikitext", "wikitext-103-raw-v1", split="train")
# Создание пакетного итератора
def batch_iterator(batch_size=1000):
for i in range(0, len(dataset), batch_size):
yield dataset[i:i + batch_size]["text"]
# Обучение токенизатора
tokenizer.train_from_iterator(
batch_iterator(),
trainer=trainer,
length=len(dataset) # Для индикатора прогресса
)
Производительность: Обрабатывает 1 ГБ за ~10-20 минут
Включение усечения и дополнения
# Включение усечения
tokenizer.enable_truncation(max_length=512)
# Включение дополнения
tokenizer.enable_padding(
pad_id=tokenizer.token_to_id("[PAD]"),
pad_token="[PAD]",
length=512 # Фиксированная длина или None для максимума в пакете
)
# Кодирование с обоими
output = tokenizer.encode("This is a long sentence that will be truncated...")
print(len(output.ids)) # 512
Многопроцессорная обработка
from tokenizers import Tokenizer
from multiprocessing import Pool
# Загрузка токенизатора
tokenizer = Tokenizer.from_file("tokenizer.json")
def encode_batch(texts):
return tokenizer.encode_batch(texts)
# Параллельная обработка большого корпуса
with Pool(8) as pool:
# Разбиение корпуса на части
chunk_size = 1000
chunks = [corpus[i:i+chunk_size] for i in range(0, len(corpus), chunk_size)]
# Параллельное кодирование
results = pool.map(encode_batch, chunks)
Ускорение: в 5-8 раз на 8 ядрах
Бенчмарки производительности
Скорость обучения
| Размер корпуса | BPE (словарь 30k) | WordPiece (30k) | Unigram (8k) |
|---|---|---|---|
| 10 МБ | 15 сек | 18 сек | 25 сек |
| 100 МБ | 1.5 мин | 2 мин | 4 мин |
| 1 ГБ | 15 мин | 20 мин | 40 мин |
Оборудование: 16-ядерный CPU, тестирование на английской Wikipedia
Скорость токенизации
| Реализация | Корпус 1 ГБ | Пропускная способность |
|---|---|---|
| Чистый Python | ~20 минут | ~50 МБ/мин |
| HF Tokenizers | ~15 секунд | ~4 ГБ/мин |
| Ускорение | 80× | 80× |
Тест: Английский текст, средняя длина предложения 20 слов
Использование памяти
| Задача | Память |
|---|---|
| Загрузка токенизатора | ~10 МБ |
| Обучение BPE (словарь 30k) | ~200 МБ |
| Кодирование 1M предложений | ~500 МБ |
Поддерживаемые модели
Предобученные токенизаторы доступны через from_pretrained():
Семейство BERT:
bert-base-uncased,bert-large-caseddistilbert-base-uncasedroberta-base,roberta-large
Семейство GPT:
gpt2,gpt2-medium,gpt2-largedistilgpt2
Семейство T5:
t5-small,t5-base,t5-largegoogle/flan-t5-xxl
Другие:
facebook/bart-base,facebook/mbart-large-cc25albert-base-v2,albert-xlarge-v2xlm-roberta-base,xlm-roberta-large
Просмотр всех: https://huggingface.co/models?library=tokenizers
Ссылки
Руководство по обучению— Обучение пользовательских токенизаторов, настройка тренеров, работа с большими наборами данныхГлубокое погружение в алгоритмы— BPE, WordPiece, Unigram с подробным объяснениемКомпоненты пайплайна— Нормализаторы, предтокенизаторы, постпроцессоры, декодерыИнтеграция с transformers— AutoTokenizer, PreTrainedTokenizerFast, специальные токены
Ресурсы
- Документация: https://huggingface.co/docs/tokenizers
- GitHub: https://github.com/huggingface/tokenizers ⭐ 9,000+
- Версия: 0.20.0+
- Курс: https://huggingface.co/learn/nlp-course/chapter6/1
- Статьи: BPE (Sennrich et al., 2016), WordPiece (Schuster & Nakajima, 2012)