import jieba import torch from sklearn.metrics.pairwise import cosine_similarity from transformers import BertTokenizer, BertModel seed_words = ['姓名'] # with open("output/base_words.txt", "r", encoding="utf-8") as f: # for line in f: # seed_words.append(line.strip()) # print(seed_words) # 加载微博文本数据 text_data = [] with open("output/weibo1.txt", "r", encoding="utf-8") as f: for line in f: text_data.append(line.strip()) # print(text_data) # 加载BERT模型和分词器 tokenizer = BertTokenizer.from_pretrained('bert-base-chinese') model = BertModel.from_pretrained('bert-base-chinese') jieba.load_userdict('data/userdict.txt') # 构建隐私词库 privacy_words = set() for text in text_data: words = jieba.lcut(text.strip()) # 对文本进行分词,并且添加特殊标记 tokens = ["[CLS]"] + words + ["[SEP]"] # print(tokens) # # 对文本进行分词,并且添加特殊标记 # tokens = ["[CLS]"] + tokenizer.tokenize(text) + ["[SEP]"] # print(tokens) token_ids = tokenizer.convert_tokens_to_ids(tokens) # print(token_ids) segment_ids = [0] * len(token_ids) # 转换为张量,调用BERT模型进行编码 token_tensor = torch.tensor([token_ids]) segment_tensor = torch.tensor([segment_ids]) with torch.no_grad(): outputs = model(token_tensor, segment_tensor) encoded_layers = outputs[0] # print(encoded_layers) # 对于每个词,计算它与种子词的相似度 for i in range(1, len(tokens)-1): # print(tokens[i]) word = tokens[i] if word in seed_words: continue word_tensor = encoded_layers[0][i].reshape(1, -1) sim = cosine_similarity(encoded_layers[0][1:-1], word_tensor, dense_output=False)[0].max() print(sim) if sim > 0.5 and len(word) > 1: privacy_words.add(word) print(privacy_words) 第一个请求时为什么上述代码计算出来的余弦相似度的每个值都高达0.9以上,但事实应该是有些微博词汇与种子词之间并不相似,该帮我修改优化一下。第二个请求是:帮我详细讲解上述代码,并且指出哪块代码在比较微博文本数据中每个词汇与这个种子词的相似度。
时间: 2024-02-22 09:59:55 浏览: 79
Python错题本:from scipy.misc import imread 报错cannot import name imread 的解决方案
首先回答你的第一个问题,计算出来的余弦相似度高达0.9以上可能是因为你选取的种子词与微博文本数据中的词汇数量较少,导致计算结果出现偏差。可以尝试增加种子词的数量,或者采用其他文本相似度计算方法。
针对你的第二个请求,这段代码的主要作用是从微博文本数据中筛选出隐私词汇,并将这些词汇加入隐私词库。具体实现步骤如下:
1. 加载微博文本数据,将每条微博文本进行分词,并添加特殊标记。
2. 加载BERT模型和分词器,使用BERT模型对每个词进行编码。
3. 对于每个词,计算它与种子词的相似度。这里采用了余弦相似度计算方法,计算结果大于0.5并且词汇长度大于1的词汇被认为是隐私词汇。
4. 将筛选出的隐私词汇加入隐私词库。
其中,在比较微博文本数据中每个词汇与种子词的相似度的代码是:
```
sim = cosine_similarity(encoded_layers[0][1:-1], word_tensor, dense_output=False)[0].max()
```
这段代码使用了sklearn中的cosine_similarity函数,计算了encoded_layers[0][1:-1]与word_tensor之间的余弦相似度,得到的结果为sim。如果sim大于0.5并且词汇长度大于1,那么这个词汇被认为是隐私词汇。
阅读全文