如何对新闻数据进行模糊去重 📅 2026/8/5 4:30:28 什么是新闻模糊去重新闻场景里大量转载稿件标题加【快讯】【最新】、修改标点、删减导语、微调部分语句但整篇新闻本质是同一篇。完全字符串相等、MD5是精准去重处理不了这种改写转载需要模糊去重。模糊去重目标内容高度相似、局部修改的新闻识别为重复不完全依赖字符串完全一致。痛点标题改几个字MD5直接失效正文删改几句话直接比对文本不相等不能把主题相似但完全不同的新闻误判重复主流工业方案SimHash局部敏感哈希是新闻/舆情领域模糊去重首选备选文本相似度算法、向量语义去重。前置文本清洗模糊去重必须做网页新闻自带HTML标签、换行、空格、特殊符号【】《》、广告尾注这些噪声会直接毁掉指纹计算所有模糊去重前先清洗。importreimportjiebadefclean_news(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 局部敏感哈希新闻最常用核心原理相似文本生成的指纹汉明距离很小文本差异越大汉明距离越大。相同含义少量文字改动指纹依然接近完全不同文本指纹差异巨大。完整可运行代码importhashlibimportjiebadefget_md5_hash(s:str):returnint(hashlib.md5(s.encode(utf-8)).hexdigest(),16)defsimhash(text:str,bit64)-int: jieba分词版simhash适合中文新闻 :param text:清洗之后的文本标题/正文摘要 :param bit:指纹位数默认64位 :return:simhash指纹整数 wordsjieba.lcut(text)v[0]*bitforwordinwords:hget_md5_hash(word)foriinrange(bit):ifhi1:v[i]1else:v[i]-1fingerprint0foriinrange(bit):ifv[i]0:fingerprint|1ireturnfingerprintdefhamming_distance(fp1:int,fp2:int)-int:计算两个指纹汉明距离数值越小越相似returnbin(fp1^fp2).count(1)业务阈值新闻项目实测经验汉明距离 两个指纹二进制位不一样的数量≤2几乎完全相同判定重复3‑4转载改写新闻业务直接判定重复≥5判定为不同新闻# 测试案例转载新闻news_aclean_news(央行宣布下调存款准备金率0.5个百分点)news_bclean_news(【快讯】央行宣布下调存款准备金率0.5个百分点)fp_asimhash(news_a)fp_bsimhash(news_b)disthamming_distance(fp_a,fp_b)print(f汉明距离{dist})ifdist4:print(✅判定为重复新闻)内存中批量模糊去重示例⚠️注意直接双重循环 O(n²)只适合小数据集几千条以内news_data[{title:央行宣布下调存款准备金率0.5个百分点,content:xxx},{title:【快讯】央行宣布下调存款准备金率0.5个百分点,content:xxx},{title:油价迎来年内第七次上调,content:yyy}]distinct[]forcurrinnews_data:tclean_news(curr[title])curr_fpsimhash(t)is_dupFalseforexistindistinct:dhamming_distance(curr_fp,exist[fp])ifd4:is_dupTruebreakifnotis_dup:distinct.append({data:curr,fp:curr_fp})print(f原始{len(news_data)},模糊去重后{len(distinct)})海量数据问题说明上面直接双重循环1万条新闻就要1亿次比对性能爆炸。百万新闻生产环境不能直接两两比对解决方案SimHash分桶。把64位指纹切分成4段每段16bit同一段指纹相同才放入同一个桶。只比对同一个桶内的指纹大幅减少比对次数。方案二difflib 序列相似度小数据备选不需要第三方库直接计算文本相似度比值适合几千条以内小规模数据。fromdifflibimportSequenceMatcherdeftext_similarity(a:str,b:str)-float:returnSequenceMatcher(None,a,b).ratio()t1clean_news(央行宣布下调存款准备金率0.5个百分点)t2clean_news(【快讯】央行宣布下调存款准备金率0.5个百分点)scoretext_similarity(t1,t2)print(f相似度:{score:.2f})# 业务阈值大于0.85视为重复ifscore0.85:print(判定重复)缺点数据量大O(n²)很慢长文本改动局部内容分数会暴跌不如SimHash稳定。方案三向量语义模糊去重大模型路线SimHash是字面层面改写幅度很大换表达方式但是语义相同的新闻SimHash会失效。这时使用Embedding向量调用中文向量模型bge‑small等每条新闻生成向量计算向量余弦相似度大于阈值判定重复海量数据存入向量数据库FAISS / Milvus / ES向量优点真正语义层面识别缺点算力开销大需要模型速度慢适合舆情高级分析。生产落地实践要点用标题还是正文短标题只拿标题做simhash阈值汉明距离≤3长新闻建议取标题前200字正文摘要生成指纹不要用全文全文太长会稀释特征。不要丢掉精准去重流程先MD5精准命中完全一样新闻命中不到再走SimHash模糊比对。兼顾速度和模糊识别。踩坑点不要不清洗直接丢给simhash特殊符号会直接改变指纹短文本不要把汉明距离阈值调太大容易误判禁止直接双重循环处理上万条新闻性能爆炸必须分桶。数据库存储设计MySQL存储simhash指纹方便爬虫入库去重CREATETABLEnews(idBIGINTAUTO_INCREMENTPRIMARYKEY,titleVARCHAR(512),contentTEXT,title_md5CHAR(32),simhash_fpBIGINTUNSIGNEDCOMMENT64位simhash指纹,INDEXidx_md5(title_md5));业务逻辑新新闻清洗文本生成title_md5、simhash_fp查询md5命中直接判定重复md5无命中再做simhash分桶比对判断是否模糊重复。方案对比总结方案能力适用场景缺点SimHash字面模糊抗转载改写爬虫、舆情新闻工业首选大幅度语义改写识别弱大数据需要分桶优化difflib相似度字面相似度几千条以内小数据集大数据性能差Embedding向量语义层面模糊去重高级舆情分析需要模型算力消耗大绝大多数新闻爬虫业务清洗 jieba版SimHash就是性价比最高的模糊去重方案。