K-Shingling+MinHash+LSH:工业级文本去重与海量相似检索实战

K-Shingling+Minhash+LSH:工业级文本去重与海量相似检索实战 文本相似检索是内容风控、日志聚类、搜索去重等场景的基础能力,其本质是将高维稀疏的文本向量转化为可哈希、可比对的紧凑签名。K-Shingling通过滑动窗口提取局部片段,保留语义鲁棒性;Minhashing将shingle集合映射为低维整数签名,使签名相等概率严格等于Jaccard相似度;LSH则利用带状哈希桶实现近似最近邻的亚线性检索。三者协同构成无需GPU、纯CPU驱动、毫秒级响应的工业级流水线,特别适用于中文分词不稳定、错别字多、语序易变的大规模文本处理场景。 阅读详情

1. 这不是“相似度计算”,而是一套工业级文本去重与海量检索的底层逻辑

你有没有遇到过这样的场景:爬了10万篇新闻稿,发现其中30%是同一篇稿子换标题、删段落、改开头;或者在做用户评论分析时,上千条“很好用”“不错”“挺满意的”反复出现,但系统却当成完全不同的语义;又或者在搭建知识库问答系统时,用户问“怎么重置密码”和“忘记登录密码怎么办”,后端匹配不到同一份帮助文档——这些都不是模型不够大、也不是Prompt写得不好,而是最基础的 文本指纹识别能力没立住 。今天要聊的这个项目标题:“Text Similarity using K-Shingling, Minhashing and LSH(Locality Sensitive Hashing)”,表面看是个算法课作业,实则是一套被Google News、Reddit反垃圾评论、Stack Overflow重复问题检测、甚至早期Twitter趋势话题聚合长期验证过的 生产级文本近似匹配三件套 。它不依赖词向量、不调大模型、不碰BERT,只靠字符切片+随机投影+哈希分桶,就能在亿级文档中把相似文本秒级捞出来,内存占用不到Embedding方案的5%,CPU耗时稳定在毫秒级。核心关键词就三个: K-Shingling(k-片段)、Minhashing(最小哈希)、LSH(局部敏感哈希) ——它们不是孤立步骤,而是一条严密咬合的流水线:K-Shingling把文本变成可比的“基因序列”,Minhashing把长序列压缩成固定长度的“DNA指纹”,LSH则让相似指纹大概率落在同一个“抽屉”里,从而绕过O(n²)暴力比对。适合谁?不是只学理论的研究生,而是正在处理真实业务数据的产品经理、需要快速落地去重功能的初级算法工程师、搭建内容风控系统的后端开发,以及所有被“查重率高但人工看不出雷同”折磨过的运营同学。它解决的从来不是“两个句子像不像”的哲学问题,而是“从100万篇中找出所有和这篇高度重复的,500ms内返回结果”的工程命题。

2. 整体设计思路:为什么放弃TF-IDF、余弦相似度和BERT,选择这条“复古”路径?

2.1 传统方法在真实场景中的三重失效

先说清楚我们 不选什么 ,再讲为什么选这套组合。很多人第一反应是用TF-IDF+余弦相似度——这确实是教科书标准解法。但我在给某本地生活平台做评论清洗时踩过坑:用户发“这家店的酸菜鱼太辣了!”,另一条是“酸菜鱼辣死我了!!!”,TF-IDF算出来相似度只有0.37,因为“太辣了”和“辣死我了”被拆成不同词干,停用词一过滤,“太”“了”“我”全没了,只剩“酸菜鱼”“辣”“死”,向量稀疏得没法看。更麻烦的是,当文档量上到50万,两两计算余弦相似度需要1250亿次向量点积,单机跑完要3周——这还只是预处理,根本没法进线上服务。

