SimHash

相似文档查找算法之 simHash 简介及其 java 实现

纵饮孤独 提交于 2019-12-14 21:34:44
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 传统的 hash 算法只负责将原始内容尽量均匀随机地映射为一个签名值,原理上相当于伪随机数产生算法。产生的两个签名,如果相等,说明原始内容在一定概 率 下是相等的;如果不相等,除了说明原始内容不相等外,不再提供任何信息,因为即使原始内容只相差一个字节,所产生的签名也很可能差别极大。从这个意义 上来 说,要设计一个 hash 算法,对相似的内容产生的签名也相近,是更为艰难的任务,因为它的签名值除了提供原始内容是否相等的信息外,还能额外提供不相等的 原始内容的差异程度的信息。 而 Google 的 simhash 算法产生的签名,可以满足上述要求。出人意料,这个算法并不深奥,其思想是非常清澈美妙的。 1、Simhash 算法简介 simhash算法的输入是一个向量,输出是一个 f 位的签名值。为了陈述方便,假设输入的是一个文档的特征集合,每个特征有一定的权重。比如特征可以是文档中的词,其权重可以是这个词出现的次数。 simhash 算法如下: 1,将一个 f 维的向量 V 初始化为 0 ; f 位的二进制数 S 初始化为 0 ; 2,对每一个特征:用传统的 hash 算法对该特征产生一个 f 位的签名 b 。对 i=1 到 f : 如果b 的第 i 位为 1 ,则 V 的第 i 个元素加上该特征的权重; 否则,V

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

耗尽温柔 提交于 2019-12-14 21:17:55
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>  通过 采集系统 我们采集了大量文本数据,但是文本中有很多重复数据影响我们对于结果的分析。分析前我们需要对这些数据去除重复,如何选择和设计文本的去重算法?常见的有余弦夹角算法、欧式距离、Jaccard相似度、最长公共子串、编辑距离等。这些算法对于待比较的文本数据不多时还比较好用,如果我们的爬虫每天采集的数据以千万计算,我们如何对于这些海量千万级的数据进行高效的合并去重。最简单的做法是拿着待比较的文本和数据库中所有的文本比较一遍如果是重复的数据就标示为重复。看起来很简单,我们来做个测试,就拿最简单的两个数据使用Apache提供的 Levenshtein for 循环100w次计算这两个数据的相似度。代码结果如下: String s1 = "你妈妈喊你回家吃饭哦,回家罗回家罗" ; String s2 = "你妈妈叫你回家吃饭啦,回家罗回家罗" ; long t1 = System.currentTimeMillis(); for (int i = 0; i < 1000000; i++) { int dis = StringUtils .getLevenshteinDistance(s1, s2); } long t2 = System.currentTimeMillis(); System. out

simhash算法实现--查找文件相似度

纵然是瞬间 提交于 2019-12-14 21:17:44
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 一、 Simhash 简介 SimHash 是用来网页去重最常用的 hash 方法,速度很快。 Google 采用这种算法来解决万亿级别的网页去重任务。 SimHash 算法的主要思想是降维。将高维的特征向量映射成一个低维的特征向量,通过两个向量的 Hamming Distance 来确定文章是否重复或者高度近似。 在 simhash 的发明人 Charikar 的论文中并没有给出具体的 simhash 算法和证明, “ 量子图灵 ” 得出的证明 simhash 是由随机超平面 hash 算法演变而来的 。 参考文献:《 Detecting Near-Duplicates for Web Crawling 》 二、 Simhash 和传统 hash 的区别 传统 hash 函数解决的是生成唯一值,比如 md5 , hashmap 等。 Md5 是用于生成唯一签名串,只要稍微多加一个字符, md5 的两个数字看起来相差甚远。而我们的目的是解决文本相似度计算,要比较的是两个文章是否相似。而 simhash 对相似文本的哈希映射结果也相似。 传统的 hash 算法只负责将原始内容尽量均匀随机地映射为一个签名值,原理上相当于伪随机数产生算法。产生的两个签名,如果相等,说明原始内容在一定概率下是相等的;如果不相等

文档排重之SimHash

