Почему кодирование 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.
Итак, результат, который вы видите в основном, таков:
- Перед каждой строкой (
), а также - Четыре байта, представляющие вашего персонажа,
что означает, что персонаж