我打算将它们存储在sql数据库中(可能是nosql数据库)。
但是,我不知道如何根据哈希值的相似性检索记录。
你有什么想法吗?
qslice1=islice1或qslice2=islice2或qslice3=islice3或qslice4=islice4
。这会给您每个DB哈希,其与查询哈希相差3位(4-1
)。它可能包含更多结果,这就是为什么有第4步的原因。
4. 对于每个返回的哈希,使用您的查询哈希逐一计算精确的汉明距离(从四个切片重建索引侧哈希)据我所知,这种方法最早由Moses Charikar在其"simhash"开创性paper和相应的Googlepatent中描述:
- 在汉明空间中进行近似最近邻搜索
[...] 给定由d个位组成的位向量,我们选择N = O(n 1/(1+))个随机排列。对于每个随机排列σ,我们维护按照σ排列的位的词典顺序中的位向量的排序顺序O σ。给定查询位向量q,我们通过执行以下操作找到近似最近邻居:
对于每个排列σ,我们在O σ上执行二分搜索以定位距离q最近的两个位向量(按σ排列的位获得的词典顺序)。现在,我们在每个排序顺序O σ中搜索,在匹配q的最长前缀的长度的顺序下检查在二进制搜索返回的位置上方和下方的元素。
Monika Henziger在她的论文中详细阐述了算法"Finding near-duplicate web pages: a large-scale evaluation of algorithms"的内容:
3.3 算法C的结果
我们将每个页面的位串分成12个不重叠的4字节块,共创建20B块,并计算所有具有至少一个公共块的页面的C相似度。这种方法保证可以找到差异最多为11的所有页面对,即C相似度373,但可能会错过一些较大差异的页面对。
NB:C相似度与汉明距离相同:汉明距离是相应位不同的位置数,而C相似度是相应位相同的位置数。
这也在Gurmeet Singh Manku、Arvind Jain和Anish Das Sarma的论文Detecting Near-Duplicates for Web Crawling中有所解释。
定义:给定 f 位指纹集合和一个查询指纹 F,确定是否存在一个已有的指纹与 F 最多只有 k 个不同的位(在上述问题的批处理版本中,我们有一组查询指纹而不是单个查询指纹)。
[...] 直觉:考虑一个由 2 的 d 次方个 f 位真随机指纹排序的表格。关注表格中最重要的 d 位。这些 d 位数字的列表相当于“几乎计数器”,因为 (a) 存在相当多的 2 的 d 次方个二进制组合,且 (b) 很少有 d 位组合被复制。另一方面,最不重要的 f − d 位是“几乎随机”的。
现在选择 d,使得 |d − d| 是一个小整数。由于表格是排序的,单次探测就足以识别所有在 d 个最重要的位位置上与 F 匹配的指纹。由于 |d − d| 很小,这样匹配的数量也预计很小。对于每个匹配的指纹,我们可以轻松地确定它们是否与 F 在最多 k 个位位置上不同(这些差异自然限制在最不重要的 f − d 个位位置上)。
上述描述的过程帮助我们找到一个已有的指纹,它与 F 在 k 个位位置上不同,这些位置都在 F 的最不重要的 f − d 个位中。这解决了相当多的情况。为了涵盖所有情况,只需按照下一节的正式概述构建少量附加排序表格即可。
PS:这些优秀的大脑中的大多数都曾在某个层面或某个时间与谷歌有关。
INT
列和覆盖索引。大约98%的返回结果具有所需的距离,不到2%需要进一步过滤。在我的7年旧系统上,对所有文件进行重复搜索需要约2秒钟。这种技术速度非常快! - mindplay.dk要找到汉明距离,您可以使用按位加法和减法(&和~在整数上)来计算。
SQL不适用于这种类型的处理。大数据集上的比较变得非常混乱,并且不会具有利用系统优势的查询速度。话虽如此,我做过类似的事情。
这将为您提供单个差异,需要在完整数据集上运行并排序,这最好是混乱的。如果您希望它运行得更快,您需要使用诸如按“区域”索引或查找数据中的自然分组等策略。有伞形聚类策略和类似的策略 - 有很多文献。但是,在大多数传统数据库系统中,这将是混乱的。