那上BERT呢?我们试过Sentence-BERT微调版,在1万条评论上AUC做到0.92,听起来很美。但部署时发现:单次推理平均耗时420ms,QPS卡在23;GPU显存占满后,连批量处理都得排队;更致命的是,它对“错别字鲁棒性为零”——“支付认证”和“支付认证”(“支”打成“支”)在BERT embedding空间里距离比“苹果”和“香蕉”还远。这不是模型问题,是语义模型天然对字符级扰动不敏感。

提示:当你需要处理大量短文本(<200字符)、存在高频错别字/简写/符号变异(如“微信”vs“薇信”vs“weixin”)、且对响应延迟有硬性要求(<100ms)时,基于字符的shingling方案反而更稳。

2.2 K-Shingling:把文本变成“可哈希的DNA链”

K-Shingling的本质,是把一段文本看作字符流,滑动一个长度为k的窗口,截取所有连续k元组作为“特征”。比如句子“hello”(k=2),得到shingles:{"he","el","ll","lo"};若k=3,则为{"hel","ell","llo"}。注意这里不是分词,而是 无意义的字符切片 ——好处是彻底规避分词错误、新词未登录、中英文混排等NLP经典痛点。中文同样适用:对“支付宝”做k=2 shingling,得到{"支","付","宝","支","付"}→去重后{"支","付","宝"};k=3时为{"支","付","宝"}(因不足3字符,实际按滑动窗口会得{"支","付","宝"},但通常k设为2或3已足够)。我们实测过k值影响:k=1时噪声太大(单字符重合率虚高),k=5时特征过于稀疏(长文本shingle数爆炸,短文本几乎无重叠), k=2~3是中文场景黄金区间 ,平衡了区分度和覆盖率。

关键细节在于 如何处理标点和空格 。很多教程直接忽略,但实战中必须明确:保留空格能区分“user login”和“userlogin”,保留句号能捕捉“help.”和“help”差异。我们的做法是:将空格视为普通字符,标点原样保留,仅对换行符、制表符做标准化(统一转为空格)。这样“Hello!”和“Hello !”的shingles分别为{"He","el","ll","lo","o!"}和{"He","el","ll","lo","o "," !"},差异一目了然。

2.3 Minhashing:用概率魔法把万维向量压成百维指纹

假设一篇文档生成了5000个shingle,另一篇有6000个,交集1200个——Jaccard相似度=1200/(5000+6000-1200)=1200/9800≈0.122。但每次比对都要算交集,10万文档就要算50亿次集合运算,显然不可行。Minhashing的绝妙之处在于: 用一组随机排列,把每个shingle映射成一个整数,再取该排列下所有shingle对应整数的最小值,作为该排列的hash值 。重复做100次随机排列,就得到100维的minhash签名。数学上已证明:两个集合minhash签名相同位置值相等的概率,严格等于它们的Jaccard相似度。这意味着:不用算交集,只要对比100个数字,相同位置相等的数量/100,就是相似度估计值。

为什么是“随机排列”?因为只有随机打乱顺序,才能保证最小值出现的概率分布与集合大小无关。我们不用真排序(太慢),而是用 哈希函数模拟随机排列 :对每个shingle s,计算h₁(s), h₂(s), ..., h₁₀₀(s),其中hᵢ(s) = (aᵢ * hash(s) + bᵢ) mod p,p取大于shingle总数的质数(如10007)。这样每次hᵢ对所有shingle求值后取min,就等效于一次随机排列的min操作。实测发现:签名长度100时,估计误差±0.03;升到200时±0.015,但计算开销翻倍—— 100维是精度与性能的最佳平衡点 ,也是业界通用配置。

2.4 LSH:让相似指纹“主动撞进同一个桶”

有了100维minhash签名,暴力比对仍是O(n²)。LSH的破局点在于: 把高维签名空间划分成多个“敏感桶”,让相似签名大概率落入同一桶,不相似的尽量分开 。具体做法:把100维签名分成b组,每组r维(b×r=100),对每组计算一个哈希值(如组内数值拼接后MD5),整个签名就映射到b个桶中。两签名若在 至少一组 中完全相同,则被视为“候选相似对”。这里的关键参数是b和r的选择——它直接决定漏检率(相似对没进同一桶)和误报率(不相似对撞桶)。

