构建新闻相似文章推荐系统:cosine similarity的其他实现方式咨询
基于余弦相似度的相似文章推荐优化方案
你当前合并所有参考文章为长文再计算相似度的方式虽然简单,但容易稀释单篇高相关文章的特征,以下是几种更合理的余弦相似度实现方式:
单篇匹配后聚合结果
直接计算新文章与每一篇参考文章的余弦相似度,再通过阈值筛选或取Top N的方式得到候选文章:- 优势:能精准定位到与新文章最匹配的单篇参考内容,不会因为合并文本导致特征被平均。
- 代码示例:
from sklearn.metrics.pairwise import cosine_similarity # 假设reference_vecs是所有参考文章的向量列表(已完成文本向量化) # new_article_vec是新文章的向量 similarity_scores = cosine_similarity([new_article_vec], reference_vecs)[0] # 筛选相似度≥0.7的文章 qualified_indices = [i for i, score in enumerate(similarity_scores) if score >= 0.7] qualified_articles = [reference_articles[i] for i in qualified_indices] # 或者取相似度最高的前5篇 top5_indices = similarity_scores.argsort()[-5:][::-1] top5_articles = [reference_articles[i] for i in top5_indices]
参考向量均值匹配
先计算所有参考文章向量的均值(得到代表整体参考内容的"中心向量"),再用新文章向量与该中心向量计算相似度:- 区别于合并长文:合并长文是文本拼接后生成向量,均值向量是先独立向量化再取平均,能均衡体现所有参考文章的特征,避免某篇长文章在合并后权重过高。
- 代码示例:
import numpy as np from sklearn.metrics.pairwise import cosine_similarity # reference_vecs是形状为(n, dim)的数组,n为参考文章数量,dim为向量维度 center_vector = np.mean(reference_vecs, axis=0) overall_similarity = cosine_similarity([new_article_vec], [center_vector])[0][0] # 根据整体相似度阈值筛选 if overall_similarity >= 0.6: print("新文章符合参考内容风格")
加权相似度计算
如果参考文章有优先级区分(比如部分是核心参考素材),可以给每篇参考文章设置权重,计算加权后的总相似度:- 适用场景:需要突出核心参考文章的匹配度时使用。
- 代码示例:
from sklearn.metrics.pairwise import cosine_similarity # 对应每篇参考文章的权重数组,权重和建议为1 weights = [0.6, 0.2, 0.15, 0.05] similarity_scores = cosine_similarity([new_article_vec], reference_vecs)[0] # 计算加权总相似度 weighted_total = sum(score * weight for score, weight in zip(similarity_scores, weights))
聚类后精细匹配
当参考文章数量极大时,先对参考向量做聚类(比如K-Means),再将新文章向量匹配到最接近的聚类,最后在该聚类内计算单篇相似度:- 优势:大幅减少计算量,同时聚焦到主题更接近的文章群中做精准匹配。
- 代码示例思路:
from sklearn.cluster import KMeans from sklearn.metrics.pairwise import cosine_similarity # 先对参考向量聚类 kmeans = KMeans(n_clusters=5, random_state=42) cluster_labels = kmeans.fit_predict(reference_vecs) # 找到新文章所属的聚类 new_cluster = kmeans.predict([new_article_vec])[0] # 筛选该聚类下的所有参考向量 cluster_vecs = reference_vecs[cluster_labels == new_cluster] # 在聚类内计算相似度并筛选 cluster_similarities = cosine_similarity([new_article_vec], cluster_vecs)[0]
内容的提问来源于stack exchange,提问作者Python-data
相关产品推荐
相关产品推荐

