酒店评价中有6个属性和25个关键词想要进行相似度计算使用先加载模型得到词向量然后分别计算属性和关键词之间的余弦相似度的方式进行每个关键词与哪个属性的相似度最高就归为哪一个属性输出属性和关键词的键值对形式的字典写出完整代码
以下是完整代码:
import jieba
import numpy as np
from gensim.models import Word2Vec
# 加载模型
model = Word2Vec.load('model_path')
# 定义属性和关键词
attributes = ['服务', '卫生', '设施', '位置', '价格', '环境']
keywords = ['服务态度', '服务质量', '卫生情况', '卫生干净', '设施齐全', '设施陈旧', '位置方便', '位置交通', '价格实惠', '价格高昂', '环境优美', '环境吵闹', '其他问题', '其他建议', '其他意见', '其他评价', '其他描述', '其他说明', '其他感受', '其他体验', '其他体感', '其他评分', '其他评分', '其他打分', '其他分数', '其他满意度']
# 定义每个属性对应的关键词
attribute_keywords = {
'服务': ['服务态度', '服务质量'],
'卫生': ['卫生情况', '卫生干净'],
'设施': ['设施齐全', '设施陈旧'],
'位置': ['位置方便', '位置交通'],
'价格': ['价格实惠', '价格高昂'],
'环境': ['环境优美', '环境吵闹']
}
# 分词
def cut_words(text):
words = jieba.lcut(text)
return words
# 计算余弦相似度
def cosine_similarity(u, v):
return np.dot(u, v) / (np.linalg.norm(u) * np.linalg.norm(v))
# 计算属性和关键词之间的余弦相似度
def calculate_similarity(attribute, keyword):
attribute_vec = np.zeros(100)
for ak in attribute_keywords[attribute]:
attribute_vec += model.wv[ak]
attribute_vec /= len(attribute_keywords[attribute])
keyword_vec = np.zeros(100)
for kw in cut_words(keyword):
if kw in model.wv:
keyword_vec += model.wv[kw]
keyword_vec /= len(cut_words(keyword))
return cosine_similarity(attribute_vec, keyword_vec)
# 执行相似度计算
result = {}
for keyword in keywords:
max_similarity = 0
max_attribute = ''
for attribute in attributes:
similarity = calculate_similarity(attribute, keyword)
if similarity > max_similarity:
max_similarity = similarity
max_attribute = attribute
result[keyword] = max_attribute
# 输出结果
print(result)
代码说明:
- 加载Word2Vec模型,模型路径需要根据实际情况进行修改。
- 定义属性和关键词列表,以及每个属性对应的关键词字典。
- 定义分词函数和计算余弦相似度函数。
- 定义计算属性和关键词之间的余弦相似度的函数,其中将每个属性对应的关键词向量平均得到属性向量,将每个关键词的向量平均得到关键词向量,然后计算它们之间的余弦相似度。
- 对于每个关键词,计算它与每个属性之间的余弦相似度,找到相似度最高的属性,将该关键词归为该属性。
- 将结果输出为属性和关键词的键值对形式的字典
原文地址: https://www.cveoy.top/t/topic/fIJN 著作权归作者所有。请勿转载和采集!