如何从海量数据中找到相似数据--那些用于查找相似数据的哈希算法
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编码实现。
先来看下布隆过滤器的处理流程:
初始化:k个hash函数,一个m维的二进制编码B(所有位置0) 输入:数据集合S={s1, s2,…,sn} For i=1 to n (数据id化)
(判重&记录)
End for 输出:m维的二进制编码B |
以上是布隆过滤器的基本实现。了解至此已经基本可以一个布隆过滤器了。接下来简要说明一些关于布隆过滤器设置方面的问题。
问题1. 为什么要有k个hash函数做数据的id化操作?
答:k个hash函数的实现可以有效避免由单个hash函数所产生的编码碰撞问题。
问题2. 最优hash函数的个数是多少个?
答:最优hash函数的个数k=(m/n)ln2,其中m为编码长度,n为数据集大小。
问题3. 编码位长度的长度设置?
答:最优的编码位长度m≈-1.44n log2 p,其中p为发生碰撞导致误判重的概率。
布隆过滤器的优缺点:
布隆过滤器一定能够区分出数据集中的重复元素,但会发生误判现象,这是由于hash编码会发生编码碰撞导致;
布隆过滤器只能判重,无法判断当前重复数据具体和已知的哪条数据重复,即无法实现回溯定位功能;
布隆过滤器可以对数据全集进行压缩编码,在空间和时间效率上极为高效,数据的插入和判重查询复杂度为常数;
布隆过滤器无法实现对数据的删除功能。
3 Simhash
Simhash主要应用于文档级别的数据相似度度量。针对一篇文档,simhash将文档中的所有单词统一编码为一个固定长度的二进制编码,认为相似的文档在所编码的二进制中进行按位比较,应具有高度的相似程度。Simhash可以有效简化文档相似度计算的复杂度。接下来介绍simhash的主要实现步骤。
Simhash的处理流程:
初始化:词表以及词表中各词的对应权重(例如,将词按照重要程度划分为1-5个等级) 输入:文档集合D={d1,d2,…,dn} For i=1 to n (文档hash编码)
End for 输出:所有文档D的hash编码集合 |
对于算法中不太清楚的部分,可以用图 2中一个具体的处理实例帮助理解。
图 2 利用simhash对文档进行编码的处理实例
以上是simhash的基本实现。虽然目前对simhash的实现没有理论保证,但在具体的实践过程中发现,simhash的编码方式结合hamming距离可以有效地识别相似文档,是一种高效解决文档匹配的方法。
(未完待续)
以上是关于如何从海量数据中找到相似数据--那些用于查找相似数据的哈希算法的主要内容,如果未能解决你的问题,请参考以下文章