SimHash

simhash原理及使用

孤人 提交于 2019-12-06 13:44:31
1. 简介 simhash是一种 局部敏感hash 。那什么叫局部敏感呢,假定两个字符串具有一定的相似性,在hash之后,仍然能保持这种相似性,就称之为局部敏感hash。普通的hash是不具有这种属性的。simhash被Google用来在海量文本中去重。 2. 原理 算法过程大概如下: 将Doc进行关键词抽取(其中包括分词和计算权重),抽取出n个(关键词,权重)对, 即图中的多个 (feature, weight) 。 记为 feature_weight_pairs = [fw1, fw2 … fwn] ,其中 fwn = (feature_n,weight_n) 。 对每个 feature_weight_pairs 中的 feature 进行hash。 图中假设hash生成的位数bits_count = 6。 然后对 hash_weight_pairs 进行位的纵向累加,如果该位是1,则 +weight ,如果是0,则 -weight ,最后生成bits_count个数字,如图所示是 [13, 108, -22, -5, -32, 55] , 这里产生的值和hash函数所用的算法相关。 [13,108,-22,-5,-32,55] -> 110001 这个就很简单啦,正1负0。 3. 距离计算 通过simhash,我们要度量两个文档的相似度就可以通过

利用simhash来进行文本去重复

自作多情 提交于 2019-12-06 13:44:08
原文 http://d3s.mff.cuni.cz/~holub/sw/shash/#a1 传统的hash函数能够将一样的文本生成一样的hash函数,但是,通过simhash方法,能够差不多相同的文档得到的hash函数也比较相近。 Charikar's hash 通过Charikar‘s hash,能够将比较相似度的文档得到比较相近的fingerprint。 该算法的流程如下: * Document is split into tokens (words for example) or super-tokens (word tuples) * Each token is represented by its hash value; a traditional hash function is used * Weights are associated with tokens * A vector V of integers is initialized to 0, length of the vector corresponds to the desired hash size in bits * In a cycle for all token's hash values (h), vector V is updated: o ith element is decreased

浅谈simhash及其python实现

时光总嘲笑我的痴心妄想 提交于 2019-12-06 13:43:27
作者原创,转载请注明出处。 一直想写个总结来回顾simhash,一直没抽出时间,现在还是好好写写总结一下。作者随笔,废话有点多,不喜勿喷,欢迎指教。 谷歌每天从网上抓取海量的信息,怎么样区分重复的呢,据说就采用了simhash算法,当然肯定也不仅仅就只采用它,不过至少可以说明其性能。 预备知识: 我们知道,在文本去重的时候,有很多方式,在文本与文本之间对比,如果是整篇对比,费时费力,有人就想到用什么东西代表每篇文章,如摘要,当然,对计算机来说,摘要和整篇的区别只是缩小了篇幅,所以又有人想到了采用关键字来对比。这样确实可以大大缩减我们对比的复杂性。那我们怎么得到一篇文章的关键字呢?一般采用词频(TF),但是只用词频,如中文出现类似“的”、“我们”之类的词语很多,应该怎么去掉这些词语呢,手动去掉实在是麻烦,于是可以结合逆向词频(IDF),这就是著名的TD-IDF,一种提取一个文章的关键词的算法。词频我们很好理解,一个词语在整篇文章中出现的次数与词语总个数之比。IDF又怎么算呢,假如一个词语,在我们所有文章中出现的频率都非常高(例如“的”在我们多个文本中出现的次数很多),我们就认为,这个词语不具有代表性,就可以降低其作用,也就是赋予其较小的权值。 那这个权重,我们怎么计算呢,(这里敲公式比较麻烦,直接找来图片),如下图,分子代表文章总数,分母表示该词语在这些文章(|D|)出现的篇数

LSH搜索算法