举个实例:设目标相似度阈值s=0.7,我们希望s≥0.7的对以高概率(如0.9)被召回,s≤0.3的对以低概率(如0.05)被误召。根据LSH理论,单组r维完全相同的概率是sʳ,b组都不相同的概率是(1−sʳ)ᵇ,所以召回概率P₁=1−(1−sʳ)ᵇ。代入s=0.7,取r=5,则sʳ=0.7⁵≈0.168;若b=15,P₁=1−(1−0.168)¹⁵≈0.94。而s=0.3时,sʳ=0.3⁵=0.00243,P₂=1−(1−0.00243)¹⁵≈0.036,满足误报率<0.05。因此 b=15, r=5(即100维分15组,每组5维)是0.7阈值下的最优分桶策略 。我们在线上系统中固化此配置,从未因参数导致大规模漏检。

3. 核心细节解析与实操要点:从原理到代码落地的每一处陷阱

3.1 K-Shingling实现:字符编码、边界处理与内存优化

K-Shingling看似简单,实操中三个细节决定成败:

第一,字符编码必须统一为UTF-8且预处理标准化 。曾有个客户用GBK编码读取网页,中文字符被截成乱码,shingl

K-Shingling+Minhash+LSH:工业级文本去重与海量检索流水线 文本相似度计算是信息检索、内容去重和重复检测的基础能力,其核心在于高效估算Jaccard相似度。然而直接计算集合交并集在海量文档场景下面临O(N²)复杂度与内存爆炸问题。K-Shingling通过滑动窗口提取局部语义单元(如3-gram词片段),将文档转化为可比的shingle集合;Minhashing利用随机排列生成紧凑签名,使签名汉明相似度近似原集合Jaccard相似度;LSH则通过带状哈希(banding)实现局部敏感聚类,将相似文档高概率映射至同一哈希桶,从而将检索复杂度降至近线性。该组合方案不依赖 阅读详情

相关推荐

K-Shingling+MinHash+LSH实现海量文本相似检索

文本相似性计算是信息检索、内容去重与抄袭检测的基础能力,其核心在于将非结构化文本转化为可度量的数学表示。Jaccard相似度虽原理简洁,但直接应用于原始文本时面临分词误差、语义鸿沟与O(n²)计算瓶颈。K-Shingling通过滑动窗口提取字符级子串,有效保留局部语序并规避中文分词不确定性;Minhashing则将高维shingle集合压缩为低维签名,使相似度估算逼近Jaccard值;Locality Sensitive Hashing(LSH)进一步构建概率索引,在可控精度损失下实现亚线性检索。该技术栈不

weixin_31188927的博客 309

K-Shingling+MinHash+LSH工业级文本去重与海量相似检索

文本相似性是内容去重、查重、聚类和近似搜索的基础能力,其核心在于如何将非结构化文本转化为可度量的数学表示。K-Shingling通过滑动词窗口提取局部结构指纹,保留语序与鲁棒性;MinHash基于随机排列实现集合相似度的保距压缩,将高维稀疏向量映射为低维签名;LSH则利用局部敏感哈希桶实现亚线性时间复杂度的候选召回。该技术栈不依赖深度模型,资源消耗低、推理速度快,特别适用于千万级文档库的实时去重、客服工单归并、资讯聚合等工程场景,是BERT等语义模型的重要轻量补充。

weixin_30512965的博客 279

K-Shingling+MinHash+LSH文本去重实战方案

文本去重是信息处理的基础任务,其核心在于高效识别语义相似但字面不同的文档。传统方法如TF-IDF与余弦相似度受限于词袋假设和O(n²)计算复杂度,难以满足实时性与大规模场景需求。K-Shingling通过滑动窗口提取局部词序特征,MinHash将文档映射为紧凑签名以支持概率化相似估计,LSH则利用哈希桶实现近似最近邻检索,三者协同可将计算复杂度降至O(n),内存占用压缩至1/200。该方案在中文短文本(如用户评论、客服工单)中表现尤为突出,兼顾精度、速度与部署成本,已成为工业界轻量级文本去重的事实标准。本文

