MinHash 去重策略:小白也能轻松上手的大规模文本去重神器

MinHash 去重策略:小白也能轻松上手的大规模文本去重神器

大家好!今天我们来聊一个在大数据时代特别实用的技术——MinHash 去重策略。如果你刚接触数据处理、网页爬虫、AI 训练数据清洗等场景,经常会遇到一个头疼的问题:手里有成千上万甚至上亿篇文本,怎么快速找出重复或几乎一模一样的文章?

直接一个个比对?太慢了!MinHash 就是专门为这种大规模“近似去重”而生的工具。它能快速判断两篇文本是否高度相似,而且速度快、内存省。下面我们用最通俗的语言,一步步带你搞懂它。

为什么需要近似去重?

  • 完全重复:两篇文章一字不差,用普通哈希(如 MD5)就能轻松检测。
  • 近似重复:有人改了几个词、加了广告、换了标题……内容 90% 一样,这时候普通哈希就失效了。

MinHash 的强项就是捕捉这种“近似重复”,特别适合新闻聚合、爬虫去重、AI 训练数据清洗等场景。

MinHash 的核心思路:把文本变成集合,再估算相似度

第一步:把文本切成“小瓦片”(Shingling)

我们先把一篇文本切成很多重叠的小片段,这些片段叫 shingle(也叫 k-gram)。

举个例子,句子:“我喜欢吃苹果”

k=3 的 3-gram(每个片段 3 个字符)切分:

  • “我喜欢”
  • “喜欢吃”
  • “欢吃苹”
  • “吃苹果”

得到一个集合:{“我喜欢”, “喜欢吃”, “欢吃苹”, “吃苹果”}

如果用 k=2 的 2-gram:

  • “我喜”
  • “喜欢”
  • “欢吃”
  • “吃苹”
  • “苹果”

两篇文章越相似,它们的 shingle 集合重叠的部分就越多。

小贴士:实际项目中,中文常用 k=3~5,英文常用 k=5~10。k 越大越能捕捉长距离相似,但计算量也更大。
第二步:用 Jaccard 相似度衡量集合相似性

两个集合 A 和 B 的 Jaccard 相似度公式很简单:

相似度 = |A ∩ B| / |A ∪ B|
(交集元素个数 ÷ 并集元素个数)

  • 完全一样 → 相似度 = 1
  • 完全没重叠 → 相似度 = 0
  • 改了几个字 → 相似度可能 0.85~0.95

理论上完美,但问题来了:当你有上亿篇文章时,两两计算 Jaccard 根本不可能,太慢了!

第三步:MinHash 登场——用“签名”快速估算 Jaccard

MinHash 的神奇之处在于:它能把一个巨大的 shingle 集合压缩成一个短小的“数字签名”(signature),而且两个签名的相似比例 ≈ 原来集合的 Jaccard 相似度。

怎么做到的呢?

  1. 准备很多个(比如 100~200 个)随机哈希函数(可以理解为随机“洗牌”规则)。
  2. 对集合里的每个 shingle,用所有哈希函数算出一个数字。
  3. 对每个哈希函数,取它在集合中产生的最小值 → 这就是这个哈希函数对应的 MinHash 值。
  4. 把所有 MinHash 值排成一列,就得到了这个文档的“签名”。

关键性质(概率魔力):

两个集合的 MinHash 签名在同一位置取值相同的概率,正好等于它们的 Jaccard 相似度!

所以,我们只需比较两个短签名中有多少位置相同,就能估算出原始文本的相似度。超级高效!

第四步:再加速——LSH(局部敏感哈希)

光有 MinHash 签名还不够,上亿文档两两比还是太慢。我们再加一层 LSH(Locality-Sensitive Hashing)技巧:

  • 把签名分成若干段(比如分成 20 段,每段 5~10 个值)。
  • 对每一段再做一次普通哈希,得到一个“桶号”。
  • 只有落在同一个桶里的文档,才拿去精确比较完整签名。

原理:高度相似的文档,大概率会在至少某一“段”里撞桶;不相似的基本不会撞。

这样,候选对的数量大幅减少,整体速度能提升几百上千倍!

MinHash 去重完整流程

  1. 对每篇文档做 shingling → 得到集合
  2. 计算 MinHash 签名(固定长度,比如 128 或 256)
  3. 用 LSH 把签名分桶,找出候选相似对
  4. 对候选对计算签名相似度,超过阈值(如 0.8)就视为重复,只保留一篇

实际应用场景

  • 搜索引擎:检测重复网页(Google 早期就用过类似技术)
  • AI 大模型训练:清洗万亿级文本数据,去除重复样本
  • 新闻聚合:把同一事件的报道聚成一类
  • 爬虫系统:避免抓取重复页面
  • 抄袭检测:快速筛查高度相似文章

优点与缺点

优点

  • 速度快、内存省,能处理亿级数据
  • 准确度可控(多用几个哈希函数就更准)
  • 实现简单,有现成库

缺点

  • 是概率算法,有极小概率漏掉或误判(实际影响很小)
  • 需要调参(哈希函数数量、LSH 分段数、相似度阈值)

动手玩一玩

Python 有超级好用的库 datasketch,几行代码就能实现:

