Hash基础相关知识点总结

1  哈希表(Hash Table)

说明:一种特殊的数据结构。

特点:可以快速实现查找、插入和删除。

1.1  基本思想

数组的特点:寻址容易,但插入和删除困难。

链表的特点:寻址困难,但插入和删除容易。

哈希表即结合以上两个的优点,创造而成。

1.2  基本概念

  • 哈希表:即散列表,是根据关键字(码值)而直接进行访问的数据结构,也就是Map。
  • 哈希函数:即散列函数,是Hash表的映射函数。
  • 标准定义:若关键字为$k$,则其值存放在$f(k)$的存储位置上。由此,不需要比较便可直接取得所查记录,称这个对应关系$f$为哈希函数,按这个思想建立的表为哈希表。

2  哈希算法

哈希算法并不是一个特定的算法,而是一类算法的统称。

哈希算法也称散列算法,一般满足$f(data)=key$,即输入任意长度的$data$数据,经哈希算法处理后输出一个定长的数据$key$。

简单地讲,哈希算法可类比为一个伪随机数生成器,实现“明文→密文”的转化,即一段信息经哈希算法映射为固定长度的数字串。

性质:

  1. 不可逆,即知道$x$的Hash值无法求出$x$。
  2. 无冲突,即知道$x$,无法求出一个$y$,使$x$与$y$的Hash值相同。

“碰撞”即不同的输入数据对应了相同的哈希值。

注意:“碰撞”并没有违背“无冲突”性,一个好的哈希算法应有较好的抗冲突性。

海明距离:在信息编码中,两个合法代码对应位上编码不同的位数称为码距,又称为海明距离。即两个二进制串异或结果中1的个数。

常用的哈希算法见关于Hash的几种常用算法

3  局部敏感哈希

局部敏感哈希类似于一种空间域转换思想。

特点:保持数据的相似性。

如果两个文本原有数据空间相似,则经哈希转换后也具有相似性;相反,若两个文本不相似,则经转换后也不相似。

局部敏感哈希是相对的,我们所讲的保持数据的相似性不是说保持100%的相似度,而是保持最大可能的相似度(降维后)。

3.1  Shingling

Shingling是一种去重算法。

将待查询的字符串集进行映射,映射到一个集合里,如字符串“abcede”映射到集合“(a, b, c, d, e)”中。

注意集合中的元素是无重复的,这一步就叫Shingling,意即构建文档中的短字符串集合,即Shingle集合。

3.2  SimHash

传统的Hash函数是将原始内容尽量均匀、随机地映射为签名值,对于传统的Hash函数来讲,如果两个签名值相等,则说明原始内容在一定程度(一定概率)上是相同的;如果不相等,除了说明原始内容不相同外,不提供任何信息。

传统的Hash函数是无法在签名值的维度上来衡量原始内容相似度的,而SimHash本身属于一种局部敏感哈希,它产生的Hash签名在一定程度上可以表征原内容的相似性。

对于文本去重,有很多NLP相关的算法可以在很高精度上来解决。但是若要处理大数据维度上的文本去重,这就对算法的效率有很高的要求。

SimHash最大的优点:

  1. 可以将文本映射为数字。
  2. “文本相似”等同于“签名相似”。

注:SimHash算法由Moses Charkar在《similarity estimation techniques from rounding algoritms》一文中提出。

SimHash算法的步骤:

  1. 分词,求个词语的权重(TF-IDF值);
  2. 对每个词语进行“传统的32/64位Hash转换”;

    注:使用的Hash函数不同,则最后计算的海明距离也不同;

  3. 将转换后的Hash值对应位加、减权重值;
  4. 对所有词语进行2、3步骤;
  5. 将所有值对应位累加;
  6. 降维。

    注:根据Moses Charkar阐述,使用64位Hash,海明距离在3以内的都可以认为是近重复文本,但具体的数值还要根据业务考虑。

 流程示意图如下:

备注:作者之前使用Java语言实现了SimHash算法,并做了一个简易的可视化系统,详见中文信息处理

备注:使用SimHash计算海明距离只是开始的第一步,然而对于海量数据来讲,更重要的是SimHash的存储和索引,即对于64位待查询文本的SimHash code来讲,如何在海量的样本库(>1M)中查询与其海明距离在3以内的记录?可以借鉴这篇文章

posted @ 2018-10-30 20:12  祁俊辉  阅读(455)  评论(0编辑  收藏  举报