随着信息爆炸时代的来临,互联网上充斥着着大量的近重复信息,有效地识别它们是一个很有意义的课题。例如,对于搜索引擎的爬虫系统来说,收录重复的网页是毫无意义的,只会造成存储和计算资源的浪费;同时,展示重复的信息对于用户来说也并不是最好的体验。造成网页近重复的可能原因主要包括:
一个简化的爬虫系统架构如下图所示:
事实上,传统比较两个文本相似性的方法,大多是将文本分词之后,转化为特征向量距离的度量,比如常见的欧氏距离、海明距离或者余弦角度等等。两两比较固然能很好地适应,但这种方法的一个最大的缺点就是,无法将其扩展到海量数据。例如,试想像Google那种收录了数以几十亿互联网信息的大型搜索引擎,每天都会通过爬虫的方式为自己的索引库新增的数百万网页,如果待收录每一条数据都去和网页库里面的每条记录算一下余弦角度,其计算量是相当恐怖的。
我们考虑采用为每一个web文档通过hash的方式生成一个指纹(fingerprint)。传统的加密式hash,比如md5,其设计的目的是为了让整个分布尽可能地均匀,输入内容哪怕只有轻微变化,hash就会发生很大地变化。我们理想当中的哈希函数,需要对几乎相同的输入内容,产生相同或者相近的hashcode,换句话说,hashcode的相似程度要能直接反映输入内容的相似程度。很明显,前面所说的md5等传统hash无法满足我们的需求。
simhash是locality sensitive hash(局部敏感哈希)的一种,最早由Moses Charikar在《similarity estimation techniques from rounding algorithms》一文中提出。Google就是基于此算法实现网页文件查重的。我们假设有以下三段文本:
- the cat sat on the mat
- the cat sat on a mat
- we all scream for ice cream
使用传统hash可能会产生如下的结果:
引用
irb(main):006:0> p1 = 'the cat sat on the mat'
irb(main):005:0> p2 = 'the cat sat on a mat'
irb(main):007:0> p3 = 'we all scream for ice cream'
irb(main):007:0> p1.hash
=> 415542861
irb(main):007:0> p2.hash
=> 668720516
irb(main):007:0> p3.hash
=> 767429688
使用simhash会应该产生类似如下的结果:
引用
irb(main):003:0> p1.simhash
=> 851459198
00110010110000000011110001111110
irb(main):004:0> p2.simhash
=> 847263864
00110010100000000011100001111000
irb(main):002:0> p3.simhash
=> 984968088
00111010101101010110101110011000
海明距离的定义,为两个二进制串中不同位的数量。上述三个文本的simhash结果,其两两之间的海明距离为(p1,p2)=4,(p1,p3)=16以及(p2,p3)=12。事实上,这正好符合文本之间的相似度,p1和p2间的相似度要远大于与p3的。
如何实现这种hash算法呢?以上述三个文本为例,整个过程可以分为以下六步:
1、选择simhash的位数,请综合考虑存储成本以及数据集的大小,比如说32位
2、将simhash的各位初始化为0
3、提取原始文本中的特征,一般采用各种分词的方式。比如对于"the cat sat on the mat",采用两两分词的方式得到如下结果:{"th", "he", "e ", " c", "ca", "at", "t ", " s", "sa", " o", "on", "n ", " t", " m", "ma"}
4、使用传统的32位hash函数计算各个word的hashcode,比如:"th".hash = -502157718
,"he".hash = -369049682,……
5、对各word的hashcode的每一位,如果该位为1,则simhash相应位的值加1;否则减1
6、对最后得到的32位的simhash,如果该位大于1,则设为1;否则设为0
整个过程可以参考下图:
按照Charikar在论文中阐述的,64位simhash,海明距离在3以内的文本都可以认为是近重复文本。当然,具体数值需要结合具体业务以及经验值来确定。
使用上述方法产生的simhash可以用来比较两个文本之间的相似度。问题是,如何将其扩展到海量数据的近重复检测中去呢?譬如说对于64位的待查询文本的simhash code来说,如何在海量的样本库(>1M)中查询与其海明距离在3以内的记录呢?下面在引入simhash的索引结构之前,先提供两种常规的思路。第一种是方案是查找待查询文本的64位simhash code的所有3位以内变化的组合,大约需要四万多次的查询,参考下图:
另一种方案是预生成库中所有样本simhash code的3位变化以内的组合,大约需要占据4万多倍的原始空间,参考下图:
显然,上述两种方法,或者时间复杂度,或者空间复杂度,其一无法满足实际的需求。我们需要一种方法,其时间复杂度优于前者,空间复杂度优于后者。
假设我们要寻找海明距离3以内的数值,根据抽屉原理,只要我们将整个64位的二进制串划分为4块,无论如何,匹配的两个simhash code之间至少有一块区域是完全相同的,如下图所示:
由于我们无法事先得知完全相同的是哪一块区域,因此我们必须采用存储多份table的方式。在本例的情况下,我们需要存储4份table,并将64位的simhash code等分成4份;对于每一个输入的code,我们通过精确匹配的方式,查找前16位相同的记录作为候选记录,如下图所示:
让我们来总结一下上述算法的实质:
1、将64位的二进制串等分成四块
2、调整上述64位二进制,将任意一块作为前16位,总共有四种组合,生成四份table
3、采用精确匹配的方式查找前16位
4、如果样本库中存有2^34(差不多10亿)的哈希指纹,则每个table返回2^(34-16)=262144个候选结果,大大减少了海明距离的计算成本
我们可以将这种方法拓展成多种配置,不过,请记住,table的数量与每个table返回的结果呈此消彼长的关系,也就是说,时间效率与空间效率不可兼得,参看下图:
事实上,这就是Google每天所做的,用来识别获取的网页是否与它庞大的、数以十亿计的网页库是否重复。另外,simhash还可以用于信息聚类、文件压缩等。
转自:http://grunt1223.iteye.com/blog/964564
- 大小: 96.7 KB
- 大小: 66.7 KB
- 大小: 74.7 KB
- 大小: 62.4 KB
- 大小: 22.8 KB
- 大小: 86.5 KB
- 大小: 94.8 KB
分享到:
相关推荐
通过这种方式,E-Simhash算法能够识别出文本中具有区分度的关键词,赋予这些词较高的权重。 在Simhash算法中,文本通过哈希映射生成固定长度的指纹,当两个文本的指纹相似度足够高时,可以认为这两个文本是重复的。...
在Java环境下实现SimHash算法,可以帮助开发者在处理大量文本数据时快速识别重复或相似的信息。 SimHash算法的基本步骤如下: 1. **分词**:首先,我们需要将输入的文本进行分词,将连续的字符序列分割成单独的...
例如,它可能会提供一个方法,接收一组文本,计算每条文本的SimHash值,然后通过设定的阈值(比如汉明距离阈值)来识别和去除重复的文本。 在实际应用中,SimHash算法不仅限于网络爬虫的文本去重,还可以用于垃圾...
通过这种方式,您可以快速识别所有被视为接近重复的文档。 您甚至可以构建表来非常快速地执行这些查询。 可悲的是,它会消耗相当数量的 RAM,尤其是当您将数亿或数十亿个哈希插入已知哈希的语料库中时。 因此,...
- **内容过滤**:例如在垃圾邮件检测、网络监控等方面,simhash可以帮助快速识别和过滤不相关的或有害的信息。 - **学术诚信检查**:在学术领域,simhash可以帮助检测论文中的抄袭行为,维护学术诚信。 #### 五、...
TF-IDF(Term Frequency-Inverse Document Frequency)是一种用于信息检索与文本挖掘的常用加权技术,用于评估一个词语对于一个文档集合或者一个语料库中的其中一份文档的重要性。TF-IDF算法考虑了词语在文档中的...
Simhash是一种在信息检索领域中用于检测和识别相似文档的算法,它是由CMU(卡内基梅隆大学)的专家们开发出来的一种高效技术。在处理大量文档数据时,通过shingling、minhashing以及局部敏感哈希(Locality-...
在实际应用中,SimHash通常与其他数据结构如Bloom Filter或MinHash结合,以提高查找效率和处理大规模数据的能力。例如,Bloom Filter用于粗略判断是否存在重复项,而SimHash则用于确认是否真正相似。这样可以在保证...
Simhash近重复检测 该库可识别与查询指纹几乎相同的所有指纹。 在这种情况下,指纹是无符号的64位整数。 它还具有一个辅助功能,该功能旨在根据给定的char*和长度生成指纹。 此指纹由令牌生成器和哈希函数(二者均...
Simhash是一种基于哈希的近似匹配算法,广泛应用于大数据处理和搜索引擎中,尤其是文本相似度检测和重复内容的去重。它由俄罗斯科学家Vladimir Charikov于2006年提出,其核心思想是将长文本通过一系列变换转化为一个...
本文介绍了一种基于Simhash文本相似性检测的SQL注入漏洞检测技术,该技术通过使用特征值来比较网页,从而提高了检测精度与效率。文中还设计并实现了一个SQL注入漏洞检测原型系统,并通过实验结果验证了该系统的准确...
将来的工作将使用此软件包来快速识别大量文档中几乎重复的文档。安装go get github.com/mfonda/simhash用法首先,使用simhash需要将文档标记为一组功能(通过FeatureSet接口完成)。 该程序包提供了一个实现...
SimText 是一个基于SimHash算法的短文本相似度检测工具,专为识别和监测相似的短文本而设计。...通过对短文本的高效相似性检测,SimText可以帮助用户快速发现潜在的重复或相关的信息,提升数据处理的效率和质量。
对重复信息的有效识别和处理不仅能够减少资源浪费,还能帮助分析人员更准确地把握信息的核心。常见的技术包括基于特征码提取的Bloom Filter和改良的Trie树,以及SimHash算法,后者用于处理那些相似但不完全相同的...
《基于Simhash的论文查重系统——...通过对文本数据的有效处理和计算,它能准确识别出潜在的重复内容,保障了学术的公正性和原创性。对于那些关注知识产权和学术诚信的组织和个人来说,这是一个值得信赖的解决方案。
这种技术对于识别网络上的重复内容非常有用,例如在网页抓取过程中,通过比较不同网址的页面内容来发现近似或完全相同的页面,以避免无效的抓取和存储。 SimHash是实现二进制串模糊搜索的一种高效算法,由Charikar...
在实际应用中,Java实现的SimHash模糊搜索可以广泛应用于各种场景,比如在搜索引擎中快速判断两个网页是否重复,或者在社交网络中识别相似的用户行为模式。通过这个压缩包提供的源码,开发者可以深入理解SimHash的...
在IT领域,去重算法是数据处理和信息检索中的关键组成部分,主要目的是识别并消除重复的数据,以提高存储效率和数据分析的准确性。本项目提供的"SimilarityAlgorithms"压缩包包含了几种常用的相似性计算方法,包括...