如何基于已训练词向量使用Gensim计算文档与关键词集合的余弦相似度
基于Gensim计算文档与关键词集合的余弦相似度
核心实现逻辑:分别将单篇文档的分词结果、目标关键词集合转换为平均词向量,再计算两个向量的余弦值作为匹配得分,Gensim本身已封装全流程所需的工具方法,无需手动实现复杂的向量运算。
实现步骤
前置准备
通过Gensim的KeyedVectors接口加载训练完成的W2V/GloVe词向量模型,不管是原生Word2Vec格式的模型,还是转成Gensim兼容格式的GloVe模型,都可以直接调用内置方法完成计算。
内置能力说明
Gensim的KeyedVectors对象自带n_similarity()方法,已经完整实现了所需的全流程逻辑:
- 自动过滤两组词中不在模型词表的无效词汇
- 分别对两组有效词的词向量求平均,得到整组词的整体表示向量
- 自动完成向量归一化,直接输出两个平均向量的余弦相似度值
可直接复用的代码
from gensim.models import KeyedVectors import pandas as pd # 加载已训练完成的词向量模型,替换为实际模型路径即可 # model = KeyedVectors.load("你的词向量模型存储路径") # 定义待匹配的目标关键词集合 innovation_keywords = ['innovate','innovative','fast'] # 存储待计算的文档集合,结构为{文档名称: 分词后的词列表} doc_set = { "sent1": ['innovative','culture','fast','moving','company'], "sent2": ['manager','micromanage','all','time'], "sent3": ['slow','response','customer'] } # 逐文档计算与关键词集合的相似度 sim_result = {} for doc_name, doc_word_list in doc_set.items(): score = model.n_similarity(doc_word_list, innovation_keywords) sim_result[doc_name] = round(score, 2) # 整理为期望的表格输出格式 result_table = pd.DataFrame.from_dict(sim_result, orient="index", columns=["innovation"]) print(result_table)
运行代码后输出的表格结构和你给出的期望格式完全一致。
常见注意事项
- 余弦相似度的取值范围为[-1, 1],你示例中出现的0.98、0.45、-0.2均属于正常计算结果范围。
- 若某篇文档的所有分词结果均不在模型词表中,
n_similarity会触发维度不匹配的报错,可提前增加判断逻辑:遇到这类场景直接将对应文档的相似度标记为0,避免批量计算流程中断。 - 无需手动对向量做归一化处理,
n_similarity内部已默认完成归一化操作,输出的就是标准余弦相似度结果。
内容的提问来源于stack exchange,提问作者Yvonne
相关产品推荐
相关产品推荐

