Тема 3 из 6

Токенизация

Модель не видит буквы — она работает с числами. Превращает текст в числа токенизатор.

Токены

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).