Saya memiliki potongan kode berikut dan mencoba memahami perbedaan antara BertWordPieceTokenizer dan BertTokenizer.

BertWordPieceTokenizer (Berbasis karat)

from tokenizers import BertWordPieceTokenizer

sequence = "Hello, y'all! How are you Tokenizer 😁 ?"
tokenizer = BertWordPieceTokenizer("bert-base-uncased-vocab.txt")
tokenized_sequence = tokenizer.encode(sequence)
print(tokenized_sequence)
>>>Encoding(num_tokens=15, attributes=[ids, type_ids, tokens, offsets, attention_mask, special_tokens_mask, overflowing])

print(tokenized_sequence.tokens)
>>>['[CLS]', 'hello', ',', 'y', "'", 'all', '!', 'how', 'are', 'you', 'token', '##izer', '[UNK]', '?', '[SEP]']

BertTokenizer

from transformers import BertTokenizer
tokenizer = BertTokenizer("bert-base-cased-vocab.txt")
tokenized_sequence = tokenizer.encode(sequence)
print(tokenized_sequence)
#Output: [19082, 117, 194, 112, 1155, 106, 1293, 1132, 1128, 22559, 17260, 100, 136]
  1. Mengapa encode bekerja secara berbeda di keduanya? Di BertWordPieceTokenizer memberikan objek Encoding sementara di BertTokenizer memberikan id vocab.
  2. Apa Perbedaan antara BertWordPieceTokenizer dan BertTokenizer pada dasarnya, karena seperti yang saya pahami BertTokenizer juga menggunakan WordPiece di bawah tenda.

Terima kasih

4
HopeKing 16 Juni 2020, 12:19

1 menjawab

Jawaban Terbaik

Mereka harus menghasilkan output yang sama ketika Anda menggunakan kosakata yang sama (dalam contoh Anda, Anda telah menggunakan bert-base-uncased-vocab.txt dan bert-base-cased-vocab.txt). Perbedaan utama adalah bahwa tokenizer dari paket tokenizers lebih cepat daripada tokenizer dari transformer karena diimplementasikan di Rust.

Saat Anda memodifikasi contoh Anda, Anda akan melihat bahwa mereka menghasilkan ids dan atribut lain yang sama (objek pengkodean) sedangkan tokenizer transformer hanya menghasilkan daftar 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)

Keluaran:

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

Keluaran:

[101, 7592, 1010, 1061, 1005, 2035, 999, 2129, 2024, 2017, 19204, 17629, 100, 1029, 102]
<class 'list'>

Anda menyebutkan di komentar bahwa pertanyaan Anda lebih tentang mengapa output yang dihasilkan berbeda. Sejauh yang saya tahu ini adalah keputusan desain yang dibuat oleh pengembang dan tidak ada alasan khusus untuk itu. BertWordPieceTokenizer dari tokenizers adalah pengganti BertTokenizer dari < a href="https://github.com/huggingface/transformers" rel="nofollow noreferrer">transformer. Mereka masih menggunakan pembungkus agar kompatibel dengan transformers tokenizer API. Ada kelas BertTokenizerFast yang memiliki metode "pembersihan" _convert_encoding BertWordPieceTokenizer sepenuhnya kompatibel. Oleh karena itu Anda harus membandingkan contoh BertTokenizer di atas dengan yang berikut ini:

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

Keluaran:

[101, 7592, 1010, 1061, 1005, 2035, 999, 2129, 2024, 2017, 19204, 17629, 100, 1029, 102]
<class 'list'>

Dari sudut pandang saya, mereka telah membangun perpustakaan tokenizers secara independen dari transformers perpustakaan dengan tujuan agar cepat dan berguna.

5
cronoik 17 Juni 2020, 00:38