Python项目中跨网站同主题新闻文章聚类实现方法问询
跨网站同主题新闻聚类实现方案
核心思路优化
你的关键词聚类思路方向是对的,但要避免仅靠简单关键词匹配的局限性——比如不同网站对同一事件的表述用词可能不同,单纯关键词重合度容易漏判。需要结合语义层面的相似性和多维度特征来提升聚类准确率。
具体实现步骤
1. 新闻内容预处理
- 清洗冗余信息:去除抓取到的HTML标签、广告弹窗文本、重复换行等,保留标题和正文核心内容(标题权重可适当提高,因为标题是主题的高度浓缩)
- 分词与停用词过滤:中文用
jieba/pkuseg分词,英文用nltk分词;过滤无意义停用词(如中文“的、了、在”,英文“the、a”),减少干扰特征
2. 特征提取(从关键词到语义向量)
- 基础版:用TF-IDF算法提取关键词权重,取TOP N高权重词作为文章特征,
sklearn的TfidfVectorizer可直接实现 - 进阶版:用预训练大模型(如BERT中文/英文版本)提取文章语义向量,相比关键词更能捕捉上下文关联,解决不同网站用词差异的问题;也可用LDA主题模型(
gensim的LdaModel)提取抽象主题标签
3. 相似性计算与聚类
- 若用关键词/TF-IDF向量:计算文章间的余弦相似度,设定阈值(如0.7),超过阈值归为同一类;或用K-Means/DBSCAN算法自动聚类,
sklearn提供现成实现 - 若用语义向量:直接基于余弦相似度或欧氏距离计算,DBSCAN更适合无预设聚类数量的场景,能自动识别同主题集群
- 高效技巧:先通过标题相似度做初步分组,再用正文内容验证,减少全局计算量
4. 聚类后去重与合并
- 完全重复文章:对正文做MD5哈希,哈希值相同的直接合并
- 聚类组标签生成:提取每组文章的共同高频关键词或主题词,作为该组的主题标签,方便后续管理
简化代码示例
import jieba from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.cluster import DBSCAN from sklearn.metrics.pairwise import cosine_similarity # 文本预处理函数 def preprocess_news(text): # 可补充HTML标签清洗逻辑 seg_words = jieba.cut(text) stop_words = {'的', '了', '在', '是', '就'} return ' '.join([word for word in seg_words if word not in stop_words]) # 假设news_list为抓取的新闻列表,结构:[{"title": "...", "content": "..."}] processed_content = [preprocess_news(item['title'] + ' ' + item['content']) for item in news_list] # 生成TF-IDF向量矩阵 tfidf_vec = TfidfVectorizer() tfidf_matrix = tfidf_vec.fit_transform(processed_content) # 计算相似度矩阵,转换为距离矩阵(DBSCAN用距离) sim_matrix = cosine_similarity(tfidf_matrix) dist_matrix = 1 - sim_matrix # DBSCAN聚类 dbscan = DBSCAN(eps=0.3, min_samples=2, metric='precomputed') cluster_labels = dbscan.fit_predict(dist_matrix) # 整理聚类结果 cluster_groups = {} for idx, label in enumerate(cluster_labels): if label not in cluster_groups: cluster_groups[label] = [] cluster_groups[label].append(news_list[idx])
关键注意事项
- 阈值调整:根据新闻类别灵活调整相似度阈值——娱乐新闻用词重复率高,阈值可设为0.75;科技新闻术语独特,阈值可降至0.65
- 性能优化:大模型语义向量计算成本高,可对长文本做摘要后再提取向量;数据量较大时,用近似最近邻算法(如FAISS)加速相似性计算
- 时间维度:同一主题新闻的发布时间通常集中,可将发布时间作为辅助特征加入聚类判断
内容的提问来源于stack exchange,提问作者SanaSajid
相关产品推荐
相关产品推荐

