如何利用已计算的TFIDF分数计算文档间的余弦相似度
解决方案:从已有TF-IDF分数构建文档-词项矩阵并计算余弦相似度(Python 2.7)
我完全懂你的痛点——已经花了大量精力做了预处理(包括词袋和IDF过滤)得到了TF-IDF分数,肯定不想再用TFIDFVectorizer重新计算一遍对吧?下面就给你一步步解决这个问题:
第一步:将长格式CSV转换为文档-词项矩阵
你的输入是长格式的CSV(每行对应一个文档-词项的TF-IDF分数),我们需要把它转成宽格式的矩阵,缺失的词项自动补0。用pandas是最便捷的方式,Python 2.7支持的最后一个稳定pandas版本是0.24.2,先安装这个版本:
pip install pandas==0.24.2
然后用以下代码处理数据:
import pandas as pd # 读取你的TF-IDF数据CSV df = pd.read_csv('your_tfidf_data.csv') # 构建文档-词项矩阵:行=文档ID,列=词项,值=TF-IDF分数,缺失值补0 tfidf_matrix = df.pivot_table( index='Doc', columns='Term', values='TFIDF score', fill_value=0 ) # 打印验证结果 print(tfidf_matrix)
运行后就能得到你想要的矩阵:
Term apples bananas pears Doc 1 0.3 0.7 0.0 2 0.1 0.0 0.9 3 0.6 0.2 0.2
第二步:计算文档间的余弦相似度
得到矩阵后,我们可以用scikit-learn的cosine_similarity快速计算相似度,注意Python 2.7支持的最后一个sklearn版本是0.20.3,先安装:
pip install scikit-learn==0.20.3
添加计算相似度的代码:
from sklearn.metrics.pairwise import cosine_similarity # 计算余弦相似度矩阵 similarity_matrix = cosine_similarity(tfidf_matrix) # 转换为DataFrame,方便直观查看(行和列都是文档ID) similarity_df = pd.DataFrame( similarity_matrix, index=tfidf_matrix.index, columns=tfidf_matrix.index ) print("文档间余弦相似度:") print(similarity_df)
运行后会输出类似这样的结果:
Doc 1 2 3 Doc 1 1.000000 0.300000 0.420000 2 0.300000 1.000000 0.600000 3 0.420000 0.600000 1.000000
其他可选方案
如果不想用Python,你也可以用Excel的数据透视表完成矩阵转换:
- 选中CSV数据,插入透视表
- 行标签选
Doc,列标签选Term,值选TFIDF score,值字段设置为“求和”(因为每个文档-词项只有一条记录) - 最后把空白单元格批量填充为0即可得到矩阵,之后可以用Excel数组公式手动计算余弦相似度(不过批量处理效率不如Python)
注意事项
- 确保Python 2.7环境安装对应版本的依赖库,避免版本不兼容问题
- 如果数据量较大,
pivot_table的效率依然远高于手动循环构建矩阵
内容的提问来源于stack exchange,提问作者Lydia Ralph
相关产品推荐
相关产品推荐

