展开菜单
首页 精品内容 本月促销 装机必备 Windows macOS软件 IOS软件 Android AI PDF教程 专题
全部分类

当前位置:

首页 > 编程开发 > Python实现对新闻数据去重处理的方法详解

Python实现对新闻数据去重处理的方法详解

前言 做新闻爬虫、新闻数据分析、舆情项目的时候,大家肯定会遇到一个头疼的问题:海量重复新闻数据。同一篇新闻被多家网站转载,标题改一两个字、内容局部修修补补、发布时间不同,但本质就是同一条新闻。如果不去重,统计结果失真、数据库膨胀、分析结果被重复样本干扰,整个项目都会跑偏。 新闻去重和普通文本去重还真

前言

做新闻爬虫、新闻数据分析、舆情项目的时候,大家肯定会遇到一个头疼的问题:海量重复新闻数据。同一篇新闻被多家网站转载,标题改一两个字、内容局部修修补补、发布时间不同,但本质就是同一条新闻。如果不去重,统计结果失真、数据库膨胀、分析结果被重复样本干扰,整个项目都会跑偏。

Python实现对新闻数据去重处理的方法详解

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

这篇文章会从简单到工业可用,分享几套Python处理新闻数据的实用方案,涵盖精准去重、模糊去重、海量新闻场景优化,希望能帮到正在做类似项目的朋友。

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

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

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

import hashlib

def get_md5(text: str) -> str:
    """文本生成md5"""
    return hashlib.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 = []
for item in news_list:
    title = item["title"].strip()
    h = get_md5(title)
    if h not in seen:
        seen.add(h)
        distinct_news.append(item)

print(f"原始:{len(news_list)} 去重后:{len(distinct_news)}")

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

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

新闻网页拿到的数据常常混杂HTML标签、换行、空格、特殊符号、【】、#、摘要标记。无论后面用哪种算法,一定要先清洗文本,这一步直接决定了去重效果的下限。

import re

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

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

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

新闻去重最经典的算法当属SimHash。核心思想:把长文本转为指纹,指纹相似度高就判定为重复新闻。即使改几个字、增删几句话,依然可以识别是同一篇新闻。非常适合转载新闻、正文局部改动、标题微调的场景。

simhash简单实现

import hashlib

def get_hash(s):
    return int(hashlib.md5(s.encode("utf-8")).hexdigest(), 16)

def simhash(text: str, bit=64):
    words = list(text)
    v = [0]*bit
    for word in words:
        h = get_hash(word)
        for i in range(bit):
            if h >> i & 1:
                v[i] +=1
            else:
                v[i] -=1
    fingerprint = 0
    for i in range(bit):
        if v[i]>0:
            fingerprint |= 1 << i
    return fingerprint

def hamming_distance(h1, h2):
    return bin(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 判定为重复新闻
if dist <=3:
    print("判定为重复新闻")

业务经验阈值:

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

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

结合jieba分词优化simhash

import jieba

def simhash_by_jieba(text:str, bit=64):
    words = jieba.lcut(text)
    v = [0]*bit
    for w in words:
        h = get_hash(w)
        for i in range(bit):
            if h >> i &1:
                v[i] +=1
            else:
                v[i] -=1
    fp =0
    for i in range(bit):
        if v[i]>0:
            fp |= 1 <

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

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

适合小数据集,直接计算文本相似度得分,简单开箱即用。

from difflib import SequenceMatcher

def text_similarity(a:str,b:str)->float:
    return SequenceMatcher(None,a,b).ratio()

t1 = clean_news_text("大模型产业正在快速发展")
t2 = clean_news_text("快讯:大模型产业正在快速发展!")

score = text_similarity(t1,t2)
print(f"相似度得分:{score:.2f}")
if score >=0.85:
    print("判定重复新闻")

优点:简单,无需第三方库;缺点:数据量大的时候复杂度是O(n²),上万条新闻就会很慢,适合小批量处理。

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

爬虫入库的时候,我们通常不希望内存保存全部指纹,而是把指纹存到MySQL。流程如下:

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

建表参考:

CREATE TABLE news(
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    title VARCHAR(500),
    content TEXT,
    source VARCHAR(100),
    publish_time DATETIME,
    title_md5 CHAR(32),
    simhash_fp BIGINT UNSIGNED,
    INDEX idx_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向量检索做大规模新闻去重。

本文内容来源于互联网,如有侵权请联系删除。
作者最新文章
编程开发 Python
相关文章 更多
精品专题 更多
本月促销

正软商城本月促销专区,汇集办公、设计、安全、影音、系统工具及AI软件等正版软件优惠活动,提供限时折扣、特价授权和优惠购买信息,活动库存及价格以页面实时展示为准。

装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

IOS软件

正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

AI

正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
灵活计算器
灵活计算器

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

赤友清理大师
赤友清理大师

赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

图几
图几

图几是一款适用于 macOS 的截图、标注与美化工具,支持离线操作保障隐私。界面整理和高频系统操作被放到一起考虑,桌面或窗口内容一多时,管理起来会更省心。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

Menuist
Menuist

Menuist 是一款面向 macOS 的 Finder 右键菜单增强工具,主要用来补充新建文件、快捷导航等常用操作,让日常文件管理和访问路径时更高效、更顺手。

Mole
Mole

Mole 是一款专为 Mac 设计的深度清理优化工具,涵盖缓存清理、应用管理及实时状态监控等功能。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

WINDOWS 更多
Windows 10
Windows 10

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

傲梅轻松备份
傲梅轻松备份

傲梅轻松备份是一款专业易用的数据备份软件,为重要数据提供安全保障。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

Wise Folder Hider Pro
Wise Folder Hider Pro

Wise Folder Hider Pro 是一款专业级文件和文件夹隐藏加密软件,为私密数据添加多重保护。高频操作更强调就近处理,浏览、整理和跨目录移动文件时,来回切换和重复点击都会少很多。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

PinStack
PinStack

PinStack是一款轻量级的Windows平台剪贴板管理工具,优化您的剪贴板使用体验。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

Seer
Seer

Seer是一款在Win平台下的空格键功能增强效率工具,只需轻敲空格键,就能预览几乎任何格式的文件。它更适合把零散的小功能集中起来使用,处理高频琐碎任务时会更省事。