基于TF-IDF比较语料库文档对:已实现矩阵计算,求段落相似度方案
计算TF-IDF矩阵下的段落相似度
Hey there! 既然你已经成功用TfidfVectorizer生成了TF-IDF矩阵,那接下来计算段落间的相似度就很顺理成章了。最常用也最有效的方法就是余弦相似度——它能衡量两个向量(这里就是段落的TF-IDF向量)之间的夹角余弦值,值越接近1说明相似度越高。
方法步骤:用sklearn的cosine_similarity直接计算
首先你需要导入余弦相似度的工具函数,然后直接传入你的TF-IDF矩阵即可:
from sklearn.metrics.pairwise import cosine_similarity # 计算所有段落间的余弦相似度矩阵 similarity_matrix = cosine_similarity(tfidf_matrix) # 查看第0段和第1段的相似度 print("段落0和段落1的相似度:", similarity_matrix[0][1]) # 如果要找和第0段最相似的段落(排除自身) most_similar_idx = similarity_matrix[0].argsort()[-2] # 取倒数第二个,因为第一个是自身(相似度1) print("和段落0最相似的段落是第{}段,相似度为:{:.4f}".format(most_similar_idx, similarity_matrix[0][most_similar_idx]))
代码解释:
cosine_similarity(tfidf_matrix)会返回一个n×n的矩阵(n是段落数量),其中similarity_matrix[i][j]就代表第i个段落和第j个段落的相似度。argsort()会对相似度数组进行排序,取倒数第二个元素就能得到除了自身外最相似的段落索引(因为自身的相似度是1,肯定排在第一位)。
其他可选方法(如果需要更灵活的计算)
如果你想手动实现余弦相似度(或者理解底层逻辑),可以用以下方式计算两个段落向量的相似度:
import numpy as np # 取出第0段和第1段的TF-IDF向量 vec1 = tfidf_matrix[0].toarray().flatten() vec2 = tfidf_matrix[1].toarray().flatten() # 计算余弦相似度 dot_product = np.dot(vec1, vec2) norm1 = np.linalg.norm(vec1) norm2 = np.linalg.norm(vec2) similarity = dot_product / (norm1 * norm2) print("手动计算的段落0和段落1的相似度:", similarity)
这个结果和用cosine_similarity得到的是完全一致的,只是手动实现了公式而已。
内容的提问来源于stack exchange,提问作者Mia
相关产品推荐
相关产品推荐

