1. 为什么需要Simhash?

传统相似度算法:文本相似度的计算,一般使用向量空间模型(VSM),先对文本分词,提取特征,根据特征建立文本向量,把文本之间相似度的计算转化为特征向量距离的计算,如欧式距离、余弦夹角等。

缺点:大数据情况下复杂度会很高。

Simhash应用场景:计算大规模文本相似度,实现海量文本信息去重。

Simhash算法原理:通过hash值比较相似度,通过两个字符串计算出的hash值,进行异或操作,然后得到相差的个数,数字越大则差异越大。

2. 文章关键词特征提取算法TD-IDF

词频(TF):一个词语在整篇文章中出现的次数与词语总个数之比;

逆向词频(IDF):一个词语,在所有文章中出现的频率都非常高,这个词语不具有代表性,就可以降低其作用,也就是赋予其较小的权值。

分子代表文章总数,分母表示该词语在这些文章出现的篇数。一般会采取分母加一的方法,防止分母为0的情况出现,在这个比值之后取对数,就是IDF了。

最终用tf*idf得到一个词语的权重,进而计算一篇文章的关键词。然后根据每篇文章对比其关键词的方法来对文章进行去重。simhash算法对效率和性能进行平衡,既可以很少的对比(关键词不能取太多),又能有好的代表性(关键词不能过少)。

3. Simhash原理

Simhash是一种局部敏感hash。即假定A、B具有一定的相似性,在hash之后,仍然能保持这种相似性,就称之为局部敏感hash。

得到一篇文章关键词集合,通过hash的方法把关键词集合hash成一串二进制,直接对比二进制数,其相似性就是两篇文档的相似性,在查看相似性时采用海明距离,即在对比二进制的时候,看其有多少位不同,就称海明距离为多少。

将文章simhash得到一串64位的二进制,根据经验一般取海明距离为3作为阈值,即在64位二进制中,只要有三位以内不同,就可以认为两个文档是相似的,这里的阈值也可以根据自己的需求来设置。也就是把一个文档hash之后得到一串二进制数的算法,称这个hash为simhash。

simhash具体实现步骤如下:

1. 将文档分词,取一个文章的TF-IDF权重最高的前20个词(feature)和权重(weight)。即一篇文档得到一个长度为20的(feature:weight)的集合。

2. 对其中的词(feature),进行普通的哈希之后得到一个64为的二进制,得到长度为20的(hash : weight)的集合。

3. 根据(2)中得到一串二进制数(hash)中相应位置是1是0,对相应位置取正值weight和负值weight。例如一个词进过(2)得到(010111:5)进过步骤(3)之后可以得到列表[-5,5,-5,5,5,5]。由此可以得到20个长度为64的列表[weight,-weight...weight]代表一个文档。

4. 对(3)中20个列表进行列向累加得到一个列表。如[-5,5,-5,5,5,5]、[-3,-3,-3,3,-3,3]、[1,-1,-1,1,1,1]进行列向累加得到[-7,1,-9,9,3,9],这样,我们对一个文档得到,一个长度为64的列表。

5. 对(4)中得到的列表中每个值进行判断,当为负值的时候去0,正值取1。例如,[-7,1,-9,9,3,9]得到010111,这样就得到一个文档的simhash值了。

6. 计算相似性。两个simhash取异或,看其中1的个数是否超过3。超过3则判定为不相似,小于等于3则判定为相似。

Simhash整体流程图如下:

4. Simhash的不足

完全无关的文本正好对应成了相同的simhash,精确度并不是很高,而且simhash更适用于较长的文本,但是在大规模语料进行去重时,simhash的计算速度优势还是很不错的。

5. Simhash算法实现

# !/usr/bin/python
# coding=utf-8class Simhash:def __init__(self, tokens='', hashbits=128):self.hashbits = hashbitsself.hash = self.simhash(tokens)def __str__(self):return str(self.hash)# 生成simhash值def simhash(self, tokens):v = [0] * self.hashbitsfor t in [self._string_hash(x) for x in tokens]:  # t为token的普通hash值for i in range(self.hashbits):bitmask = 1 << iif t & bitmask:v[i] += 1  # 查看当前bit位是否为1,是的话将该位+1else:v[i] -= 1  # 否则的话,该位-1fingerprint = 0for i in range(self.hashbits):if v[i] >= 0:fingerprint += 1 << ireturn fingerprint  # 整个文档的fingerprint为最终各个位>=0的和# 求海明距离def hamming_distance(self, other):x = (self.hash ^ other.hash) & ((1 << self.hashbits) - 1)tot = 0while x:tot += 1x &= x - 1return tot# 求相似度def similarity(self, other):a = float(self.hash)b = float(other.hash)if a > b:return b / aelse:return a / b# 针对source生成hash值def _string_hash(self, source):if source == "":return 0else:x = ord(source[0]) << 7m = 1000003mask = 2 ** self.hashbits - 1for c in source:x = ((x * m) ^ ord(c)) & maskx ^= len(source)if x == -1:x = -2return x