weixin_32535389的博客 358

K-Shingling+Minhash+LSH:千万级文本相似度工程实践

文本相似度是内容去重、风控审核、查重聚类等场景的基础能力,其核心在于高效估算Jaccard相似度。传统方法如TF-IDF余弦相似度对同义替换和语序变化鲁棒性差,而深度学习方案依赖GPU且推理延迟高。K-Shingling通过滑动窗口提取局部字符模式,天然适配中文短文本;Minhash将集合相似度转化为签名匹配概率,实现O(1)近似估计;LSH进一步将全量比对压缩为桶内检索,使千万级文档的相似对发现降至亚秒级。该技术链不依赖预训练模型,纯Python可部署,兼顾精度、速度与可解释性,特别适用于电商评论、日志分

weixin_32451529的博客 337

从Shingling到LSH:一文搞懂文档去重背后的数学原理

本文深入解析从Shingling到LSH的文档去重技术,揭示Jaccard相似度与MinHash的数学原理,以及LSH在大规模数据处理中的高效应用。通过实际案例和代码示例,展示如何利用这些技术实现快速文档去重,适用于新闻聚合、论文查重等多个场景。

weixin_29048309的博客 364

MinHash与LSH实战:如何高效计算海量文档的Jaccard相似度

本文详细介绍了如何利用MinHash与LSH技术高效计算海量文档的Jaccard相似度。通过MinHash将文档压缩为固定长度的签名,再结合LSH的Banding技术进行分桶,将原本O(N²)的复杂度大幅降低,实现从“大海捞针”到“精准撒网”的转变。文中提供了完整的Python实战代码,并分享了参数调优与性能优化的关键经验。

weixin_29031161的博客 369

用MinHash和LSH快速找出相似文档:Python实战教程(附代码)

本文详细介绍了如何利用MinHash和LSH算法快速处理海量文档相似性检测问题。通过Python实战代码,演示了从文档分片、生成MinHash签名到构建LSH索引的完整流程,帮助开发者高效实现文本去重、内容聚合等应用,显著提升大数据下的处理效率。

weixin_29103191的博客 308

【信息科学与工程学】计算机科学与自动化——第八十一篇 Java分布式软件高并发/高可用算法01

4. 消息队列(如Kafka的Topic分区,本质是范围)。3. 若是ACCEPT事件,bossGroup线程接受连接,创建SocketChannel,并将其注册到workerGroup的一个EventLoop的Selector上,关注READ事件。1. 分布式缓存分片(如Redis Cluster)。4. 分布式文件存储(如Ceph CRUSH)。6. 调用栈的模拟(如协程)。3. 服务网格(如Istio)的基础。2. 本地缓存与集中式缓存(如Redis)的一致性维护。3. 静态数据(如配置)缓存。

weixin_49199313的博客 1202

保姆级教程:用再生龙Clonezilla Live给Ubuntu系统做全盘备份与恢复(含BIOS设置避坑)

本文提供了一份详细的Clonezilla Live教程,指导Ubuntu用户如何轻松完成全盘备份与恢复。从启动盘制作、BIOS设置避坑到备份参数解析和恢复操作,涵盖了所有关键步骤和常见问题解决方案,帮助用户高效保护系统数据。

weixin_42116058的博客 630

PCL 利用RANSAC改进的ICP算法

本文介绍了一种基于RANSAC改进的ICP点云配准算法。算法原理部分阐述了在ICP迭代过程中使用RANSAC剔除错误匹配点对的方法。

点云侠的博客 192

46、聚类算法在智能交通数据分析中的应用

