罗伯塔模型预处理文本的混淆

Confusion in Pre-processing text for Roberta Model

我想应用 Roberta 模型来计算文本相似度。给定一对句子,输入格式应为 <s> A </s></s> B </s>。我想出了两种可能的方法来生成输入 id,即

一)

from transformers import AutoTokenizer, AutoModel

tokenizer = AutoTokenizer.from_pretrained('roberta-base')

list1 = tokenizer.encode('Very severe pain in hands')

list2 = tokenizer.encode('Numbness of upper limb')

sequence = list1+[2]+list2[1:]

在这种情况下,序列是 [0, 12178, 3814, 2400, 11, 1420, 2, 2, 234, 4179, 1825, 9, 2853, 29654, 2]

b)

from transformers import AutoTokenizer, AutoModel

tokenizer = AutoTokenizer.from_pretrained('roberta-base')

list1 = tokenizer.encode('Very severe pain in hands', add_special_tokens=False)

list2 = tokenizer.encode('Numbness of upper limb', add_special_tokens=False)

sequence = [0]+list1+[2,2]+list2+[2]

在这种情况下,序列是 [0, 25101, 3814, 2400, 11, 1420, 2, 2, 487, 4179, 1825, 9, 2853, 29654, 2]

这里0代表<s>代币,2代表</s>代币。我不确定使用 Roberta 模型对给定的两个句子进行编码以计算句子相似度的正确方法是什么。

最简单的方法可能是直接使用HuggingFace的Tokenizers自己提供的函数,即encode函数中的text_pair参数,参见here。这允许您直接输入两个句子,这将为您提供所需的输出:

from transformers import AutoTokenizer, AutoModel

tokenizer = AutoTokenizer.from_pretrained('roberta-base')
sequence = tokenizer.encode(text='Very severe pain in hands',
                            text_pair='Numbness of upper limb',
                            add_special_tokens=True)

如果您要处理很长的序列,这将特别方便,因为 encode 函数会根据 truncaction_strategy 参数自动减少您的长度。如果只是短序列,您显然不必担心这一点。

或者,您也可以使用 RobertaTokenizer 的更明确的 build_inputs_with_special_tokens() 函数,具体来说,可以像这样将其添加到您的示例中:

from transformers import AutoTokenizer, AutoModel

tokenizer = AutoTokenizer.from_pretrained('roberta-base')

list1 = tokenizer.encode('Very severe pain in hands', add_special_tokens=False)
list2 = tokenizer.encode('Numbness of upper limb', add_special_tokens=False)

sequence = tokenizer.build_inputs_with_special_tokens(list1, list2)

请注意,在那种情况下,您必须生成序列 list1list2 仍然 没有 任何特殊标记,因为您已经正确地完成了.