当前位置:

首页 > 编程开发 > 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
    相关文章 更多
    PHP递归性能优化技巧与迭代替代方案
    PHP递归性能优化技巧与迭代替代方案

    解析PHP递归函数在树形数据处理中的性能瓶颈,提供预加载数据消除I/O、使用显式栈替代深层递归的实战方案,帮助开发者在代码可读性与执行效率间做出合理取舍。

    Java测试中怎么使用Mockito模拟依赖对象
    Java测试中怎么使用Mockito模拟依赖对象

    详细讲解在Java单元测试中如何使用Mockito模拟依赖对象,包括引入依赖、创建Mock、打桩返回值、行为验证以及Mock与Spy的核心差异和常见陷阱排查。

    链表删除节点的时间复杂度是多少及其详细分析
    链表删除节点的时间复杂度是多少及其详细分析

    详细分析链表删除节点的时间复杂度,深入探讨单链表与双向链表在不同已知前提下的查找与删除开销,并结合完整代码与清晰图解进行对比总结。

    codex如何配置模型参数及文件设置教程
    codex如何配置模型参数及文件设置教程

    想知道如何让AI写出的代码更贴合你的习惯?本文手把手教你在VS Code中调整Codex相关模型参数,通过修改配置文件优化温度值和令牌限制,解决代码建议不准确或响应慢的问题。

    Claude Code AI编程工具实力揭秘与编程助手实测
    Claude Code AI编程工具实力揭秘与编程助手实测

    通过实测展示Claude Code在终端中如何理解自然语言指令、自动修改代码文件并处理复杂编程任务,帮助开发者评估其实际辅助能力。

    winforms教程自学入门与基础开发步骤详解
    winforms教程自学入门与基础开发步骤详解

    本教程详细讲解如何使用Visual Studio创建WinForms项目,通过添加按钮和标签控件并编写点击事件代码,实现一个基础的计数器功能,适合C#初学者快速上手Windows窗体应用开发。

    Cursor自动补全设置教程教你快速开启代码补全功能
    Cursor自动补全设置教程教你快速开启代码补全功能

    详解Cursor编辑器中自动补全功能的开启与优化设置,涵盖Tab触发机制、上下文窗口调整及模型切换,帮助开发者解决补全延迟、干扰大等问题,提升编码流畅度。

    pandas的数据格式怎么转换和设置方法教程
    pandas的数据格式怎么转换和设置方法教程

    详解Pandas中数据格式转换的核心方法,包括astype强制转换、to_numeric容错处理及日期解析技巧,解决常见类型错误并提升数据处理效率。

    VS Code中文设置方法 简体语言包安装与切换教程
    VS Code中文设置方法 简体语言包安装与切换教程

    详细介绍在Visual Studio Code中安装Chinese (Simplified)语言包的方法,包括通过扩展市场搜索、安装及自动重启切换至简体中文界面的完整步骤,帮助开发者快速将编辑器本地化。

    cursor安装过程无法更改安装位置的解决方法
    cursor安装过程无法更改安装位置的解决方法

    针对Cursor安装包默认锁定C盘且无路径选择界面的问题,提供通过手动移动文件并创建目录联结(Symbolic Link)的解决方案,实现将软件安装在其他磁盘分区。

    查看更多
    精品专题 更多
    装机必备
    装机必备

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

    Windows
    Windows

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

    macOS软件
    macOS软件

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

    Mac软件 更多
    photoshop
    photoshop
    Windows、macOS 、 iPad

    Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

    Blender
    Blender
    Windows、macOS 和 Linux

    Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

    灵活计算器
    灵活计算器
    macOS/iOS/Android

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

    WINDOWS 更多
    3dmax(3ds max)
    3dmax(3ds max)
    Windows

    Autodesk 3ds Max 是一款专业的三维建模、动画与渲染软件,广泛应用于建筑可视化、游戏开发、影视动画、广告设计和产品展示等领域。

    photoshop
    photoshop
    Windows、macOS 、 iPad

    Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

    Blender
    Blender
    Windows、macOS 和 Linux

    Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。