news 2026/8/5 4:30:22

Python如何对新闻数据去重

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python如何对新闻数据去重

前言

在做新闻爬虫、新闻数据分析、舆情项目的时候,我们经常会遇到大量重复新闻数据。同一篇新闻会被多家网站转载,标题微调、内容局部修改、时间不同,但本质是同一条新闻。如果不去重,会导致统计失真、数据库膨胀、分析结果被重复样本干扰。

新闻去重和普通文本去重不一样:不能简单直接比对字符串。常见场景:标题多一两个字、换行空格不同、HTML标签残留、转载时增删导语,直接==全等匹配会漏掉大量重复样本。

本文介绍Python处理新闻数据的几套实用方案,从简单到工业可用,覆盖精准去重、模糊去重、海量新闻场景优化。

一、简单场景:基于标题MD5精准去重

适用场景:新闻标题完全一致,只是来源、发布时间字段不一样。
原理:把标题做md5哈希,保存哈希值,新来的数据判断哈希是否已经存在。

优点:速度极快,内存占用低;缺点:标题稍微改动就失效,转载改标题就识别不出重复。

importhashlibdefget_md5(text:str)->str:"""文本生成md5"""returnhashlib.md5(text.strip().encode("utf-8")).hexdigest()news_list=[{"title":"人工智能行业迎来新一轮发展机遇","content":"正文1...","source":"A网"},{"title":"人工智能行业迎来新一轮发展机遇","content":"正文1...","source":"B网"},{"title":"大模型应用落地加速","content":"正文2...","source":"C网"},]seen=set()distinct_news=[]foriteminnews_list:title=item["title"].strip()h=get_md5(title)ifhnotinseen:seen.add(h)distinct_news.append(item)print(f"原始:{len(news_list)}去重后:{len(distinct_news)}")

缺点提醒:转载新闻经常修改标题,比如加【快讯】、改标点,标题md5直接失效。这种方案适合小规模、标题几乎不变的数据集。

二、预处理清洗文本(所有去重方案的前置步骤)

新闻网页拿到的数据经常混杂HTML标签、换行、空格、特殊符号、【】、#、摘要标记。无论后面用哪种算法,一定要先清洗文本

importredefclean_news_text(text:str)->str:"""清洗新闻文本,去掉干扰符号"""ifnottext:return""# 去除html标签text=re.sub(r"<.*?>","",text)# 去掉各类特殊符号、换行、多余空格text=re.sub(r"[【】《》#@\n\r\t]","",text)text=re.sub(r"\s+","",text)returntext.strip()

使用建议:优先清洗标题,条件允许可以清洗正文片段。清洗后再做哈希、相似度计算,大幅提升准确率。

三、局部敏感哈希 SimHash:新闻行业经典模糊去重

新闻去重最经典的算法就是SimHash。
核心思想:把长文本转为指纹,指纹相似度高就判定为重复新闻。即使改几个字、增删几句话,依然可以识别是同一篇新闻。

适合:转载新闻、正文局部改动、标题微调的新闻。

simhash简单实现

importhashlibdefget_hash(s):returnint(hashlib.md5(s.encode("utf-8")).hexdigest(),16)defsimhash(text:str,bit=64):words=list(text)v=[0]*bitforwordinwords:h=get_hash(word)foriinrange(bit):ifh>>i&1:v[i]+=1else:v[i]-=1fingerprint=0foriinrange(bit):ifv[i]>0:fingerprint|=1<<ireturnfingerprintdefhamming_distance(h1,h2):returnbin(h1^h2).count("1")# 测试news1_title=clean_news_text("人工智能行业迎来新一轮发展机遇")news2_title=clean_news_text("【快讯】人工智能行业迎来新一轮发展机遇!")fp1=simhash(news1_title)fp2=simhash(news2_title)dist=hamming_distance(fp1,fp2)print(f"汉明距离:{dist}")# 新闻业务经验阈值:汉明距离 <=3 判定为重复新闻ifdist<=3:print("判定为重复新闻")

业务经验阈值:

  • 汉明距离 ≤2:高度重复,几乎一样
  • 汉明距离 3~4:大概率转载新闻
  • 汉明距离 >5:判定为不同新闻

注意:完整simhash工程实现一般用分词(jieba)而不是按单字切割,效果更好。

结合jieba分词优化simhash

importjiebadefsimhash_by_jieba(text:str,bit=64):words=jieba.lcut(text)v=[0]*bitforwinwords:h=get_hash(w)foriinrange(bit):ifh>>i&1:v[i]+=1else:v[i]-=1fp=0foriinrange(bit):ifv[i]>0:fp|=1<<ireturnfp

真实项目:海量新闻库直接两两计算汉明距离速度很慢,一般会做分桶,把指纹分段存储,只对比同桶内指纹,降低计算量。

四、使用文本相似度:difflib 快速比对

适合小数据集,直接计算文本相似度得分。

fromdifflibimportSequenceMatcherdeftext_similarity(a:str,b:str)->float:returnSequenceMatcher(None,a,b).ratio()t1=clean_news_text("大模型产业正在快速发展")t2=clean_news_text("快讯:大模型产业正在快速发展!")score=text_similarity(t1,t2)print(f"相似度得分:{score:.2f}")ifscore>=0.85:print("判定重复新闻")

优点:简单开箱即用;缺点:数据量大的时候O(n²)复杂度,上万条新闻会很慢,适合小批量处理。

五、数据库场景下新闻去重实战

爬虫入库的时候,我们不希望内存保存全部指纹,一般把指纹存MySQL。

