如何对局部敏感哈希值进行相似检索?

简介: 利用SimHash与海明距离可判断文档相似性。为提升检索效率,Google采用抽屉原理:将64位哈希值均分4段,若两值海明距离≤3,则至少有一段完全相同。据此建立4个倒排索引,每段16位作键,查询时仅需匹配同段相同的文档,大幅缩小范围,实现海量数据下高效去重。

和其他局部敏感哈希函数一样,如果两个文档的 SimHash 值的海明距离小于 k,我们就认为它们是相似的。举个例子,在 Google 的实现中,k 的取值为 3。这个时候,检索相似文章的问题变成了要找出海明距离在 3 之内的所有文档。如果是一个个文档比对的话,这就是一个遍历过程,效率很低。有没有更高效的检索方案呢?

一个直观的想法是,我们可以针对每一个比特位做索引。由于每个比特位只有 0 和 1 这 2 个值,一共有 64 个比特位,也就一共有 2*64 共 128 个不同的 Key。因此我们可以使用倒排索引,将所有的文档根据自己每个比特位的值,加入到对应的倒排索引的 posting list 中。这样,当要查询和一个文档相似的其他文档的时候,我们只需要通过 3 步就可以实现了,具体的步骤如下:

  1. 计算出待查询文档的 SimHash 值;
  2. 以该 SimHash 值中每个比特位的值作为 Key,去倒排索引中查询,将相同位置具有相同值的文档都召回;
  3. 合并这些文档,并一一判断它们和要查询的文档之间的海明距离是否在 3 之内,留下满足条件的。

我们发现,在这个过程中,只要有一个比特位的值相同,文档就会被召回。也就是说,这个方案和遍历所有文档相比,其实只能排除掉「比特位完全不同的文档」。因此,这种方法的检索效率并不高。

这又该怎么优化呢?Google 利用 抽屉原理 设计了一个更高效的检索方法。什么是抽屉原理呢?简单来说,如果我们有 3 个苹果要放入 4 个抽屉,就至少有一个抽屉会是空的。那应用到检索上,Google 会将哈希值平均切为 4 段,如果两个哈希值的比特位差异不超过 3 个,那这三个差异的比特位最多出现在 3 个段中,也就是说至少有一个段的比特位是完全相同的!因此,我们可以将前面的查询优化为「有一段比特位完全相同的文档会被召回」。

根据这个思路,我们可以将每一个文档都根据比特位划分为 4 段,以每一段的 16 个比特位的值作为 Key,建立 4 个倒排索引。检索的时候,我们会把要查询文档的 SimHash 值也分为 4 段,然后分别去对应的倒排索引中,查询和自己这一段比特位完全相同的文档。最后,将返回的四个 posting list 合并,并一一判断它们的的海明距离是否在 3 之内。

通过使用 SimHash 函数和分段检索(抽屉原理),使得 Google 能在百亿级别的网页中快速完成过滤相似网页的功能,从而保证了搜索结果的质量。

相关文章
|
运维 安全 Linux
linux麒麟系统二级等保【三权分立策略】
linux麒麟系统二级等保【三权分立策略】
2521 0
|
11月前
|
存储 算法 Java
哈希查找算法
哈希查找算法,又称散列查找算法,是一种通过哈希表快速定位目标元素的查找方法。其核心在于利用哈希函数将元素映射到表中的一个位置,从而实现高效查找,平均时间复杂度为O(1)。该算法适用于有序或无序序列,关键在于构建合适的哈希表并处理可能出现的哈希冲突。
1165 0
|
机器学习/深度学习 数据可视化 计算机视觉
轻量化Backbone | 如何改进MobileViT-v1与MobileViT-v2?MobileViT-v3带你实验
轻量化Backbone | 如何改进MobileViT-v1与MobileViT-v2?MobileViT-v3带你实验
1411 0
轻量化Backbone | 如何改进MobileViT-v1与MobileViT-v2?MobileViT-v3带你实验
|
3月前
|
人工智能 JSON BI
Claude Code + DeepSeek V4 唯一的遗憾要被补齐了:多模态识图灰度上线
JeecgBoot AI专题研究 用 DeepSeek V4 几乎完美替代 Claude,唯一卡点就是不收图——这块短板马上要补上![](https://oscimg.oschina.net/oscnet/up9146c3ec0c19f2abe92a111fbac35c4e462.png) 一句
2742 2
Claude Code + DeepSeek V4 唯一的遗憾要被补齐了:多模态识图灰度上线
|
机器学习/深度学习 数据处理
大语言模型中的归一化技术:LayerNorm与RMSNorm的深入研究
本文分析了大规模Transformer架构(如LLama)中归一化技术的关键作用,重点探讨了LayerNorm被RMSNorm替代的原因。归一化通过调整数据量纲保持分布形态不变,提升计算稳定性和收敛速度。LayerNorm通过均值和方差归一化确保数值稳定,适用于序列模型;而RMSNorm仅使用均方根归一化,省略均值计算,降低计算成本并缓解梯度消失问题。RMSNorm在深层网络中表现出更高的训练稳定性和效率,为复杂模型性能提升做出重要贡献。
3632 14
大语言模型中的归一化技术:LayerNorm与RMSNorm的深入研究
|
7月前
|
SQL 分布式计算 运维
XXLJOB:超长定时任务慢节点优化实践
本文针对ODPS大宽表任务运行慢、回刷成本高等问题,通过定位耗时卡点,发现数据倾斜与计算堆积是主因。结合视图落表、节点拆分、前置裁剪、mapjoin与distmapjoin优化等手段,将任务产出时间从13:00提前至8:30,节省超4小时,显著提升效率并降低资源消耗。
|
7月前
|
存储 算法 Java
时间空间复杂度入门
初学者只需掌握:时空复杂度用Big O表示,如O(1)、O(n)、O(n²),忽略常数与低阶项。一般分析最坏情况,越小越好。时间复杂度看循环嵌套层数,空间复杂度看额外内存占用。n通常指输入规模(如数组长度)。注意这是估算,不需精确计算。
|
7月前
|
机器学习/深度学习 人工智能 自然语言处理
认识AI
本文介绍了AI核心概念及大模型开发原理,涵盖人工智能发展历程与Transformer神经网络的关键作用。重点解析了Transformer的注意力机制及其在自然语言处理中的应用,揭示大语言模型(LLM)如何通过持续生成实现连贯文本输出,帮助理解GPT等模型的工作机制。
|
7月前
|
存储 算法 Java
03 | 哈希检索:如何根据用户 ID 快速查询用户信息?
本文介绍了哈希表的原理与实现。通过哈希函数将键转换为数组下标,利用数组的随机访问特性实现O(1)级查询。针对哈希冲突,讲解了开放寻址法和链表法两种解决方案,并分析其优劣。最后指出哈希表虽高效,但存在空间消耗大、无序等缺点,适用场景需权衡。
|
机器学习/深度学习 人工智能 自然语言处理
【深度学习】python之人工智能应用篇——视频生成技术
视频生成技术是一种基于深度学习和机器学习的先进技术,它使得计算机能够根据给定的文本、图像、视频等单模态或多模态数据,自动生成符合描述的、高保真的视频内容。这种技术主要依赖于深度学习模型,如生成对抗网络(GAN)、自回归模型(Auto-regressive Model)、扩散模型(Diffusion Model)等。其中,GAN由两个神经网络组成:一个生成器用于生成逼真的图像或视频,另一个判别器用于判断生成的图像或视频是否真实。通过不断的对抗学习,生成器和判别器共同优化,以产生更高质量的视频。
1095 2

热门文章

最新文章