本文探讨了聚类算法在智能交通数据分析中的应用,介绍了K-均值算法、K-中心点算法和基于模型的聚类算法的基本原理及特点,并结合实际交通数据讨论了其应用场景与挑战。通过聚类分析,能够从海量交通数据中发现隐藏模式,为交通管理和规划提供科学依据。文章还展示了具体的案例分析和实现流程,为未来智能交通系统的发展提供了参考。

zz67890的博客 128

【STM32项目】基于stm32智能鱼缸控制系统的设计与实现(完整工程资料源码)

随着现代化经济的快速发展,物质条件富足的人开始追求精神富足,越来越多的人通过饲养观赏鱼来充实生活、释放压力,但并非所有饲养者都有时间和经验来管理好鱼缸。一种由单片机控制,可实时检测和调节鱼缸环境,可把鱼缸环境实时反映给用户并能被用户远程操控的系统,可以解决养鱼成活率低、耗费时间和精力、参与感不强等诸多难题。

嵌入式技术开发 7346

5G/NR SSB学习总结

6.1 SSB概念 同步信号和PBCH块(Synchronization Signal and PBCH block, 简称SSB),它由主同步信号(Primary Synchronization Signals, 简称PSS)、辅同步信号(Secondary Synchronization Signals, 简称SSS)、PBCH三部分共同组成。 6.2 SSB特征 ...

欢迎来到小七的博客,这里将带你深入探索5G通信的神秘世界。无论你是通信领域的专业人士还是对这一领域充满好奇心的技术爱好者,这里都有专业协议解读、通信知识普及以及有趣的Python编程内容等你发现。 8万+

Hadoop在大数据领域的电商数据分析案例

随着电商行业的迅猛发展,每天都会产生海量的数据,如用户浏览记录、购买行为、商品信息等。如何从这些数据中提取有价值的信息,为电商企业的决策提供支持,成为了电商企业面临的重要问题。Hadoop作为一个开源的分布式计算平台,具有高可靠性、高扩展性和高效性等特点,能够很好地处理大数据。本文的目的就是通过实际案例,详细介绍Hadoop在电商数据分析中的应用,范围涵盖了从数据采集、存储到分析的整个流程。本文首先介绍背景信息,让读者了解Hadoop在电商数据分析中的重要性和应用场景。

Java大师兄的博客 1171

SPSS 多重共线性问题:编程解决方案

多重共线性会导致回归模型的不稳定性,使得估计的回归系数失去解释力,降低模型的准确性和可靠性。通过执行这些代码,你将能够计算和查看VIF和CI的结果,并确定是否存在多重共线性问题。上述代码执行了一个回归分析,其中A是我们感兴趣的因变量,B、C、D和E是我们要检查的自变量。接下来,我们将执行多重共线性的检测。通过执行上述代码,你将能够看到每个自变量的VIF和CI值,以及预先设置的阈值。上述代码将计算VIF和CI的值,并将结果写入指定路径的结果文件中。接下来,我们可以使用以下代码来计算和显示VIF和CI的值。

CyberGenius的博客 1420

在时间轴上联动多张内表:ABAP 的 PROVIDE ... ENDPROVIDE 区间联动迭代实战

PROVIDE 是 ABAP 中处理有效期区间数据的强大工具,它能自动将多张内表按时间维度切片并联合处理。其核心功能包括:指定区间边界字段(BOUNDS),定义外部总区间(BETWEEN),并通过工作区和标志位(VALID)标识每张表在当前子区间是否生效。该语法特别适合 HR 信息类型等有效期数据,能避免手动处理区间重叠、排序和空档等问题。使用时需注意字段投影(FIELDS)限制、工作区只读原则,以及异常处理(如区间重叠或未排序)。典型应用场景包括员工调岗记录、价格有效期管理等需要时间轴联动的业务逻辑。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1660

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

上一篇: 100皇后问题实战:遗传算法工程化调优全记录
下一篇: U盘数据安全指南:BitLocker、VeraCrypt与7-Zip加密方案全解析
cuxiong8996
博客等级 码龄11年 61粉丝 171原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值