simhash原理及使用
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值相似度。度量两个simhash值相似度一般使用海明距离。
二进制串A和二进制串B的海明距离 就是A异或B后二进制中1的个数。
举例如下:
A = 100111;
B = 101010;
hamming_distance(A, B) = count_1(A xor B) = count_1(001101) = 3
A和B的海明距离是否小于等于n,这个n值根据经验一般取值为3。
4. Python使用
使用simhash。
(1) 查看simhash值
>>> from simhash import Simhash
>>> print '%x' % Simhash(u'I am very happy'.split()).value
9f8fd7efdb1ded7f
Simhash()
接收一个token序列,或者叫特征序列。
(2)计算两个simhash值距离
>>> hash1 = Simhash(u'I am very happy'.split())
>>> hash2 = Simhash(u'I am very sad'.split())
>>> print hash1.distance(hash2)
5
(3)建立索引
simhash被用来去重。如果两两分别计算simhash值,数据量较大的情况下肯定hold不住。有专门的数据结构,参考:http://www.cnblogs.com/maybe2030/p/5203186.html#_label4
from simhash import Simhash, SimhashIndex
# 建立索引
data = {u'1': u'How are you I Am fine . blar blar blar blar blar Thanks .'.lower().split(),u'2': u'How are you i am fine .'.lower().split(),u'3': u'This is simhash test .'.lower().split(),
}
objs = [(id, Simhash(sent)) for id, sent in data.items()]
index = SimhashIndex(objs, k=10) # k是容忍度;k越大,检索出的相似文本就越多
# 检索
s1 = Simhash(u'How are you . blar blar blar blar blar Thanks'.lower().split())
print index.get_near_dups(s1)
# 增加新索引
index.add(u'4', s1)
Ref
http://yanyiwu.com/work/2014/01/30/simhash-shi-xian-xiang-jie.html
http://blog.csdn.net/madujin/article/details/53152619
http://leons.im/posts/a-python-implementation-of-simhash-algorithm/
simhash原理及使用相关推荐
- [转] 文本相似性算法Simhash原理及实践
simhash(局部敏感哈希)的原理 simhash的背景 simhash广泛的用于搜索领域中,也许在面试时你会经常遇到这样的问题,如果对抓取的网页进行排重,如何对搜索结果进行排重等等.随着信息膨胀时 ...
- 深入理解simhash原理
一.LSH 介绍 LSH(Locality sensitive hashing)是局部敏感性hashing,它与传统的hash是不同的.传统hash的目的是希望得到O(1)的查找性能,将原始数据映射到 ...
- Simhash算法及python实现
1. 为什么需要Simhash? 传统相似度算法:文本相似度的计算,一般使用向量空间模型(VSM),先对文本分词,提取特征,根据特征建立文本向量,把文本之间相似度的计算转化为特征向量距离的计算,如欧式 ...
- Java---SimHash原理与实现
Java-SimHash原理与实现 SimHash 原理 原理链接 SimHash 实现 package GetSimilar;import java.io.BufferedReader; impor ...
- 海量数据相似度计算之simhash和海明距离
通过 采集系统 我们采集了大量文本数据,但是文本中有很多重复数据影响我们对于结果的分析.分析前我们需要对这些数据去除重复,如何选择和设计文本的去重算法?常见的有余弦夹角算法.欧式距离.Jaccard相 ...
- 中文文本相似度计算工具集
欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 一.基本工具集 1.分词工具 a.jieba 结巴中文分词 htt ...
- 微信的原创保护机制到底是如何实现的?
前言 众所周知,目前微信公众号是最具商业价值的写作平台,这与它优秀的原创保护机制密不可分,如果你想将其他公众号上的文章标为原创,微信会给出类似如下的信息告诉你未通过原创校验逻辑. 如果你抓包会发现微信 ...
- 结巴分词关键词相似度_中文文本相似度计算工具集
[磐创AI导读]:前两篇文章中我们介绍了一些机器学习不错的项目合集和深度学习入门资源合集,本篇文章将对中文文本相似度计算工具做一次汇总.喜欢我们文章的小伙伴,欢迎大家点击上方蓝字关注我们的公众号:磐创 ...
- Tag Archives: 海明距离
在前一篇文章 <海量数据相似度计算之simhash和海明距离> 介绍了simhash的原理,大家应该感觉到了算法的魅力.但是随着业务的增长 simhash的数据也会暴增,如果一天100w, ...
最新文章
- 相同命名空间相同类名的程序集间引发的致命错误
- python各个解释器的用途-常见的Python五大解释器!
- (更新中)篮球相关英语积累与2020年NBA东部决赛:迈阿密热火与波士顿凯尔特人
- erlang精要(10)-erl(2)
- cut、grep和排序命令
- react-webpack config webpack@3.4.1
- H264视频通过RTMP直播
- Hadoop2之NameNode HA详解
- Kung Fu Panda: Legends of Awesomeness 2
- TensorFlow.js:零基础在小程序上实现机器学习
- QString字符串拼接【转载】
- 基于PWM调宽的呼吸灯算法
- 小程序mqtt实现聊天功能
- python3中eval函数用法简介_python3中eval函数用法使用简介
- 【线性代数】1.2矩阵的行列式与克莱姆法则
- vue 前端传图片文件,后端接收
- MA1 轻轻松松学统计分析(下)
- Python-实战:基于白鲸BWO算法的VMD超参数优化
- 新手Mac需要了解哪些内容?Mac小白基础教程
- webpack(7)_CSS_使用style-loader和css-loader
热门文章
- 牛客网比赛-Wannafly挑战赛27
- 【Dev c++编辑器代码颜色修改指南】
- #visual studio编译# warning LNK4075: ignoring '/EDITANDCONTINUE' due to '/SAFESEH' specification
- 全麦吐司和普通吐司的区别_全麦面包和普通面包的区别有哪些?
- 10天免登录操作,保存/取消cookie
- 国外LEAD美国简称对照表
- python 降维 聚类_python数据挖掘实战之四:聚类
- ios作为pc摄像头,pc作为ios/另一pc摄像头
- 运维监控之EMC存储监控及其系列产品
- HTML基础 - HTML列表