Roberta 模型预处理文本中的混乱

Mr.*_*NLP 1 nlp pytorch bert-language-model huggingface-transformers

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

A)

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:]

Run Code Online (Sandbox Code Playgroud)

在这种情况下,顺序是[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]
Run Code Online (Sandbox Code Playgroud)

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

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

den*_*ger 5

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

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)
Run Code Online (Sandbox Code Playgroud)

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

或者,您还可以使用 的更明确的build_inputs_with_special_tokens()功能RobertaTokenizer,具体来说,可以将其添加到您的示例中,如下所示:

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)
Run Code Online (Sandbox Code Playgroud)

请注意,在这种情况下,您必须生成序列list1,并且list2仍然没有任何特殊标记,就像您已经正确完成的那样。