上述修改后的代码输出全是['[CLS]', '[CLS]', '[CLS]'],这不是我想要的结果啊,我想要的是微博文本的词语和种子词很相似的所有词语,而不是bert自动添加的特殊标记符,并且我希望代码实现的是:利用BERT模型训练大量的微博文本语料(这些语料都是一句一句的),获取词向量,同时用Bert获取一个种子词的词向量,然后计算微博文本语料中所有词语词向量与这个种子词词向量的余弦相似度,也就是输出微博文本词语中和这个种子词最相似的词语,同时可以再实现一个设关联度阈值为0.8,微博文本词语与种子词相似且相似度≥0.8的词可以输出。能帮我实现一下吗
时间: 2023-07-15 16:10:53 浏览: 146
好的,我理解了您的需求,下面是根据您的要求修改后的代码:
```python
import torch
from transformers import BertTokenizer, BertModel
from scipy.spatial.distance import cosine
# 加载Bert模型和Tokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
model = BertModel.from_pretrained('bert-base-chinese')
# 定义种子词
seed_word = "好看"
# 获取种子词的嵌入表示
seed_word_tokens = tokenizer.tokenize(seed_word)
seed_word_ids = tokenizer.convert_tokens_to_ids(seed_word_tokens)
seed_word_ids = torch.tensor(seed_word_ids).unsqueeze(0) # 增加 batch 维度
with torch.no_grad():
seed_word_embedding = model(seed_word_ids)[0][:, 0, :] # 获取 [CLS] 的词向量
# 定义微博文本
text = "这个电影真的很好看,我超级喜欢。"
# 分词并获取嵌入表示
tokens = tokenizer.tokenize(text)
input_ids = tokenizer.convert_tokens_to_ids(tokens)
input_ids = torch.tensor(input_ids).unsqueeze(0) # 增加 batch 维度
with torch.no_grad():
outputs = model(input_ids)
last_hidden_states = outputs[0]
last_hidden_states = last_hidden_states[0] # 只取第一句话的表示
# 计算与种子词的相似度
for i, token in enumerate(tokens):
token_embedding = last_hidden_states[i]
similarity = cosine(token_embedding, seed_word_embedding)
if similarity >= 0.8:
print(token)
```
这段代码会输出和种子词“好看”相似度大于等于0.8的微博文本中的词语。请注意,这个相似度是使用余弦相似度计算的。同时,为了方便调试,这里只取了微博文本中的第一句话,如果您的微博文本包含多句话,可以适当修改代码。
阅读全文