ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Python如何对新闻数据去重

2026/8/5 4:30:31 拓冰建站 浏览量
Python如何对新闻数据去重 前言在做新闻爬虫、新闻数据分析、舆情项目的时候我们经常会遇到大量重复新闻数据。同一篇新闻会被多家网站转载标题微调、内容局部修改、时间不同但本质是同一条新闻。如果不去重会导致统计失真、数据库膨胀、分析结果被重复样本干扰。新闻去重和普通文本去重不一样不能简单直接比对字符串。常见场景标题多一两个字、换行空格不同、HTML标签残留、转载时增删导语直接全等匹配会漏掉大量重复样本。本文介绍Python处理新闻数据的几套实用方案从简单到工业可用覆盖精准去重、模糊去重、海量新闻场景优化。一、简单场景基于标题MD5精准去重适用场景新闻标题完全一致只是来源、发布时间字段不一样。原理把标题做md5哈希保存哈希值新来的数据判断哈希是否已经存在。优点速度极快内存占用低缺点标题稍微改动就失效转载改标题就识别不出重复。importhashlibdefget_md5(text:str)-str:文本生成md5returnhashlib.md5(text.strip().encode(utf-8)).hexdigest()news_list[{title:人工智能行业迎来新一轮发展机遇,content:正文1...,source:A网},{title:人工智能行业迎来新一轮发展机遇,content:正文1...,source:B网},{title:大模型应用落地加速,content:正文2...,source:C网},]seenset()distinct_news[]foriteminnews_list:titleitem[title].strip()hget_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标签textre.sub(r.*?,,text)# 去掉各类特殊符号、换行、多余空格textre.sub(r[【】《》#\n\r\t],,text)textre.sub(r\s,,text)returntext.strip()使用建议优先清洗标题条件允许可以清洗正文片段。清洗后再做哈希、相似度计算大幅提升准确率。三、局部敏感哈希 SimHash新闻行业经典模糊去重新闻去重最经典的算法就是SimHash。核心思想把长文本转为指纹指纹相似度高就判定为重复新闻。即使改几个字、增删几句话依然可以识别是同一篇新闻。适合转载新闻、正文局部改动、标题微调的新闻。simhash简单实现importhashlibdefget_hash(s):returnint(hashlib.md5(s.encode(utf-8)).hexdigest(),16)defsimhash(text:str,bit64):wordslist(text)v[0]*bitforwordinwords:hget_hash(word)foriinrange(bit):ifhi1:v[i]1else:v[i]-1fingerprint0foriinrange(bit):ifv[i]0:fingerprint|1ireturnfingerprintdefhamming_distance(h1,h2):returnbin(h1^h2).count(1)# 测试news1_titleclean_news_text(人工智能行业迎来新一轮发展机遇)news2_titleclean_news_text(【快讯】人工智能行业迎来新一轮发展机遇)fp1simhash(news1_title)fp2simhash(news2_title)disthamming_distance(fp1,fp2)print(f汉明距离{dist})# 新闻业务经验阈值汉明距离 3 判定为重复新闻ifdist3:print(判定为重复新闻)业务经验阈值汉明距离 ≤2高度重复几乎一样汉明距离 3~4大概率转载新闻汉明距离 5判定为不同新闻注意完整simhash工程实现一般用分词jieba而不是按单字切割效果更好。结合jieba分词优化simhashimportjiebadefsimhash_by_jieba(text:str,bit64):wordsjieba.lcut(text)v[0]*bitforwinwords:hget_hash(w)foriinrange(bit):ifhi1:v[i]1else:v[i]-1fp0foriinrange(bit):ifv[i]0:fp|1ireturnfp真实项目海量新闻库直接两两计算汉明距离速度很慢一般会做分桶把指纹分段存储只对比同桶内指纹降低计算量。四、使用文本相似度difflib 快速比对适合小数据集直接计算文本相似度得分。fromdifflibimportSequenceMatcherdeftext_similarity(a:str,b:str)-float:returnSequenceMatcher(None,a,b).ratio()t1clean_news_text(大模型产业正在快速发展)t2clean_news_text(快讯大模型产业正在快速发展)scoretext_similarity(t1,t2)print(f相似度得分{score:.2f})ifscore0.85:print(判定重复新闻)优点简单开箱即用缺点数据量大的时候O(n²)复杂度上万条新闻会很慢适合小批量处理。五、数据库场景下新闻去重实战爬虫入库的时候我们不希望内存保存全部指纹一般把指纹存MySQL。流程新闻清洗标题、正文生成simhash指纹、md5标题指纹入库前查询数据库比对指纹判断是否重复重复则跳过保存。建表参考CREATETABLEnews(idBIGINTPRIMARYKEYAUTO_INCREMENT,titleVARCHAR(500),contentTEXT,sourceVARCHAR(100),publish_timeDATETIME,title_md5CHAR(32),simhash_fpBIGINTUNSIGNED,INDEXidx_title_md5(title_md5));业务逻辑伪代码# 拿到爬虫新闻raw_news{...}clean_titleclean_news_text(raw_news[title])md5_valget_md5(clean_title)fpsimhash_by_jieba(clean_title)# 查询数据库是否存在重复# 优先匹配title_md5如果没有再做simhash汉明距离比对注意MySQL直接大量计算汉明距离性能差百万级新闻建议使用分桶策略或者使用ES向量检索辅助去重。六、不同方案选型对比方案适用场景优点缺点标题MD5哈希标题完全一致速度极快标题微调失效无法识别转载改写新闻difflib相似度小数据集几千条以内简单无需第三方库大数据量性能差SimHash新闻转载、文本局部改动工业界新闻去重标准抗改写需要调参海量数据需要分桶优化七、生产环境踩坑经验不要只用标题做去重部分新闻标题一样内容完全不同条件允许标题正文摘要共同生成simhash。一定要做文本清洗网页符号、【快讯】、换行空格会严重干扰指纹结果。阈值不要写死短文本短标题汉明距离阈值调小长正文阈值可以适度放大。海量新闻不要两两循环比对n²复杂度会爆炸要用simhash分桶或者向量库。时间差异同一条新闻不同时间转载simhash可以识别单纯md5会识别成新新闻。八、总结新闻数据去重分两个层级精准去重MD5、模糊去重SimHash。如果只是简单爬虫标题基本不变MD5足够简单高效如果做舆情、新闻分析大量转载改写新闻优先使用基于jieba分词的SimHash算法。预处理清洗是所有方案的基础很多人去重效果差根源就是没有做文本清洗特殊符号干扰指纹。如果数据量达到百万级别内存方案已经扛不住就需要结合数据库分桶策略或者接入Elasticsearch向量检索做大规模新闻去重。