海量文本去重与相似度检索:从 Jaccard 到 MinHash 的完整技术指南
在互联网大数据场景中,如何从海量数据(如百亿网页、千万级商品描述、巨大的开源代码仓库)中快速找出重复或高度相似的内容?这是一个极其经典的工业界痛点。
最朴素的想法是:对文章进行分词,转成集合后两两比对。若有 篇文档,需要比较 次。当 (一千万)时,比较次数约为 50 万亿次。即便单次比较仅需 1 微秒,也需要 1.6 年 才能跑完。这种 复杂度的算法会导致服务器直接卡死崩溃。
本文将结合数学原理、算法推导与工程实战,深入拆解 Jaccard 相似度 的直觉陷阱,以及 MinHash(最小哈希) 算法如何对高维稀疏数据完成降维打击,最终给出可直接落地的工业级实现方案。
Jaccard 相似度(Jaccard Similarity) 是衡量两个集合重合度的标准数学方法。其核心思想非常直观:看两个集合的交集(共同拥有的元素)占它们并集(总共拥有的元素)的比例。
数学公式定义为:
假设我们要对比两篇简短文本的词汇相似度: 文本 A 词集:{ 苹果, 香蕉, 梨, 桃子 }(4个元素) 文本 B 词集:{ 香蕉, 梨