拥抱脸中tokenizer.encode和tokenizer.encode_plus有什么区别

问题描述 投票:0回答:1

这里是使用模型进行序列分类以确定两个序列是否相互解释的示例。这两个示例给出了两个不同的结果。您能帮我解释一下为什么tokenizer.encodetokenizer.encode_plus给出不同的结果吗?

示例1(带有.encode_plus()):

paraphrase = tokenizer.encode_plus(sequence_0, sequence_2, return_tensors="pt")
not_paraphrase = tokenizer.encode_plus(sequence_0, sequence_1, return_tensors="pt")

paraphrase_classification_logits = model(**paraphrase)[0]
not_paraphrase_classification_logits = model(**not_paraphrase)[0]

示例2(带有.encode()):

paraphrase = tokenizer.encode(sequence_0, sequence_2, return_tensors="pt")
not_paraphrase = tokenizer.encode(sequence_0, sequence_1, return_tensors="pt")

paraphrase_classification_logits = model(paraphrase)[0]
not_paraphrase_classification_logits = model(not_paraphrase)[0]
huggingface-transformers
1个回答
0
投票

主要区别在于encode_plus提供的其他信息。如果您阅读了有关各个功能的文档,则encode()会有细微的差别:

使用分词器和词汇表,以ID序列(整数)转换字符串。与执行encode()相同。

self.convert_tokens_to_ids(self.tokenize(text))的描述:

返回包含编码序列或序列对的字典和其他信息:用于序列分类的掩码和如果指定了encode_plus(),则溢出元素。

取决于您指定的模型和输入句子,区别在于附加编码的信息,特别是输入掩码。由于您一次要输入两个句子,即BERT(可能还有其他模型变体),因此需要某种形式的掩蔽,这可以使模型在两个序列之间进行区分,请参见encode_plus()。因为max_length 提供了此信息,但是here 不是,所以您将获得不同的输出结果。

© www.soinside.com 2019 - 2024. All rights reserved.