SimHash

关于SimHash算法的实现及测试V1.0

点点圈 提交于 2021-02-20 01:05:47
@祁俊辉,2017年5月21日测试。 1 说明 本程序是简化版的SimHash算法(分词暂为手动分词,每个词的权重都设为1); 本程序是基于《数学之美 》第二版第16章所介绍的原理展开; 本篇文章将计算多个字符串的SimHash值,并将对其分析; 本篇文章暂不介绍SimHash算法的原理,因为网上的资源相对较杂,待我彻底理解,整理过后更新(已在笔记本中); 本篇文章(程序)将持续更新。 2 程序(32位) 关于程序的解释,都在程序源码中有相应的注释。若有不明白之处,请联系本人:qce.hui@qq.com。 1 /* 【算法】SimHash->32位 2 * 【说明】1.本程序手动分词,假设每个词的权重都为1 3 * 【说明】2.对每个词进行BKDRHash算法,在此基础上加减权重 4 * 【说明】3.将所有词整合后,降维 5 * 【说明】4.计算各个句子的海明距离 6 * 【时间】祁俊辉->2017.5.19 7 * */ 8 public class SimHash_32 { 9 // 定义待比较的字符串 10 static String s1="SimHash/算法/的/研究" ; 11 static String s2="SimHash/算法/的/探讨" ; 12 static String s3="SimHash/研究/的/算法" ; 13 static String

从NLP任务中文本向量的降维问题,引出LSH(Locality Sensitive Hash 局部敏感哈希)算法及其思想的讨论

别说谁变了你拦得住时间么 提交于 2021-01-06 11:56:11
1. 引言 - 近似近邻搜索被提出所在的时代背景和挑战 0x1:从NN(Neighbor Search)说起 ANN的前身技术是NN(Neighbor Search),简单地说,最近邻检索就是根据数据的相似性,从数据集中寻找与目标数据最相似的项目,而这种相似性通常会被量化到空间上数据之间的距离,例如欧几里得距离(Euclidean distance),NN认为数据在空间中的距离越近,则数据之间的相似性越高。 当需要查找离目标数据最近的前k个数据项时,就是k最近邻检索(K-NN)。 0x2:NN的技术挑战与发展 近些年的研究中涌现出大量以最近邻检索为基本思想的方法,主要可分为两类: 数据结构改进:基于提升检索结构性能的新数据结构,大多基于树形结构,例如KD-Tree。关于KD-tree的相关讨论可以参阅另一篇 博客 。 高效索引方法改进:基于对数据本身的索引和处理的方法,包括哈希算法、矢量量化方法等。哈希算法就是使用HASH算法构建数据索引,HASH方法的确效率很高,但是因为其全局敏感性,输入文本只要有任何微小的变化,得到的Hash Index就会发生改变,因此无法提高近邻搜索的性能。 尽管出现了很多针对NN算法的改进措施,但是在实际工业场景中,NN算法遇到最大阻碍是: 数据经过向量化(即特征工程)之后,因为特征空间特别高维(上百/上千/甚至上万),导致在空间距离上特别稀疏

NLP 语义相似度计算 整理总结

☆樱花仙子☆ 提交于 2020-07-27 18:56:44
更新中 更新时间: 2019-12-03 18:29:52 写在前面: 本人是喜欢这个方向的学生一枚,写文的目的意在记录自己所学,梳理自己的思路,同时share给在这个方向上一起努力的同学。写得不够专业的地方望批评指正,欢迎感兴趣的同学一起交流进步。 (参考文献在第四部分, 侵删 ) 一、背景 二、基本概念 三、语义相似度计算方法 四、参考文献 一、背景 在很多NLP任务中,都涉及到语义相似度的计算,例如: 在搜索场景下(对话系统、问答系统、推理等),query和Doc的语义相似度; feeds场景下Doc和Doc的语义相似度; 在各种分类任务,翻译场景下,都会涉及到语义相似度语义相似度的计算。 所以在学习的过程中,希望能够更系统的梳理一下这方面的方法。 二、基本概念 1. TF Term frequency即关键词词频,是指一篇文章中关键词出现的频率,比如在一篇M个词的文章中有N个该关键词,则 为该关键词在这篇文章中的词频。 2. IDF Inverse document frequency指逆向文本频率,是用于衡量关键词权重的指数,由公式 计算而得,其中D为文章总数,Dw为关键词出现过的文章数。 3. 向量空间模型 向量空间模型简称 VSM,是 VectorSpace Model 的缩写。在此模型中,文本被看作是由一系列相互独立的词语组成的,若文档 D 中包含词语 t1,t2,

关于SimHash算法的实现及测试V2.0

戏子无情 提交于 2020-05-05 01:53:03
@祁俊辉,2017年6月4日测试。 1 说明 本文章衔接 关于SimHash算法的实现及测试V1.0 ; 将Hash函数更新为MD5_Hash函数(二进制为128位); 个人感觉用海明距离并不能只管说明两篇文章(字符串)相似,故添加相似度,但对于相似度的计算只是利用最简单的,有很多不妥之处。 2 MD5_Hash算法 2.1 MD5简介 MD5即“消息-摘要算法第五版”,是计算机领域广泛使用的一种散列函数,用以提供消息的完整性保护。 特点: 压缩性:任意长度的数据,算出的MD5值是长度固定的。 易计算:从原数据计算出MD5值很容易。 抗修改性:对原数据进行任何改动,所得到的MD5值都有很大区别。 强抗碰撞:已知原数据和其MD5值,想找到一个具有相同的MD5值的数据是非常困难的。 注:加密和摘要是不一样的! 加密后的消息是完整的,具有解密算法,得到原始数据。 摘要得到的消息是不完整的,通过摘要的数据,不能得到原始数据。 2.2 MD5长度问题 标准的MD5算法输出的是128bit二进制串。 但有些情况下,对于128bit数据不易处理,故取4bit成一个十六进制,常用32位十六进制串表示。 网上也有16位十六进制串所表示的MD5值,是将正常的32位十六进制串的前8位和后8位去掉,中间的部分所组成的16位十六进制串。 2.3 MD5应用 一致性效验。如常见的下载站点中

常见的距离算法和相似度(相关系数)计算方法

泄露秘密 提交于 2020-04-14 20:56:09
【推荐阅读】微服务还能火多久?>>> 摘要: 1.常见的距离算法 1.1欧几里得距离(Euclidean Distance)以及欧式距离的标准化(Standardized Euclidean distance) 1.2马哈拉诺比斯距离(Mahalanobis Distance) 1.3 曼哈顿 距离(Manhattan Distance) 1.4切比雪夫距离(Chebyshev Distance) 1.5明可夫斯基距离(Minkowski Distance) 1.6海明距离(Hamming distance) 2.常见的相似度(系数)算法 2.1余弦相似度(Cosine Similarity)以及调整余弦相似度(Adjusted Cosine Similarity) 2.2皮尔森相关系数(Pearson Correlation Coefficient) 2.3Jaccard相似系数(Jaccard Coefficient) 2.4Tanimoto系数(广义Jaccard相似系数) 2.5对数似然相似度/对数似然相似率 2.6互信息/信息增益,相对熵/KL散度 2.7信息检索--词频-逆文档频率(TF-IDF) 2.8词对相似度--点间互信息 3.距离算法与相似度算法的选择(对比) 内容: 1.常见的距离算法 1.1欧几里得距离(Euclidean Distance) 公式:

以图搜图技术与simhash算法.md

旧时模样 提交于 2020-01-02 23:21:37
背景 以图搜图是很有颠覆力的应用,俗话说 一图胜千言 不同于文本搜索的匹配模式,以图搜图要对搜索的信息源进行处理,抽取特征信息。在网易存证系统的开发过程中调研了用于以图搜图的 simhash 算法,并设想在内容系统建设完善后可以用于诸多的场景,比如: 商业图片侵权自动取证 肖像内容的识别 家庭照片按场景自动分类 图片指纹比较 simhash算法 阮一峰博客 相似图片搜索的原理 压缩大小 压缩颜色 计算平均灰度值 每个像素和平均值比较,大的为1;小的为0, 进一步向量化 得出向量,就是图片指纹, 计算汉明距离 hamming distance 如上过程的java实现 通过如上粗粒度的算法分析,可知simhash和普通hash算法有较大不同;普通hash算法是对字节流无差别的处理,但是simhash首先会对信息抽取特征值,然后计算汉明距离,最后这步是关键,度量了两个特征量的相似性,让我们有可能在抓取了两张图片的关键特征的基础上,比较其相似性。 动手实验 普通hash是差一个空格,也相差极大,比如如下(差别就是一个是 喊 ,一个是 叫 ): vincent@vincent-B250M-DS3H:~$ cat > 1.txt 你妈妈喊你回家吃饭,回家罗回家罗 vincent@vincent-B250M-DS3H:~$ cat > 2.txt 你妈妈叫你回家吃饭,回家罗回家罗 然后,cat

calculate pairwise simhash “distances”

醉酒当歌 提交于 2019-12-24 15:09:03
问题 I want to construct a pairwise distance matrix where the "distances" are the similarity scores between two strings as implemented here. I was thinking of using sci-kit learn's pairwise distance method to do this, as I've used it before for other calculations and the easy parallelization is great. Here's the relevant piece of code: def hashdistance(str1, str2): hash1 = simhash(str1) hash2 = simhash(str2) distance = 1 - hash1.similarity(hash2) return distance strings = [d['string'] for d in

火眼金睛算法,教你海量短文本场景下去重

浪尽此生 提交于 2019-12-14 21:39:00
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 本文由QQ大数据发表 最朴素的做法 在大多数情况下,大量的重复文本一般不会是什么好事情,比如互相抄袭的新闻,群发的垃圾短信,铺天盖地的广告文案等,这些都会造成网络内容的同质化并加重数据库的存储负担,更糟糕的是降低了文本内容的质量。因此需要一种准确而高效率的文本去重算法。而最朴素的做法就是将所有文本进行两两比较,简单易理解,最符合人类的直觉,对于少量文本来说,实现起来也很方便,但是对于海量文本来说,这明显是行不通的,因为它的时间复杂度是,针对亿级别的文本去重时,时间消耗可能就要以年为单位,此路不通。 另外,我们讲到去重,实际上暗含了两个方面的内容,第一是用什么方式去比较更为高效,第二是比较的时候去重标准是什么。这里的去重标准在文本领域来说,就是如何度量两个文本的相似性,通常包含编辑距离,Jaccard距离,cosine距离,欧氏距离,语义距离等等,在不同领域和场景下选用不同的相似性度量方法,这里不是本文的重点,所以按下不表,下面着重解决如何进行高效率比较的问题。 核心思想 降低时间复杂度的关键: > 尽力将潜在的相似文本聚合到一块,从而大大缩小需要比较的范围 simHash算法 海量文本去重算法里面,最为知名的就是simHash算法,是谷歌提出来的一套算法,并被应用到实际的网页去重中。

海量数据相似度计算实例 simhash和海明距离

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

介绍一个基于simhash作海量文章排重的库:simhashpy

断了今生、忘了曾经 提交于 2019-12-14 21:34:56
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 基于simhash的海量文章排重的实践 简单介绍 simhash是一种能计算文档相似度的hash算法。通过simhash能将一篇文章映射成64bit,再比较两篇文章的64bit的海明距离,就能知道文章的相似程序。若两篇文章的海明距离<=3,可认为这两篇文章很相近,可认为它们是重复的文章。 这篇博客有详细的介绍 simhash-py 要更准确的对文章进行排重,需要找到好的simhash算法。目前我知道的有 python-hashes ,simhash-py。两个库通过简单的修改,再加上中文分词库,可以比较好的对中文文章计算hash。 simhash-py 可使用我fork的版本以支持中文文章的simhash (通过里面的hash_token或hash_tokenpy两个函数实现对切词之后的中文文章进行simhash计算)。 simhash算法 simhash算法最简单实现的库应该是python-hashes库了。使用过程当中发现,对于排重的使用目的来说,这个库的simhash算法有缺点是:只考虑到文章存在哪些词,没有考虑到词的顺序。不过相应的优点是,可以实现海量文章相似度计算。文章相似度计算忽略词的顺序之后效果更好。 simhash-py内部实现了simhash算法。它里面的simhash使用了cyclic