首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >BertWordPieceTokenizer和BertTokenizer来自HuggingFace

BertWordPieceTokenizer和BertTokenizer来自HuggingFace
EN

Stack Overflow用户
提问于 2020-06-16 09:19:39
回答 1查看 8.8K关注 0票数 5

我有以下代码片段,并试图理解BertWordPieceTokenizer和BertTokenizer之间的区别。

BertWordPieceTokenizer (锈基)

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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. 为什么编码在这两种情况下的工作方式不同?在BertWordPieceTokenizer中,它给出编码对象,而在BertTokenizer中,它给出了词汇表的ids。
  2. BertWordPieceTokenizer和BertTokenizer之间的根本区别是什么,因为据我所知,BertTokenizer也在幕后使用WordPiece。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-16 12:44:41

当您使用相同的词汇表时,它们应该产生相同的输出(在您的示例中,您使用了bert-base-uncated-voab.txt和bert-base-cased voab.txt)。主要区别在于,来自令牌器包的令牌器比来自变压器的令牌器更快,因为它们是在Rust中实现的。

当您修改示例时,您将看到它们生成相同的ids和其他属性(编码对象),而转换器标记器只生成了ids的列表。

代码语言:javascript
运行
复制
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)

输出:

代码语言:javascript
运行
复制
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]
代码语言:javascript
运行
复制
from transformers import BertTokenizer

tokenizerBT = BertTokenizer("/content/bert-base-uncased-vocab.txt")
tokenized_sequenceBT = tokenizerBT.encode(sequence)
print(tokenized_sequenceBT)
print(type(tokenized_sequenceBT))

输出:

代码语言:javascript
运行
复制
[101, 7592, 1010, 1061, 1005, 2035, 999, 2129, 2024, 2017, 19204, 17629, 100, 1029, 102]
<class 'list'>

您在评论中提到,您的问题更多地是关于产生的输出为何不同。据我所知,这是开发人员做出的设计决定,没有具体的原因。也不是令牌器令牌器代替变压器的BertTokenizer的情况。他们仍然使用包装器使其与变压器令牌程序API兼容。有一个BertTokenizerFast类,它有一个“清理”方法编码,以使BertWordPieceTokenizer完全兼容。因此,您必须将上面的BertTokenizer示例与以下内容进行比较:

代码语言:javascript
运行
复制
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))

输出:

代码语言:javascript
运行
复制
[101, 7592, 1010, 1061, 1005, 2035, 999, 2129, 2024, 2017, 19204, 17629, 100, 1029, 102]
<class 'list'>

在我看来,他们已经独立于变压器库构建了变压器库,其目标是快速和有用。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62405155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档