如何使用XLNet进行句子相似度计算?

2024-09-22 14:29:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我想执行句子相似性任务,并尝试了以下操作:

from transformers import XLNetTokenizer, XLNetModel
import torch
import scipy
import torch.nn as nn
import torch.nn.functional as F

tokenizer = XLNetTokenizer.from_pretrained('xlnet-large-cased')
model = XLNetModel.from_pretrained('xlnet-large-cased')

input_ids = torch.tensor(tokenizer.encode("Hello, my animal is cute", add_special_tokens=False)).unsqueeze(0)
outputs = model(input_ids)
last_hidden_states = outputs[0]

input_ids = torch.tensor(tokenizer.encode("I like your cat", add_special_tokens=False)).unsqueeze(0) 

outputs1 = model(input_ids)
last_hidden_states1 = outputs1[0]

cos = nn.CosineSimilarity(dim=1, eps=1e-6)
output = cos(last_hidden_states, last_hidden_states1)

但是,我得到以下错误:

RuntimeError: The size of tensor a (7) must match the size of tensor b (4) at non-singleton dimension 1

谁能告诉我,我做错了什么?有更好的方法吗


Tags: fromimportidsinputmodelasnntorch
1条回答
网友
1楼 · 发布于 2024-09-22 14:29:26

有几件事你做错了

  1. add_special_tokens应设置为True。该模型用<sep>标记进行句子分离训练,用<cls>标记进行句子分类训练。由于列车测试数据不匹配,不使用导致异常行为

  2. outputs[0]为您提供单成员Python元组的第一个元素。Transformer包中的所有模型都返回元组,因此返回这个单成员元组。每个输入标记包含一个向量,包括特殊的向量

  3. 与BERT的[CLS]标记是第一个不同,这里的<cls>标记是最后一个(参见Transformers documentation)。如果要比较分类向量,应该从序列中选取最后一个向量,即outputs[0][:, -1]

或者,您可能希望比较嵌入的平均值(平均池),而不是<cls>标记嵌入。在这种情况下,您只需执行output[0].mean(1)

相关问题 更多 >