陌路散爱 提交于 2019-12-06 14:05:24
1.将文本分词表示成基于词的特征向量,使用TF*IDF 作为每个特征项的权重.地名,专有名词等,名词性的词汇往往有更高的词义权重. 2.将特征项按照词权重排序 3.选取前n个特征项,然后重新按照字符排序,如果不排序,关键词就找不到对应的关系. 4.初始化长度为64位的数组,该数组的每个元素都是0 5.对特征列表循环做如下处理: 5.1 取每个特征的64位的hash值 5.2 如果这个hash值的第i位是1,则将数组的第i个数加上该特征的权重,反之,如果hash值的第i位是0,则将数组的第i个数减去该特征的权重 6.完成所有的特征值的处理,数组中的某些数为正,某些数为负.SimHash 值的每一位与数组中的每个数对应,将正数对应的位设为1,负数对应的位设为0,就得到了64位的0/1值的位数组,即最后的SimHash 使用海明距离来比较SimHash进而得出文本的是否重复 来源: CSDN 作者: 当以乐 链接: https://blog.csdn.net/sqh201030412/article/details/55213410

simhash进行文本查重

孤人 提交于 2019-12-06 14:05:13
http://blog.csdn.net/lgnlgn/article/details/6008498 有1亿个不重复的64位的01字符串,任意给出一个64位的01字符串f,如何快速从中找出与f汉明距离小于3的字符串? 大规模网页的近似查重 主要翻译自WWW07的 Detecting Near - Duplicates for Web Crawling WWW上存在大量内容近似相同的网页,对搜索引擎而言,去除近似相同的网页可以提高检索效率、降低存储开销。 当爬虫在抓取网页时必须很快能在海量文本集中快速找出是否有重复的网页。 论文主要2个贡献: 1. 展示了simhash可以用以海量文本查重 2. 提出了一个在实际应用中可行的算法。 两篇文本相似度普遍的定义是比较向量化之后两个词袋中词的交集程度,有cosine,jaccard等等 如果直接使用这种计算方式,时间空间复杂度都太高,因此有了simhash这种降维技术, 但是如何从传统的向量相似度能用simhash来近似,论文没提,应该是有很长一段推导要走的。 Simhash 算法 一篇文本提取出内容以后,经过基本的预处理,比如去除停词,词根还原,甚至chunking,最后可以得到一个向量。 对每一个term进行hash算法转换,得到长度f位的hash码,每一位上1-0值进行正负权值转换,例如f1位是1时,权值设为 +weight,

simhash 文本相似度计算

