Нужно ли мне предварительно токенизировать текст перед использованием HuggingFace's RobertaTokenizer? (Различное понимание)

Я смущаюсь, когда использую токенизатор Роберты в Huggingface.

>>> tokenizer = RobertaTokenizer.from_pretrained('roberta-base')
>>> x = tokenizer.tokenize("The tiger is ___ (big) than the dog.")
['The', 'Ġtiger', 'Ġis', 'Ġ___', 'Ġ(', 'big', ')', 'Ġthan', 'Ġthe', 'Ġdog', '.']
>>> x = tokenizer.tokenize("The tiger is ___ ( big ) than the dog.")
['The', 'Ġtiger', 'Ġis', 'Ġ___', 'Ġ(', 'Ġbig', 'Ġ)', 'Ġthan', 'Ġthe', 'Ġdog', '.']
>>> x = tokenizer.encode("The tiger is ___ (big) than the dog.")
[0, 20, 23921, 16, 2165, 36, 8527, 43, 87, 5, 2335, 4, 2]
>>> x = tokenizer.encode("The tiger is ___ ( big ) than the dog.")
[0, 20, 23921, 16, 2165, 36, 380, 4839, 87, 5, 2335, 4, 2]
>>>

Вопрос:(big) а также ( big )имеют разные результаты токенизации, что также приводит к другому идентификатору токена. Какой мне использовать? Означает ли это, что я должен предварительно токенизировать ввод, чтобы сделать его( big )и перейти на RobertaTokenization? Или это неважно?

Во-вторых, кажется BertTokenizer нет такой путаницы:

>>> tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
>>> x = tokenizer.tokenize("The tiger is ___ (big) than the dog.")
['the', 'tiger', 'is', '_', '_', '_', '(', 'big', ')', 'than', 'the', 'dog', '.']
>>> x = tokenizer.tokenize("The tiger is ___ ( big ) than the dog.")
['the', 'tiger', 'is', '_', '_', '_', '(', 'big', ')', 'than', 'the', 'dog', '.']
>>>

BertTokenizer дает те же результаты с использованием словесных слов.

Есть ли какие-либо мысли, которые помогут мне лучше понять RobertaTokenizer, который, как я знаю, использует кодирование пар байтов?

1 ответ

Решение

Трансформеры Hugingface спроектированы таким образом, что вам не нужно проводить предварительную токенизацию.

RoBERTa использует SentecePiece с предварительной токенизацией без потерь. То есть, когда у вас есть токенизированный текст, вы всегда должны иметь возможность сказать, как этот текст выглядел до токенизации. ВĠ (который , странное подчеркивание Unicode в исходном SentecePiece) говорит о том, что при детокенизации должен быть пробел. Как следствиеbig а также ▁bigоказываются разными токенами. Конечно, в данном конкретном контексте это не имеет особого смысла, потому что это, очевидно, все еще одно и то же слово, но это цена, которую вы платите за токенизацию без потерь, а также то, как был обучен RoBERTa.

BERT использует WordPiece, который не страдает этой проблемой. С другой стороны, отображение между исходной строкой и токенизированным текстом не так просто (что может быть неудобно, например, когда вы хотите выделить что-то в тексте, созданном пользователем).

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