在HuggingFace的BertTokenizerFast.from_pretrained('bert-base-uncased')中,max_length、padding和truncation参数是如何工作的?

22

我正在处理文本分类问题,在此我想使用BERT模型作为基础,接着再加上密集层。我想知道3个参数如何工作?例如,如果我有3个句子:

'My name is slim shade and I am an aspiring AI Engineer',
'I am an aspiring AI Engineer',
'My name is Slim'

那么这三个参数会做什么呢?我认为如下:

  1. max_length=5 严格保留所有句子的长度为5
  2. padding=max_length 将第三个句子添加1个填充位
  3. truncate=True 截断第一个和第二个句子,使它们的长度严格为5。

如果我错了,请纠正我。

以下是我使用的代码。

! pip install transformers==3.5.1

from transformers import BertTokenizerFast

tokenizer = BertTokenizerFast.from_pretrained('bert-base-uncased')

tokens = tokenizer.batch_encode_plus(text,max_length=5,padding='max_length', truncation=True)
  
text_seq = torch.tensor(tokens['input_ids'])
text_mask = torch.tensor(tokens['attention_mask'])
1个回答

28
您的假设基本正确,但是有一些区别。
max_length=5时,max_length指定了标记化文本的长度。默认情况下,BERT执行单词片段(word-piece)标记化。例如,“playing”这个单词可以被分割成“play”和“##ing”(这可能不是很精确,只是为了帮助您理解单词片段标记化),然后在句子开头添加[CLS]标记,在句子末尾添加[SEP]标记。因此,它首先对句子进行标记化,将其截断为max_length-2(如果truncation=True),然后在开头添加[CLS]标记,末尾添加[SEP]标记。(总长度为max_length
padding='max_length'时,在这个例子中,第三个示例将被填充,并不是非常明显,因为长度在添加[CLS][SEP]标记后超过了5。但是,如果您的max_length为10,则标记化的文本对应于[101, 2026, 2171, 2003, 11754, 102, 0, 0, 0, 0],其中101是[CLS]标记的ID,102是[SEP]标记的ID,因此填充为零,使所有文本长度为max_length。同样地,truncate=True 会确保严格遵循 max_length ,即如果 truncate=True ,则较长的句子将被截断为仅有 max_length 的长度。

非常感谢您提供的详细答案。我需要截断,因为我正在处理分类问题,所以无法使用可变长度。此外,我还有一个关于单词片段的疑问。在我看来,词汇表已经使用了300B个文本进行构建。那么它是否可以将“zaxis”更改为“z轴”、“currentI”更改为“current I”?另外,使用Lemmatization和/或Stemming会更好吗?它能够处理sin,cos,theta,gamma等吗?我认为这些也是300B个文本的一部分,因为它仅基于这些内容预测正确的标签。 - Deshwal
1
我们无法保证currentI是否会被更改为current I,因为单独的current一词可能会被分解。您无需执行词形还原,我在此问题上有一个答案:https://dev59.com/27Xna4cB1Zd3GeqPFh88#57072351 - Ashwin Geet D'Sa
1
你的另一个答案非常详细,提供了很多细节。感谢您帮助像我这样的人。 - Deshwal
你能帮我解决上面的注释问题吗?有什么猜测吗? - Deshwal
1
哦!好的。谢谢。我只使用BERT。所以我认为这些东西不会太有帮助。对于我的自定义模型,情况是不同的。 - Deshwal
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接