8

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

1 回答 1

7

您的假设几乎是正确的,但是几乎没有区别。

max_length=5,max_length 指定标记化文本的长度。默认情况下,BERT 执行词片标记化。比如“playing”这个词可以拆分成“play”和“##ing”(这个可能不是很精确,只是为了帮助大家理解词片分词),然后[CLS]在开头加上token句,[SEP]句末有记号。因此,它首先对句子进行标记,将其截断为max_length-2(if truncation=True),然后[CLS]在开头添加前缀并[SEP]在末尾添加标记。(所以总长度为max_length

padding='max_length', 在此示例中,第三个示例将被填充并不是很明显,因为5在附加[CLS][SEP]标记之后长度超过了。但是,如果您的 amax_length为 10。标记化的文本对应于[101, 2026, 2171, 2003, 11754, 102, 0, 0, 0, 0],其中 101 是 id of,[CLS]而 102 是[SEP]标记的 id。因此,用零填充以使所有文本的长度为max_length

同样,truncate=True将确保严格遵守 max_length,即,max_length仅在以下情况下截断较长的句子truncate=True

于 2020-12-11T16:58:20.733 回答