如何从海量数据中找到相似数据--那些用于查找相似数据的哈希算法

Posted 中国科学院网络数据重点实验室

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从海量数据中找到相似数据--那些用于查找相似数据的哈希算法相关的知识,希望对你有一定的参考价值。

 目 录 

  • 布隆过滤器(BloomFilter

  • Simhash

  • Minhashing

  • 局部敏感哈希(Local Sensitive Hashing)






 1   介绍



本期的内容主要介绍数据挖掘中的一类常用方法,数据匹配。常见的匹配有精确和模糊两类,对于精确匹配,目标是找到完全一致的另一条记录,所执行的是a=b的判断;模糊匹配,则不需要找到完全一致的另一条记录,希望在定义的度量范围内,获得近似的数据记录,所执行的是f(a, b)<Δ的判断。不论是哪类匹配的方法,找到匹配的k条记录,都需要对数据进行完全的遍历,或者需要执行复杂的匹配函数计算,这极大地限制了匹配问题的处理规模,尤其是在大规模数据处理的实际应用场景中,需要更为实时高效的匹配方法。


在这类问题中,采用Hash编码是一种较好的问题解决方式,其思想可以归纳为:将数据(或者批量数据)编码为具有唯一标识的一串hash数值,直接利用该数值进行匹配(查询)操作。

 

1 针对单条数据和批量数据的hash编码

 

      下面将介绍几种利用hash编码技术解决大规模数据背景下的匹配方法。

 

 2  布隆过滤器(Bloom Filter)


 

布隆过滤器主要应用于数据集合内的元素判重,这是针对批量数量做整体编码的一种方法。布隆过滤器技术本身已比较成熟,无论是理论还是技术方面目前都已有充分认识。这里主要介绍布隆过滤器的主要思想、应用场景以及关于布隆过滤器一些关键参数设置的理解,以方便大家快速实现。

 

布隆过滤器实现数据集合判重的思想为:将数据映射到一个由m维表示的二进制编码中,由该二进制编码对数据集合中的任意元素进行唯一标识。更直白的说,对数据集合中的数据做id标识,如果id已存在则表明数据发生重复。这种数据到id标识的转换由Hash编码实现。

 

先来看下布隆过滤器的处理流程:

初始化:khash函数,一个m维的二进制编码B(所有位置0

输入:数据集合S={s1, s2,…,sn}

For  i=1 to n

    (数据id化)

  1. sikhash函数进行编码并生成对应hash编码;

  2. khash编码值转换为二进制编码bi

(判重&记录)

  1. 判断bi是否存在,否则记录到m维的编码中。

End  for

输出:m维的二进制编码B

 

以上是布隆过滤器的基本实现。了解至此已经基本可以一个布隆过滤器了。接下来简要说明一些关于布隆过滤器设置方面的问题。

 

问题1. 为什么要有khash函数做数据的id化操作?

答:khash函数的实现可以有效避免由单个hash函数所产生的编码碰撞问题。

 

问题2. 最优hash函数的个数是多少个?

答:最优hash函数的个数k=(m/n)ln2,其中m为编码长度,n为数据集大小。

 

问题3. 编码位长度的长度设置?

答:最优的编码位长度m-1.44n log2 p,其中p为发生碰撞导致误判重的概率。

 

布隆过滤器的优缺点:

  1. 布隆过滤器一定能够区分出数据集中的重复元素,但会发生误判现象,这是由于hash编码会发生编码碰撞导致;

  2. 布隆过滤器只能判重,无法判断当前重复数据具体和已知的哪条数据重复,即无法实现回溯定位功能;

  3. 布隆过滤器可以对数据全集进行压缩编码,在空间和时间效率上极为高效,数据的插入和判重查询复杂度为常数;

  4. 布隆过滤器无法实现对数据的删除功能。

 

 3   Simhash


 

Simhash主要应用于文档级别的数据相似度度量。针对一篇文档,simhash将文档中的所有单词统一编码为一个固定长度的二进制编码,认为相似的文档在所编码的二进制中进行按位比较,应具有高度的相似程度。Simhash可以有效简化文档相似度计算的复杂度。接下来介绍simhash的主要实现步骤。

 

Simhash的处理流程:

初始化:词表以及词表中各词的对应权重(例如,将词按照重要程度划分为1-5个等级)

输入:文档集合D={d1,d2,…,dn}

For  i=1 to n

    (文档hash编码)

  1. 将di中的所有单词通过hash函数生成长度为m的二进制hash编码;

  2. 将所有的二进制编码中的0置为-1;

  3. 将变换后的二进制编码按词表中对应词的权重,生成加权hash编码,并将文档内所有加权后的编码按位相加,得到一个表示文档的m维编码;

  4. 将m维的文档编码降维至二进制编码并保存。

End  for

输出:所有文档Dhash编码集合

 

对于算法中不太清楚的部分,可以用图 2中一个具体的处理实例帮助理解。

 

2 利用simhash对文档进行编码的处理实例

 

以上是simhash的基本实现。虽然目前对simhash的实现没有理论保证,但在具体的实践过程中发现,simhash的编码方式结合hamming距离可以有效地识别相似文档,是一种高效解决文档匹配的方法。


(未完待续)


以上是关于如何从海量数据中找到相似数据--那些用于查找相似数据的哈希算法的主要内容,如果未能解决你的问题,请参考以下文章

用于在数据库中查找相似图像的指标

海量数据相似度计算之simhash短文本查找

仅使用图像而不是通过标签从数据库中查找相似图像

如何找到一个非常大的数组的余弦相似度

海量数据相似度计算之simhash和海明距离

搜索引擎中相似字符串查找那些事儿