上述代码报错了,报错信息:Traceback (most recent call last): File "E:/PyCharm Community Edition 2020.2.2/Project/WordDict/newsim.py", line 327, in <module> similarities = cosine_similarity(vectors, np.array([tokenizer.encode(word, return_tensors='pt')[0].numpy() for word in seed_words])) ValueError: Incompatible dimension for X and Y matrices: X.shape[1] == 768 while Y.shape[1] == 4 怎么修改,给出修改代码
时间: 2024-02-26 15:53:36 浏览: 148
Mac下anaconda中Spyder打开报错Traceback(most recent call last)…问题
5星 · 资源好评率100%
根据报错信息来看,似乎是因为种子词的编码长度不同导致的维度不匹配错误。你可以尝试使用`tokenizer.encode_plus()`方法来获取种子词的编码和相应的attention mask,然后将编码和attention mask传递给Bert模型,获取词向量。同时,由于种子词的数量较少,所以维度不对的问题可以通过扩展向量维度解决。
以下是修改后的代码:
```python
from transformers import BertTokenizer, BertModel
import torch
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
# 人工选取的隐私词列表
seed_words = ['个人信息', '身份证', '手机号码', '银行卡', '密码', '账号', '地址', '社保', '职业', '学历', '收入', '家庭情况']
# 加载Bert tokenizer和模型
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
model = BertModel.from_pretrained('bert-base-chinese')
model.eval()
# 读取微博博文文本语料
with open('weibo_corpus.txt', 'r', encoding='utf-8') as f:
corpus = f.readlines()
# 对每个词汇获取词向量
vectors = []
for text in corpus:
# 对文本进行tokenize和padding
inputs = tokenizer(text, return_tensors='pt', padding=True, truncation=True)
# 获取Bert模型的输出
with torch.no_grad():
outputs = model(**inputs)
# 获取隐层输出(即词向量)
hidden_states = outputs[0]
# 对所有隐层输出取平均得到文本向量
text_vector = torch.mean(hidden_states, dim=1)
# 将文本向量转换为numpy数组
text_vector = text_vector.numpy()[0]
# 将文本向量添加到向量列表中
vectors.append(text_vector)
# 将种子词的词向量与所有词汇的词向量计算余弦相似度
similarities = cosine_similarity(vectors, np.array([model(tokenizer.encode_plus(word, return_tensors='pt')['input_ids'], attention_mask=tokenizer.encode_plus(word, return_tensors='pt')['attention_mask']).last_hidden_state[0].numpy() for word in seed_words]))
# 获取每个种子词的关联词汇
related_words = {}
for i, word in enumerate(seed_words):
# 获取与该种子词余弦相似度大于阈值的词汇
sim_words = [corpus[j] for j in range(len(corpus)) if similarities[j][i] > q]
# 合并、去重
related_words[word] = list(set(sim_words))
# 人工筛选
privacy_words = []
for word in seed_words:
# 将种子词添加到结果列表中
privacy_words.append(word)
# 将关联词汇添加到结果列表中
for related_word in related_words[word]:
# 如果关联词汇与已添加的词汇重复,则不加入结果列表
if related_word not in privacy_words:
privacy_words.append(related_word)
# 对结果列表进行去重
privacy_words = list(set(privacy_words))
```
在修改后的代码中,我们使用`model()`方法获取种子词的词向量,同时使用`last_hidden_state`属性获取隐层输出,然后将隐层输出转换为numpy数组。此外,我们还将向量的维度从4扩展到768,以解决维度不匹配问题。
阅读全文