Почему кодирование BPE, обученное на английском языке и примененное к бенгальскому языку, не возвращает неизвестные токены?

Я использую токенизатор roberta-base tokenizer = RobertaTokenizerFast.from_pretrained('roberta-base',add_prefix_space=True)обучены английским данным, чтобы токенизировать бенгальский язык, просто чтобы посмотреть, как он себя ведет. Когда я пытаюсь закодировать бенгальский иероглиф tokenizer.encode('বা') , Я получил [0, 1437, 35861, 11582, 35861, 4726, 2]это означает, что он находит в своем словаре некоторые токены, которые соответствуют бенгальским иероглифам, даже если тренируются на английском. При дальнейшем исследовании я обнаружил, что это все специальные символы. ['<s>', 'Ġ', 'à¦', '¬', 'à¦', '¾', '</s>']. У меня вопрос: почему это происходит, разве он не должен выводить неизвестные токены при применении на новом языке? Любая помощь очень ценится

1 ответ

Как упоминалось в комментариях, причина в том, что токенизатор RoBERTa основан на байтах, а не на символах.

В UTF-8 символы представлены разным количеством байтов, которое сильно искажено в сторону латинского алфавита: символы ASCII - однобайтовые, «самые длинные» символы - до четырех байтов. Пример из Википедии:

      Char | UTF code | Bytes
------------------------------
$    | U+0024   | 24
¢    | U+00A2   | C2 A2
ह    | U+0939   | E0 A4 B9
€    | U+20AC   | E2 82 AC
𐍈    | U+10348  | F0 90 8D 88

SentecePiece токенизатор используется Roberta , таким образом , первые сегменты текста в байтах, всегда возможно , и есть только 256 из них, так что ничто не каждый Oov. Затем известные группы байтов группируются в известные токены из словаря.

SentencePiece также обрабатывает пробелы и специальные символы. Во-первых, он сегментирует текст на специальные символы и пробелы и заменяет пробелы специальным символом. В исходной реализации это был специальный символ подчеркивания UTF-8. , в реализации Huggingface это так. Этот специальный символ также добавляется к самому началу предложения, поэтому слова последовательно представлены, когда они находятся в начале или в середине предложения.

Итак, результат, который вы видите в основном, таков:

  1. Перед каждой строкой ( ), а также
  2. Четыре байта, представляющие вашего персонажа,

что означает, что персонаж отсутствует в словаре, поэтому в конечном итоге он представлен как четыре байта, а байты всегда известны.

Другие вопросы по тегам