from datasketch import MinHash, MinHashLSH # 创建 LSH lsh = MinHashLSH(threshold=0.8, num_perm=128)# 对每篇文档创建 MinHash m1 = MinHash(num_perm=128)for shingle in doc1_shingles: m1.update(shingle.encode('utf8')) lsh.insert("doc1", m1)# 查询相似文档 result = lsh.query(m1)# 返回所有相似 doc 的 id

写在最后

MinHash + LSH 是大数据近似去重领域的经典组合,简单、强大、实用。无论是做爬虫、清洗数据集,还是构建推荐系统,掌握它都能让你事半功倍。

希望这篇零基础讲解能帮你快速入门!如果有任何疑问,欢迎留言交流,我们一起玩转数据去重~ 😄

后记

2026年1月2日于上海, 在grok fast辅助下完成。

Read more

【Git:远程操作和标签管理】从克隆到推送:Git 远程协作与标签管理实战指南

【Git:远程操作和标签管理】从克隆到推送:Git 远程协作与标签管理实战指南

🔥艾莉丝努力练剑:个人主页 ❄专栏传送门:《C语言》、《数据结构与算法》、C/C++干货分享&学习过程记录、Linux操作系统编程详解、笔试/面试常见算法:从基础到进阶、测试开发要点全知道 ⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平 🎬艾莉丝的简介: 目录 艾莉丝的Gitee地址 1  ~>  远程操作 1.1  理解分布式版本控制系统 1.2  远程仓库 1.3  创建远程仓库 1.4  克隆远程仓库 1.4.1  使用HTTPS方式 1.4.2  使用SSH方式 1.5  向远程仓库推送 1.6

By Ne0inhk

从开源到落地:SimpleBGC 三轴稳像平台全栈技术解析(上)

引言:为什么选择 SimpleBGC? 在无人机航拍、工业检测、机器人视觉等场景中,“稳定” 是核心需求 —— 哪怕设备轻微抖动,也会导致画面模糊、数据偏差。而市面上专业稳像设备(如大疆 Ronin 系列)动辄数千元,且闭源架构无法自定义扩展。 SimpleBGC 的出现打破了这一局面:它以开源架构为核心,硬件设计文件、固件代码完全公开,成本仅为专业设备的 1/5~1/10,同时支持从微型运动相机到工业级负载的全场景适配。无论是电子爱好者 DIY、学生做科创项目,还是中小企业开发定制化设备,SimpleBGC 都是性价比极高的选择。 本文将从 “硬件电路设计→软件代码解析→软件算法分析” 三个维度,带大家彻底搞懂这款开源稳像平台的技术细节,即使是刚接触嵌入式开发的新手,也能跟着步骤理解原理、动手实践。 第一部分:SimpleBGC 硬件电路设计 —— 开源架构下的模块化方案 SimpleBGC 的硬件设计遵循 “模块化、

By Ne0inhk
别在自己造轮子了!推荐一款功能炸裂的开源人工智能解决方案,内置产品级IOC、以图搜图,人像搜索

别在自己造轮子了!推荐一款功能炸裂的开源人工智能解决方案,内置产品级IOC、以图搜图,人像搜索

💂 个人网站:IT知识小屋🤟 版权: 本文由【IT学习日记】原创、在ZEEKLOG首发、需要转载请联系博主💬 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 文章目录 * 简介 * 开发环境 * 功能模块 * 开源地址&使用手册 * 写在最后 简介 本项目是一款依托于JAVA实现的通用人工智能解决方案,涵盖了模型训练、推理到Web/桌面应用的一整套AI功能。支持产品级OCR文字识别(可自定义模板)、图像搜索、人脸检索、智能抠图、照片上色、图像增强、机器翻译、RAG搜索以及大模型接入等,可开箱即用。 系统采用主流技术栈:SpringBoot + Vue搭建,后端使用SpringBoot提供API服务,前端基于Vue实现可视化管理,支持模块化部署和二次开发。项目代码完全开源,模块之间高度解耦,用户可按需引入,灵活扩展,特别适合需要快速集成 AI 功能的企业与个人开发者。

By Ne0inhk
从安装到代码提交:Git 远程协作中 90% 的问题都能在这里找到答案

从安装到代码提交:Git 远程协作中 90% 的问题都能在这里找到答案

工欲善其事,必先利其器。 目录 * 安装 Git 的步骤: * 本地Git与远程仓库连接及操作全指南 * 一、本地仓库初始化与远程仓库连接 * 1. 初始化本地Git仓库 * 2. 关联远程仓库 * 1. 查看当前分支状态 * 2. 新建本地分支 * 方法1:基于当前分支创建新分支 * 方法2:创建并直接切换到新分支(推荐) * 方法3:基于远程分支创建本地分支 * 3. 切换到已有的本地分支 * 二、分支管理与远程分支同步 * 1. 查看远程分支 * 2. 拉取远程分支到本地 * 三、代码提交与推送到远程仓库 * 1. 常规提交流程 * 2. 简化推送命令 * 四、远程仓库信息查看与更新 * 1. 查看远程仓库详细信息 * 2. 同步远程仓库最新数据 * 五、常见问题解决与优化配置 * 1. 网络与连接问题修复 * 2. 推送大文件或提升传输稳定性

By Ne0inhk