我们两清 提交于 2019-12-04 01:32:24
LSH(Location Sensitive Hash),即位置敏感哈希函数。与一般哈希函数不同的是位置敏感性,也就是散列前的相似点经过哈希之后,也能够在一定程度上相似,并且具有一定的概率保证。 作者注:LSH算法分两种:SimHash和MinHash。 simhash的原理是减少搜索空间,用汉明距离替代余弦距离 minHash的原理是降维。通过hash映射函数,将特征元素的个数降下来。 形式化定义: 对于任意q,p属于S,若从集合S到U的函数族H={h1,h2...hn}对距离函数D(,),如欧式距离、曼哈顿距离等等,满足条件: 则称D(,)是位置敏感的。 如下图,空间上的点经位置敏感哈希函数散列之后,对于q,其rNN有可能散列到同一个桶(如第一个桶),即散列到第一个桶的概率较大,会大于某一个概率阈值p1;而其(1+emxilong)rNN之外的对象则不太可能散列到第一个桶,即散列到第一个桶的概率很小,会小于某个阈值p2. LSH的作用 ◆高维下近似查询 相似性检索在各种领域特别是在视频、音频、图像、文本等含有丰富特征信息领域中的应用变得越来越重要。丰富的特征信息一般用高维向量表示,由此相似性检索一般通过K近邻或近似近邻查询来实现。一个理想的相似性检索一般需要满足以下四个条件: 1. 高准确性。即返回的结果和线性查找的结果接近。 2. 空间复杂度低。即占用内存空间少。理想状态下

simhash文本相似度比较

こ雲淡風輕ζ 提交于 2019-12-02 13:00:14
在simhash中处理一个文本的步骤如下: 第一步,分词: 对文本进行分词操作,同时需要我们同时返回当前词组在文本内容中的权重(这基本上是目前所有分词工具都支持的功能)。 第二步,计算hash: 对于每一个得到的词组做hash,将词语表示为到01表示的bit位,需要保证每个hash结果的位数相同,如图中所示,使用的是8bit。 第三步,加权 根据每个词组对应的权重,对hash值做加权计算(bit为1则取为1做乘积,bit为0则取为-1做乘积),如上图中, 10011111与权重2加权得到[2 -2 -2 2 2 2 2 2]; 01001011与权重1加权得到[-1 1 -1 -1 1 -1 1 1]; 01001011与权重4加权后得到[-4 4 -4 -4 4 -4 4 4]; 第三步,纵向相加: 将上述得到的加权向量结果,进行纵向相加实现降维,如上述所示,得到[-3 3 -7 -3 7 -3 7 7]。 第四步,归一化: 将最终降维向量,对于每一位大于0则取为1,否则取为0,这样就能得到最终的simhash的指纹签名[0 1 0 0 1 0 1 1] 第五步,相似度比较: 通过上面的步骤,我们可以利用SimHash算法为每一个网页生成一个向量指纹,在simhash中,判断2篇文本的相似性使用的是海明距离。什么是汉明距离?前文已经介绍过了。在在经验数据上

Choosing between SimHash and MinHash for a production system

会有一股神秘感。 提交于 2019-11-30 18:23:24
I'm familiar with the LSH (Locality Sensitive Hashing) techniques of SimHash and MinHash. SimHash uses cosine similarity over real-valued data. MinHash calculates resemblance similarity over binary vectors. But I can't decide which one would be better to use. I am creating a backend system for a website to find near duplicates of semi-structured text data. For example, each record will have a title, location, and a brief text description (<500 words). Specific language implementation aside, which algorithm would be best for a greenfield production system? Simhash is faster (very fast) and

Choosing between SimHash and MinHash for a production system

空扰寡人 提交于 2019-11-29 17:54:39
问题 I'm familiar with the LSH (Locality Sensitive Hashing) techniques of SimHash and MinHash. SimHash uses cosine similarity over real-valued data. MinHash calculates resemblance similarity over binary vectors. But I can't decide which one would be better to use. I am creating a backend system for a website to find near duplicates of semi-structured text data. For example, each record will have a title, location, and a brief text description (<500 words). Specific language implementation aside,

