前言
local sensitive hash 局部敏感哈希 的东西,据说这玩意可以把文档降维到hash数字,数字两两计算运算量要小很多。查找很多文档后看到google对于网页去重使用的是simhash,他们每天需要处理的文档在亿级别; simhash是由 Charikar 在2002年提出来的,参考 《Similarity estimation techniques from rounding algorithms》 。
介绍下这个算法主要原理,为了便于理解尽量不使用数学公式,分为这几步:
1、分词,把需要判断文本分词形成这个文章的特征单词。最后形成去掉噪音词的单词序列并为每个词加上权重,我们假设权重分为5个级别(1~5)。比如:“ 美国“51区”雇员称内部有9架飞碟,曾看见灰色外星人 ” ==> 分词后为 “ 美国(4) 51区(5) 雇员(3) 称(1) 内部(2) 有(1) 9架(3) 飞碟(5) 曾(1) 看见(3) 灰色(4) 外星人(5)”,括号里是代表单词在整个句子里重要程度,数字越大越重要。
2、hash,通过hash算法把每个词变成hash值,比如“美国”通过hash算法计算为 100101,“51区”通过hash算法计算为 101011。这样我们的字符串就变成了一串串数字,还记得文章开头说过的吗,要把文章变为数字计算才能提高相似度计算性能,现在是降维过程进行时。
3、加权,通过 2步骤的hash生成结果,需要按照单词的权重形成加权数字串,比如“美国”的hash值为“100101”,通过加权计算为“4 -4 -4 4 -4 4”;“51区”的hash值为“101011”,通过加权计算为 “ 5 -5 5 -5 5 5”。
4、合并,把上面各个单词算出来的序列值累加,变成只有一个序列串。比如 “美国”的 “4 -4 -4 4 -4 4”,“51区”的 “ 5 -5 5 -5 5 5”, 把每一位进行累加, “4+5 -4+-5 -4+5 4+-5 -4+5 4+5” ==》 “9 -9 1 -1 1 9”。这里作为示例只算了两个单词的,真实计算需要把所有单词的序列串累加。
5、降维,把4步算出来的 “9 -9 1 -1 1 9” 变成 0 1 串,形成我们最终的simhash签名。 如果每一位大于0 记为 1,小于0 记为 0。最后算出结果为:“1 0 1 0 1 1”。
整个过程图为:
大家可能会有疑问,经过这么多步骤搞这么麻烦,不就是为了得到个 0 1 字符串吗?我直接把这个文本作为字符串输入,用hash函数生成 0 1 值更简单。其实不是这样的,传统hash函数解决的是生成唯一值,比如 md5、hashmap等。md5是用于生成唯一签名串,只要稍微多加一个字符md5的两个数字看起来相差甚远;hashmap也是用于键值对查找,便于快速插入和查找的数据结构。不过我们主要解决的是文本相似度计算,要比较的是两个文章是否相识,当然我们降维生成了hashcode也是用于这个目的。看到这里估计大家就明白了,我们使用的simhash就算把文章中的字符串变成 01 串也还是可以用于计算相似度的,而传统的hashcode却不行。我们可以来做个测试,两个相差只有一个字符的文本串,“你妈妈喊你回家吃饭哦,回家罗回家罗” 和 “你妈妈叫你回家吃饭啦,回家罗回家罗”。
通过simhash计算结果为:
1000010010101101111111100000101011010001001111100001001011001011
1000010010101101011111100000101011010001001111100001101010001011
通过 hashcode计算为:
1111111111111111111111111111111110001000001100110100111011011110
1010010001111111110010110011101
大家可以看得出来,相似的文本只有部分 01 串变化了,而普通的hashcode却不能做到,这个就是局部敏感哈希的魅力。目前Broder提出的shingling算法和Charikar的 simhash算法应该算是业界公认比较好的算法。在simhash的发明人Charikar的论文中并没有给出具体的simhash算法和证明,“量子图灵”得出的证明simhash是由随机超平面hash算法演变而来的。
现在通过这样的转换,我们把库里的文本都转换为simhash 代码,并转换为long类型存储,空间大大减少。现在我们虽然解决了空间,但是如何计算两个simhash的相似度呢?难道是比较两个simhash的 01有多少个不同吗?对的,其实也就是这样,我们通过海明距离(Hamming distance)就可以计算出两个simhash到底相似不相似。两个simhash对应二进制(01串)取值不同的数量称为这两个simhash的海明距离。举例如下: 10101 和 00110 从第一位开始依次有第一位、第四、第五位不同,则海明距离为3。对于二进制字符串的a和b,海明距离为等于在a XOR b运算结果中1的个数(普遍算法)。
为了高效比较,我们预先加载了库里存在文本并转换为simhash code 存储在内存空间。来一条文本先转换为 simhash code,然后和内存里的simhash code 进行比较,测试100w次计算在100ms。速度大大提升。
未完待续:
1、目前速度提升了但是数据是不断增量的,如果未来数据发展到一个小时100w,按现在一次100ms,一个线程处理一秒钟 10次,一分钟 60 * 10 次,一个小时 60*10 *60 次 = 36000次,一天 60*10*60*24 = 864000次。 我们目标是一天100w次,通过增加两个线程就可以完成。但是如果要一个小时100w次呢?则需要增加30个线程和相应的硬件资源保证速度能够达到,这样成本也上去了。能否有更好的办法,提高我们比较的效率?
2、通过大量测试,simhash用于比较大文本,比如500字以上效果都还蛮好,距离小于3的基本都是相似,误判率也比较低。但是如果我们处理的是微博信息,最多也就140个字,使用simhash的效果并不那么理想。看如下图,在距离为3时是一个比较折中的点,在距离为10时效果已经很差了,不过我们测试短文本很多看起来相似的距离确实为10。如果使用距离为3,短文本大量重复信息不会被过滤,如果使用距离为10,长文本的错误率也非常高,如何解决?
http://my.oschina.net/leejun2005/blog/150086?p={{currentPage+1}}
另外一篇文章讲解了minhash
http://blog.csdn.net/heiyeshuwu/article/details/44117473
- 大小: 35.9 KB
- 大小: 23.6 KB
分享到:
相关推荐
基于Simhash算法的海量文本相似性检测方法研究 知识文档搜索在当今信息社会中扮演着重要角色。当用户输入关键词进行搜索时,现有的知识库系统通常只能匹配并返回包含关键词的文档,而无法有效地识别并推荐语义上...
SimHash算法是一种基于局部敏感哈希技术的算法,常被用于检测文本相似性问题,尤其在文本重复数据删除、网页重复性检测等领域具有广泛应用。本文针对SimHash算法在文本检测去重中的应用及存在的问题进行了深入研究,...
SimHash算法是一种在大数据分析和信息检索中广泛使用的相似性检测方法,尤其在文本相似度比较上表现出色。...通过阅读和理解代码,开发者可以更好地掌握SimHash的工作原理,并根据具体需求进行调整和扩展。
本文旨在详细介绍simhash的基本原理、工作流程及其应用场景。 #### 二、simhash简介 simhash是一种用于计算文本相似度的有效算法。与传统的基于shingle的算法相比,simhash能够在保持高精度的同时显著减少计算时间...
这里我们将深入探讨SimHash算法的五个主要步骤,并结合C++代码实现来详细解析其工作原理。 1. **分词**: 在SimHash算法的开始,我们需要对输入的文本进行分词。这个过程通常包括去除停用词、标点符号和数字,然后...
在IT行业中,文本处理是一项重要的任务,特别是在网络爬虫领域。网络爬虫经常需要处理大量数据,其中可能包含大量的...通过理解SimHash的工作原理,并熟练掌握Python实现,我们可以更好地处理大数据时代的文本信息。
simhash 算法的 java 实现。特点计算字符串的 simhash通过构建智能索引来计算所有字符串之间的相似性,因此可以处理大数据使用使用输入文件和输出文件运行 Maininputfile 的格式(参见 src / test_in):一个文件每...
专门针对中文文档的simhash算法库 简介 此项目用来对中文文档计算出对应的 simhash 值。 simhash 是谷歌用来进行文本去重的算法,现在广泛应用在文本处理中。 详见SimhashBlog 特性 使用 CppJieba 作为分词器和...
simhash, Simhash算法的python 实现 simhash这是 Simhash的python 实现。正在启动http://leons.im/posts/a-python-implementation-of-simhash-algorithm/插件生成状态
通过阅读和理解这些代码,可以深入学习Simhash的工作原理,并将其应用到实际项目中。 总结来说,Simhash算法是一种用于检测相似性的高效方法,尤其适合在大数据场景下处理文本信息。Go语言的实现提供了可扩展性和...
SimHash是一种用于近似相似度计算的哈希算法,它能够在大数据集上快速判断两个文本是否具有较高的相似度。在Java中实现SimHash,我们可以使用如上代码所示的方法。以下是对这段代码的详细解释: 首先,我们看到代码...
Simhash算法是一种基于局部敏感哈希(Locality-Sensitive Hashing, LSH)的算法,它特别适用于处理文本信息的相似性搜索。传统的Simhash算法的核心思想是在多个特征上应用哈希函数,通过计算这些特征的哈希值并合并...
在IT领域,中文分词和SimHash算法是两种重要的技术,尤其在文本处理和信息检索中发挥着关键作用。本文将深入探讨这两种技术,并结合Java实现进行详细解析。 首先,让我们了解一下**中文分词**。中文不同于英文,...
【标题】:Simhash算法详解及其在文本相似度检测中的应用 【描述】:Simhash算法是一种基于哈希的近似查找技术,尤其适用于大规模文本数据的相似度检测。在这个项目中,通过Flask框架构建了一个简单的Web应用程序,...
SimHash的原理是将一个长文本映射为一个短的哈希值,使得相似的文本拥有接近的哈希值。这种方法可以快速判断两段文本是否大致相同,而不需要完全比较它们的内容。 首先,我们来看分词。在处理文本时,通常需要将其...
本篇文章将详细探讨如何在ThinkPHP5中利用SimHash算法进行海量内容数据的查重。 SimHash是一种基于汉明距离的分布式相似性检测算法,由Charikar于2002年提出。它的核心思想是将任意长度的文本或数据转化为固定长度...
pyspark 基于simhash做相似聚合代码工程
首先,我们需要理解Simhash的基本原理。Simhash将一段文本分割成多个短语,然后为每个短语生成一个哈希值。这些哈希值通过位运算(如异或)组合成一个整体的Simhash值。由于文本的微小变化会导致部分短语哈希值的...
Simhash算法是一种局部敏感哈希算法,广泛应用于文本去重领域。随着大数据时代的到来,信息量爆炸式增长,数据存储空间和时间成本受到重视,因此,如何在有限的资源中存储更多有效精炼的信息成为了研究的热点。文本...
本主题将深入探讨中文文本相似度匹配算法中的simHash、海明距离以及IK分词技术。 首先,simHash是一种高效的近似哈希算法,主要用于大数据量文本的相似性检测。它的核心思想是将长文本转化为短的哈希值,使得相似的...