泪湿孤枕 提交于 2019-12-06 14:04:59
常见文本相似度计算方法: 1、 向量空间模型VSM(Vector Space Model) 。使用VSM计算相似度,先对文本进行分词,然后建立文本向量,把相似度的计算转换成某种特征向量距离的计算,比如余弦角、欧式距离、Jaccard相似系数等。这种方法存在很大一个问题:需要对文本两两进行相似度比较,无法扩展到海量文本的处理。 使用介绍可以参考 Corpora and Vector Spaces , 以及 TF-IDF model 2 、使用gensim的 doc2vec models.doc2vec 模型 ,doc2vec的设计原理是基于word2vec的原理进行改进。但是据大家使用的反馈,效果不是很好。 3、主题模型的近似计算。 通过计算documents的主题模型,将主题模型近似高的documents进行k-means聚合。实际计算时可以使用 gensim的 LDA 模型 gensim中实践LDA 4、 使用simhash算法斤进行文本相似度计算 5、 最新的有种基于深度学习的方法叫 Deep Averaging Network ,效果据研究者说比以上好,但是网上相关资料目前只有作者的论文以及算法代码。(还没来得及研究) simhash算法流程 1、分词 ,把需要判断文本分词形成这个文章的特征单词。最后形成去掉噪音词的单词序列并为每个词加上权重,我们假设权重分为5个级别(1~5

文本分析--simhash算法进行文本相似度判断

百般思念 提交于 2019-12-06 14:04:49
simhash算法分析: 文本相似度算法: 1、TF-IDF:TF(词频),IDF(逆词频) 利用tf-idf得到一个词语的权重,来计算一篇文章的关键词 2、simhash:局部敏感hash 局部敏感:A、B具有一定相似性,在hash后,仍然保持相似性。 通过将关键词集合hash成一串二进制,直接对比二进制数,来看其相似性得到两篇文档的相似性,查看相似性的时候采用海明距离(二进制数之间计算)。 对文章simhash得到一串64位二进制,一般取海明距离为3作为阈值,也就是在64位二进制中,只要有三位不同,就认为两个文档是相似的。(把一篇文章用一个二进制来表示) 3、步骤 (1)分词,取tfidf权重前20的词集合 (2)对这些词进行hash,得到64位二进制,得到20个长度为64的二进制集合 (3)hash位为1,则用正权重代替;hash位为0,则用负权值代替;得到20个长度为64的列表[weight, -weight, weight,…,weight] (4)对20个列表进行列向累加,得到一个列表,也就是对一个文档而言,得到一个长度为64的列表。 (5)对这个列表进行判断,正值取1,负值取0. 如[-7,1,-9,9,3,7] 得到 010111,这就是一篇文档的simhash值。 (6)计算相似度,两个simhash进行异或运算(海明距离),异或结果,1的个数超过3不相似

深入理解simhash原理

醉酒当歌 提交于 2019-12-06 14:03:55
一、LSH 介绍 LSH(Locality sensitive hashing)是局部敏感性hashing,它与传统的hash是不同的。传统hash的目的是希望得到O(1)的查找性能,将原始数据映射到相应的桶内。 LSH的基本思想是将空间中原始数据相邻的2个数据点通过映射或者投影变换后,这两个数据点在新的空间中的相邻概率很大,不相邻的点映射到同一个桶的概率小。我们可以看到将一个在超大集合内查找相邻元素的问题转化为了在一个很小的集合内查找相邻元素的问题,显然计算量下降了很多。下面借用一幅图来表示: LSH满足如下条件: i f d ( x , y ) ≤ d 1 , t h e n P ( h ( x ) = h ( y ) ) ≥ P 1 //--> i f d ( x , y ) ≥ d 2 , t h e n P ( h ( x ) = h ( y ) ) ≤ P 2 //--> •其中d(x,y)表示x和y之间的距离,d1 < d2,h(x)和h(y)分别表示对x和y进行hash变换。 •满足以上两个条件的hash functions称为(d1,d2,p1,p2)-sensitive。而通过一个或多个(d1,d2,p1,p2)-sensitive的hash function对原始数据集合进行hashing生成一个或多个hash table的过程称为Locality

simhash简介

自作多情 提交于 2019-12-06 13:56:25
先贴一张网上的图片: 解释一下图片:这里feature可以指一篇文档分词后的某个词,即将文档中的某个词作为一个特征。weight是这个词的权重,这里可以是这个词在这个句子中出现的次数。 这里的hash算法就是传统的hash算法,通过调用一个hash函数实现的。 simhash是为了计算一篇文档之间的相似度存在的,通过simhash算法可以计算出文档的simhash值,通过各个文档计算出的二进制值来计算文档之间的汉明距离,然后根据汉明距离来比较文档之间的相似度。汉明距离是指两个相同长度的字符串相同位置上不同的字符的个数。 simhash算法分为5个步骤:分词、hash、加权、合并、降维,具体过程如下所述: 分词 给定一段语句,进行分词,得到有效的特征向量,然后为每一个特征向量设置1-5等5个级别的权重(如果是给定一个文本,那么特征向量可以是文本中 的词,其权重可以是这个词出现的次数)。例如给定一段语句:“CSDN博客结构之法算法之道的作者July”,分词后为:“CSDN 博客 结构 之 法 算法 之 道 的 作者 July”,然后为每个特征向量赋予权值:CSDN(4) 博客(5) 结构(3) 之(1) 法(2) 算法(3) 之(1) 道(2) 的(1) 作者(5) July(5),其中括号里的数字代表这个单词在整条语句中的重要程度,数字越大代表越重要。 hash

面试|海量文本去重~simhash

徘徊边缘 提交于 2019-12-06 13:55:43
simhash算法是google发明的,专门用于海量文本去重的需求,所以在这里记录一下simhash工程化落地问题。 下面我说的都是工程化落地步骤,不仅仅是理论。 背景 互联网上,一篇文章被抄袭来抄袭去,转载来转载去。 被抄袭的文章一般不改,或者少量改动就发表了,所以判重并不是等于的关系,而是相似判断,这个判别的算法就是simhash。 simhash计算 给定一篇文章内容,利用simhash算法可以计算出一个哈希值(64位整形)。 判别两篇文章是相似的方法,就是两个simhash值的距离<=3,这里距离计算采用汉明距离,也就是2个simhash做一下异或运算,数一下比特位=1的有N位,那么距离就是N。 现在问题就是,如何计算文本的simhash? 分词+权重 首先需要将文章作分词,得到若干个(词组,权重)。 分词我们知道很多库都可以实现,最常见的就是结巴分词。权重是怎么得来的呢? 权重一般用TF/IDF算法,TF表示词组在本文章内的频次比例,出现越多则对这篇文章来说越重要,文章分词后TF可以立马计算出来。 IDF是词组在所有文章中的出现比例,出现越多说明词组对文章的区分度越低越不重要,但是IDF因为需要基于所有文章统计,所以一般是离线去批量计算出一个IDF字典。 结巴分词 支持加载IDF词典并且提供了一个默认的词典,它包含了大量的词组以及基于海量文本统计出来的IDF词频