从0到1,了解NLP中的文本相似度

北慕城南 提交于 2019-11-27 14:25:42
本文由云+社区发表 作者:netkiddy 导语 AI在2018年应该是互联网界最火的名词,没有之一。时间来到了9102年,也是项目相关,涉及到了一些AI写作相关的功能,为客户生成一些素材文章。但是,AI并不一定最懂你,客户对于AI写出来的文章,多少是会做些修改的。为了更好的衡量出AI文章的可用度,在这儿就会需要存有一个反馈的环节,来看看用户润色后的文章与原始AI文章之间的区别是多大,AI写出来的文章可用性是否足够。由于目前还没精力细究AI写作其中的细节,为了更好地计算每次成文与原文的区分,便花了点小时间看了看文本相似度的知识点,记录于此。 本文将从预备知识的概念开始介绍,从距离名词,到文本分词,相似度算法,并将这些概念融合、统一的介绍NLP中文本相似度的知识,期望通过本文,大家可以与我一样,对这些知识有个基本的了解。 几个距离 在介绍更多的内容之前,我们需要了解文本距离的概念,这些距离是我们在后文比较文本相似度的基础,所以下面将首先形象的为大家介绍几个重要且基础的距离含义。 欧几里德距离 Euclidean Distance,是最直白的、最容易直观理解的距离度量方法,在二维空间来看,用一句几乎耳熟能详的话来解释就是:两点之间直线最短。这句话中说到的「直线距离」就是欧几里德距离。我们来看下相关数学公式定义。 二维的公式: ​ p = sqrt( (x1-y1)^2+(x2-y2)

利用word分词来计算文本相似度

懵懂的女人 提交于 2019-11-27 01:11:16
word分词 提供了多种文本相似度计算方式: 方式一:余弦相似度,通过计算两个向量的夹角余弦值来评估他们的相似度 实现类: org.apdplat.word.analysis.CosineTextSimilarity 用法如下: String text1 = "我爱购物"; String text2 = "我爱读书"; String text3 = "他是黑客"; TextSimilarity textSimilarity = new CosineTextSimilarity(); double score1pk1 = textSimilarity.similarScore(text1, text1); double score1pk2 = textSimilarity.similarScore(text1, text2); double score1pk3 = textSimilarity.similarScore(text1, text3); double score2pk2 = textSimilarity.similarScore(text2, text2); double score2pk3 = textSimilarity.similarScore(text2, text3); double score3pk3 = textSimilarity.similarScore

simhash的py实现

流过昼夜 提交于 2019-11-26 05:26:51
前言: 这篇博客主要从python(3)代码的角度来讲本人是如何实现simhash的,不足之处还望大家不吝赐教。simhash的算法原理大家可以参考 简单易懂讲解simhash算法 。值得一提的是文中提到simhash对长文本更加有效,个人从算法原理角度思考过后感觉也是如此。 初始化 首先我们要明确我们需要的是什么,给定了一个大语料,我们希望得到的是每个词的编码以及对应的权重,那么我们可以将目标拆分为以下几个: 1.对文本进行分词,并根据需要进行停词处理。 2.对每个词进行hash编码(一般用32位的就够了)。 3.对每个词赋予权重,这里正好就能用idf的值作为其权重值,idf具体介绍可见 tf-idf进行关键词提取 说了这么多,还是用代码来看看具体是怎么做到的吧~ 分词 一上来就是最让人头疼的问题,如何进行分词,分词的相关理论也是种类繁多,能够成一个专题,这里大家有兴趣的可以自行去查阅相关资料,我在这里使用的是jieba分词,jieba是一个功能强大的分词工具,大家可以参考博客 好玩的分词–jieba模块的的基本用法 ,分词完毕后我将其保存为新的txt(test_ws.txt),之后我们载入的文本文件便是分词过后的文件了。 hash编码和idf值计算 # -*- coding:utf-8 -*- import numpy as np import codecs import