max_length、填充和截断参数如何在 HuggingFace' BertTokenizerFast.from_pretrained('bert-base-uncased') 中工作?

How does max_length, padding and truncation arguments work in HuggingFace' BertTokenizerFast.from_pretrained('bert-base-uncased') work??

我正在处理文本分类问题,我想使用 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'

那么这 3 个参数有什么作用?我的想法如下:

  1. max_length=5 将严格保留长度为 5 的所有句子
  2. padding=max_length 将在第三句中添加 padding 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'])

您的假设几乎是正确的,但是,几乎没有什么不同。

max_length=5max_length 指定 标记化文本的长度。默认情况下,BERT 执行分词标记化。例如“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