流程:

  1. 新闻清洗标题、正文
  2. 生成simhash指纹、md5标题指纹
  3. 入库前查询数据库,比对指纹,判断是否重复;重复则跳过保存。

建表参考:

CREATETABLEnews(idBIGINTPRIMARYKEYAUTO_INCREMENT,titleVARCHAR(500),contentTEXT,sourceVARCHAR(100),publish_timeDATETIME,title_md5CHAR(32),simhash_fpBIGINTUNSIGNED,INDEXidx_title_md5(title_md5));

业务逻辑伪代码:

# 拿到爬虫新闻raw_news={...}clean_title=clean_news_text(raw_news["title"])md5_val=get_md5(clean_title)fp=simhash_by_jieba(clean_title)# 查询数据库是否存在重复# 优先匹配title_md5;如果没有,再做simhash汉明距离比对

注意:MySQL直接大量计算汉明距离性能差,百万级新闻建议使用分桶策略,或者使用ES向量检索辅助去重。

六、不同方案选型对比

方案适用场景优点缺点
标题MD5哈希标题完全一致速度极快标题微调失效,无法识别转载改写新闻
difflib相似度小数据集,几千条以内简单,无需第三方库大数据量性能差
SimHash新闻转载、文本局部改动工业界新闻去重标准,抗改写需要调参,海量数据需要分桶优化

七、生产环境踩坑经验

  1. 不要只用标题做去重:部分新闻标题一样,内容完全不同;条件允许,标题+正文摘要共同生成simhash。
  2. 一定要做文本清洗:网页符号、【快讯】、换行空格会严重干扰指纹结果。
  3. 阈值不要写死:短文本(短标题)汉明距离阈值调小;长正文阈值可以适度放大。
  4. 海量新闻不要两两循环比对,n²复杂度会爆炸,要用simhash分桶或者向量库。
  5. 时间差异:同一条新闻不同时间转载,simhash可以识别,单纯md5会识别成新新闻。

八、总结

新闻数据去重分两个层级:精准去重(MD5)、模糊去重(SimHash)。

  • 如果只是简单爬虫,标题基本不变,MD5足够简单高效;
  • 如果做舆情、新闻分析,大量转载改写新闻,优先使用基于jieba分词的SimHash算法。

预处理清洗是所有方案的基础,很多人去重效果差,根源就是没有做文本清洗,特殊符号干扰指纹。

如果数据量达到百万级别,内存方案已经扛不住,就需要结合数据库分桶策略,或者接入Elasticsearch向量检索做大规模新闻去重。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/5 4:27:04

虚拟机SSE 4.2指令集缺失导致程序崩溃的排查与解决方案

1. 问题引入&#xff1a;一个看似简单的“不支持”背后最近在折腾一个老项目的迁移&#xff0c;环境从物理机搬到了KVM虚拟机上。项目本身不复杂&#xff0c;但里面用到了一个老版本的图像处理库。迁移过程很顺利&#xff0c;系统启动、服务部署一气呵成&#xff0c;直到我尝试…

作者头像 李华
网站建设 2026/8/5 4:26:17

K-Net:统一分割新范式,从动态核生成到全景分割实战

1. 从“分割一切”到“统一分割”&#xff1a;K-Net的动机与核心思想如果你在过去几年里关注过计算机视觉&#xff0c;尤其是图像分割领域&#xff0c;你一定会对“分割一切”&#xff08;Segment Anything&#xff09;这个概念印象深刻。从早期的FCN、U-Net&#xff0c;到后来…

作者头像 李华
网站建设 2026/8/5 4:24:05

PyTorch模型冻结实战:迁移学习中的参数控制与优化器配置

1. 项目概述&#xff1a;为什么需要冻结网络层&#xff1f;在深度学习的模型训练中&#xff0c;尤其是进行迁移学习或微调预训练模型时&#xff0c;我们经常会遇到一个核心需求&#xff1a;只训练模型的一部分&#xff0c;而让另一部分保持“静止”。这个操作&#xff0c;就是所…

作者头像 李华
网站建设 2026/8/5 4:24:00

AI时代校招生培养:从代码执行者到AI增强型问题解决者

1. 从“螺丝钉”到“AI原住民”&#xff1a;校招生培养的范式转移最近和几个大厂的朋友聊天&#xff0c;话题总绕不开“校招生”。大家普遍的感觉是&#xff0c;现在的校招生&#xff0c;尤其是技术岗的&#xff0c;和五年前、十年前我们那会儿&#xff0c;完全不是一个物种了。…

作者头像 李华
网站建设 2026/8/5 4:23:55

从手工思维链到自动推理:大模型时代的人机协作演进与进阶实践

你有没有过这样的体验&#xff1a;面对一个复杂问题&#xff0c;你让大模型直接给出答案&#xff0c;它却答非所问、逻辑混乱。但如果你要求它“一步一步思考”&#xff0c;它突然就像开了窍&#xff0c;条理清晰&#xff0c;答案也靠谱了许多。这个“一步一步思考”的指令&…

作者头像 李华
网站建设 2026/8/5 4:18:07

VSCode C/C++开发环境配置:解决IntelliSense无报错提示问题

1. 从“一片寂静”到“精准定位”&#xff1a;为什么VSCode的C/C报错提示会消失&#xff1f;如果你正在用VSCode写C或C代码&#xff0c;最让人抓狂的瞬间之一&#xff0c;大概就是代码明明有问题&#xff0c;但编辑器却一片祥和&#xff0c;没有任何波浪线或错误提示。光标悬停…

作者头像 李华