测试

if __name__ == '__main__':s = 'This is a test string for testing'hash1 = Simhash(s.split())s = 'This is a string testing 11'hash2 = Simhash(s.split())print(hash1.hamming_distance(hash2), "   ", hash1.similarity(hash2))

Simhash算法及python实现相关推荐

  1. 文本相似度计算——Simhash算法(python实现)

    互联网网页存在着大量重复内容,必须有一套高效的去重算法,否则爬虫将做非常多的无用功,工作时效性无法得到保证,更重要的是用户体验也不好.业界关于文本指纹去重的算法众多,如 k-shingle 算法.go ...

  2. 【python 走进NLP】simhash 算法计算两篇文章相似度

    互联网网页存在大量的重复内容网页,无论对于搜索引擎的网页去重和过滤.新闻小说等内容网站的内容反盗版和追踪,还是社交媒体等文本去重和聚类,都需要对网页或者文本进行去重和过滤.最简单的文本相似性计算方法可 ...

  3. Simhash算法详解及python实现

    Simhash算法详解及python实现 GoogleMoses Charikar发表的一篇论文"detecting near-duplicates for web crawling&quo ...

  4. 基于局部敏感哈希的协同过滤算法之simHash算法

    搜集了快一个月的资料,虽然不完全懂,但还是先慢慢写着吧,说不定就有思路了呢. 开源的最大好处是会让作者对脏乱臭的代码有羞耻感. 当一个做推荐系统的部门开始重视[数据清理,数据标柱,效果评测,数据统计, ...

  5. R语言︱文本挖掘——jiabaR包与分词向量化的simhash算法(与word2vec简单比较)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- <数据挖掘之道>摘录话语:虽然我比 ...

  6. 基于朴素贝叶斯的垃圾分类算法(Python实现)

    有代码和数据集的 https://blog.csdn.net/weixin_33734785/article/details/91428991 附有git库代码的 https://www.cnblog ...

  7. 手把手教你在多种无监督聚类算法实现Python(附代码)

    来源: 机器之心 本文约2704字,建议阅读6分钟. 本文简要介绍了多种无监督学习算法的 Python 实现,包括 K 均值聚类.层次聚类.t-SNE 聚类.DBSCAN 聚类. 无监督学习是一类用于 ...

  8. 八大排序算法的 Python 实现

    八大排序算法的 Python 实现 本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入 ...

  9. Fuzzy C Means 算法及其 Python 实现——写得很清楚,见原文

    Fuzzy C Means 算法及其 Python 实现 转自:http://note4code.com/2015/04/14/fuzzy-c-means-%E7%AE%97%E6%B3%95%E5% ...

最新文章

  1. C语言case次数有限制吗,用switch...case语句统计数字、空格和其他字符出现的次数...
  2. 分布式全局序列号生产,Twitter Snowflake算法,雪花算法
  3. Windows DPM 备份数据
  4. 如何构建可视化的营销数据大屏?
  5. 全球及中国太阳能光热发电市场重点项目规划及发展格局展望报告2021-2027年
  6. 角色操作-查询所有角色流程分析
  7. 磁盘剩余空间策略_MySQL磁盘消耗迅猛掌握这点就够了,包你事半功倍
  8. 箱体图_靓爆了!东莞近千个市政箱体换上“新装”成街头风景线
  9. 阶段1 语言基础+高级_1-3-Java语言高级_1-常用API_1_第7节 Arrays工具类_17_Arrays练习:字符串倒序...
  10. linux备份数据库
  11. 集成融云 即时通讯总结
  12. 工业物联网技术体系包括哪些
  13. 网络1712--c语言函数作业总结
  14. oracle 数据占百分比,占总数比例怎么算_占总金额百分比公式
  15. transformer 模型的decoder部分 带gif动图
  16. 浅谈域名分级及域名解析过程
  17. 论文阅读《Fast-MVSNet: Sparse-to-Dense Multi-View StereoWith Learned Propagation and Gauss-Newton Refine》
  18. 安卓游戏应用如何在linux上流畅运行
  19. 人工智能是怎么准备训练样本的
  20. mac pro M1(ARM)安装:python开发环境

热门文章

  1. 即将面试的朋友注意啦, 技术突击的机会来啦
  2. 今日IBM(IBM china / IGSC / ISSC / ETC),转载于2009-10-29
  3. 《伴随着你-古典吉他六线谱》-天空之城主题曲
  4. 2022最新Android开发全套学习资料(知识笔记+技能图谱)3-5年开发者进阶提升
  5. laravel-debugbar
  6. Unity动画分层和遮罩
  7. 是什么事让尤大如此生气?
  8. Windows平台三大软件开发工具Delphi、WPF .NET Framework和Electron开发对比综述
  9. ERROR: [1] bootstrap checks failed [1]: max virtual memory areas vm.max_map_count [65530] is too low
  10. 马云和他的阿里巴巴------写在阿里巴巴上市之前