Токенизация
Модель не видит буквы — она работает с числами. Превращает текст в числа токенизатор.
Токены
from transformers import AutoTokenizer
tok = AutoTokenizer.from_pretrained("DeepPavlov/rubert-base-cased")
tok.tokenize("Очень скучный фильм!")
# ['Очень', 'ску', '##чный', 'фильм', '!']
tok("Очень скучный фильм!")
# {'input_ids': [101, 15292, …, 102], 'token_type_ids': [...], 'attention_mask': [1, 1, …]}
- текст режется на токены — слова и кусочки слов из словаря модели (обычно 30–50 тысяч штук).
##значит «продолжение предыдущего токена»; - незнакомый кусочек становится
[UNK]— модель о нём ничего не знает; - каждый токен заменяется своим номером в словаре — это
input_ids; - у BERT в начале стоит
[CLS], в конце —[SEP].
Токенизатор всегда берут от той же модели (AutoTokenizer.from_pretrained(имя)) — у каждой модели свой словарь. В задачах курса токенизатор — настоящий BertTokenizer с маленьким словарём.
Пакеты, padding и маска
Модели удобнее обрабатывать тексты пакетом, но тексты разной длины, а тензор должен быть прямоугольным:
enc = tok(["очень плохой фильм", "отличный фильм"], padding=True, truncation=True, max_length=512, return_tensors="pt")
enc["input_ids"] # короткий текст дополнен [PAD] (номер 0)
enc["attention_mask"] # 1 — настоящий токен, 0 — заполнитель
padding=True— дополнить до самого длинного текста в пакете ("max_length"— всегда доmax_length);truncation=True, max_length=…— обрезать слишком длинные: у моделей есть предел (у BERT — 512 токенов).[SEP]при обрезке остаётся в конце;return_tensors="pt"— вернуть тензоры PyTorch, готовые для модели.
Обратно в текст
tok.decode(ids, skip_special_tokens=True) # 'очень скучный фильм!'
tok.convert_ids_to_tokens(ids) # ['[CLS]', 'очень', 'скуч', '##ный', …]
decode склеивает кусочки слов, а skip_special_tokens=True убирает [CLS], [SEP] и [PAD].
Итог
AutoTokenizer.from_pretrained— токенизатор той же модели;tokenize,input_ids,##-кусочки,[UNK],[CLS]/[SEP];padding,truncation,max_length,attention_mask;decode(…, skip_special_tokens=True).