Они должны давать одинаковый результат, когда вы используете один и тот же словарь (в вашем примере вы использовали bert-base-uncased-vocab.txt и bert-base-cased-vocab.txt). Основное отличие состоит в том, что токенизаторы из пакета tokenizers работают быстрее, чем токенизаторы из transformers , потому что они реализованы в Rust.
Когда вы изменяете свой пример, вы будете посмотрите, что они создают одинаковые ids
и другие атрибуты (объект кодирования), в то время как токенизатор трансформаторов создал только список ids
:
from tokenizers import BertWordPieceTokenizer
sequence = "Hello, y'all! How are you Tokenizer ? ?"
tokenizerBW = BertWordPieceTokenizer("/content/bert-base-uncased-vocab.txt")
tokenized_sequenceBW = tokenizerBW.encode(sequence)
print(tokenized_sequenceBW)
print(type(tokenized_sequenceBW))
print(tokenized_sequenceBW.ids)
Вывод:
Encoding(num_tokens=15, attributes=[ids, type_ids, tokens, offsets, attention_mask, special_tokens_mask, overflowing])
<class 'Encoding'>
[101, 7592, 1010, 1061, 1005, 2035, 999, 2129, 2024, 2017, 19204, 17629, 100, 1029, 102]
from transformers import BertTokenizer
tokenizerBT = BertTokenizer("/content/bert-base-uncased-vocab.txt")
tokenized_sequenceBT = tokenizerBT.encode(sequence)
print(tokenized_sequenceBT)
print(type(tokenized_sequenceBT))
Вывод:
[101, 7592, 1010, 1061, 1005, 2035, 999, 2129, 2024, 2017, 19204, 17629, 100, 1029, 102]
<class 'list'>
В комментариях вы упомянули, что ваши вопросы больше касаются того, почему получаемый результат отличается. Насколько я могу судить, это было дизайнерское решение, принятое разработчиками, и для этого нет конкретной c причины. Также нельзя сказать, что BertWordPieceTokenizer из токенизаторов является заменой BertTokenizer из трансформаторов . Они по-прежнему используют оболочку, чтобы сделать ее совместимой с API токенизатора transformers . Существует класс BertTokenizerFast , который имеет метод «очистки» _convert_encoding , чтобы сделать BertWordPieceTokenizer полностью совместимым. Поэтому вам нужно сравнить приведенный выше пример BertTokenizer со следующим:
from transformers import BertTokenizerFast
sequence = "Hello, y'all! How are you Tokenizer ? ?"
tokenizerBW = BertTokenizerFast.from_pretrained("bert-base-uncased")
tokenized_sequenceBW = tokenizerBW.encode(sequence)
print(tokenized_sequenceBW)
print(type(tokenized_sequenceBW))
Вывод:
[101, 7592, 1010, 1061, 1005, 2035, 999, 2129, 2024, 2017, 19204, 17629, 100, 1029, 102]
<class 'list'>
С моей точки зрения, они создали библиотеку токенизаторов независимо от трансформаторов библиотеки с целью быть быстрыми и полезными.