利用simhash来进行文本去重复
原文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 by token's weight if the ith bit of
the hash h is 0, otherwiseo ith element is increased by token's weight if the ith bit of
the hash h is 1* Finally, signs of elements of V corresponds to the bits of the
final fingerprint
该hash不是将文档总体计算hash值,而是将文档中的每个token计算哈希值,对文档中每个token的hash值,按照位 对hash值进行求和,如果当前token的hash值在该位上是0,则减去1,如果在该位上是1,则加上1.将所有的token按照这种方式累加,求的最终的值作为fingerprint。
python对应的代码如下:
#!/usr/bin/python# Implementation of Charikar simhashes in Python # See: http://dsrg.mff.cuni.cz/~holub/sw/shash/#a1class simhash():def __init__(self, tokens='', hashbits=128):self.hashbits = hashbitsself.hash = self.simhash(tokens)def __str__(self):return str(self.hash)def __long__(self):return long(self.hash)def __float__(self):return float(self.hash)def simhash(self, tokens):# Returns a Charikar simhash with appropriate bitlengthv = [0]*self.hashbitsfor t in [self._string_hash(x) for x in tokens]:bitmask = 0print (t)for i in range(self.hashbits):bitmask = 1 << iprint(t,bitmask, t & bitmask)if t & bitmask:v[i] += 1 #查看当前bit位是否为1,是的话则将该位+1 else:v[i] –= 1 #否则得话,该位减1fingerprint = 0for i in range(self.hashbits):if v[i] >= 0:fingerprint += 1 << i
#整个文档的fingerprint为最终各个位大于等于0的位的和return fingerprintdef _string_hash(self, v):# A variable-length version of Python's builtin hashif v == "":return 0else:x = ord(v[0])<<7m = 1000003mask = 2**self.hashbits-1for c in v:x = ((x*m)^ord(c)) & maskx ^= len(v)if x == -1: x = -2return xdef hamming_distance(self, other_hash):x = (self.hash ^ other_hash.hash) & ((1 << self.hashbits) - 1)tot = 0while x:tot += 1x &= x-1return totdef similarity(self, other_hash):a = float(self.hash)b = float(other_hash)if a>b: return b/areturn a/bif __name__ == '__main__':s = 'This is a test string for testing'hash1 =simhash(s.split())#print("0x%x" % hash1)#print ("%s/t0x%x" % (s, hash1))s = 'This is a test string for testing also!'hash2 = simhash(s.split())#print ("%s/t[simhash = 0x%x]" % (s, hash2))print (hash1.similarity(hash2), "percent similar")print (hash1.hamming_distance(hash2), "bits differ out of", hash1.hashbits)
上述代码运行的结果如下:
0.97584098811 percent similar
14 bits differ out of 128
利用simhash来进行文本去重复相关推荐
- python文本去重复_python多个文本组合后去除重复项
有三个txt文件:a.txt.b.txt.c.txta.txt有4行数据以"\n"分隔行,即:北京天津南京上海b.txt有2行数据以"\n"分隔行,即:北京西安 ...
- txt文本去重复 亲测50G文本高效去重复
链接: https://pan.baidu.com/s/15fzfFHCbNHF_Dc_V4Hb_xQ&shfl=shareset 提取码: r81d 下载地址
- java 两个数组去重复数据_Java实现数组去除重复数据的方法详解
本文实例讲述了Java实现数组去除重复数据的方法.分享给大家供大家参考,具体如下: 前一段时间被面试问到:如果一个数组中有重复元素,用什么方法可以去重?一时间会想到用一种方法,但是后来查阅资料后发现, ...
- python去重复排序_Python实现删除排序数组中重复项的两种方法示例
本文实例讲述了Python实现删除排序数组中重复项的两种方法.分享给大家供大家参考,具体如下: 对于给定的有序数组nums,移除数组中存在的重复数字,确保每个数字只出现一次并返回新数组的长度 注意:不 ...
- Java利用Set集合去重复
需求: 创建一个存储学生对象的集合,存储多个学生对象,使用程序实现在控制台遍历该集合,要求:学生对象的成员变量值相同,我们就认为是同一个对象. 分析: ①定义学生类,创建HashSet集合对象, 创建 ...
- linux排列去重复的命令,实例详细说明linux下去除重复行命令uniq
一,uniq干什么用的 文本中的重复行,基本上不是我们所要的,所以就要去除掉.linux下有其他命令可以去除重复行,但是我觉得uniq还是比较方便的一个.使用uniq的时候要注意以下二点 1,对文本操 ...
- List去重复——多个复杂字段判断去重
List去重复 ,我们首先想到的可能是 利用List转Set 集合,因为Set集合不允许重复. 所以达到这个目的. 如果集合里面是简单对象,例如Integer.String等等,这种可以使用这样的方式 ...
- python去重复记录_Python列表去重复项的N种方法(实例代码)
说明 Python语言中列表(List)与其他语言的数组(Array)类似,是一种有序的集合数据结构,Python List可支持各种数据类型,长度也可动态调整,与JS中的数组或Java ArrayL ...
- linux去重复程序,Linux下大文件的排序和去重复
命令介绍: sort :将文本文件内容加以排序. sort -u [file] = sort [file] | uniq (去重) 参数说明 -b 忽略每行前面开始出的空格字符 -c 检查文件是 ...
最新文章
- epoll示例(边沿触发)
- 机器学习入门到进阶学习路线图
- 数据处理奇技巧——python数据处理小技能
- arrays中copyof复制两个数组_C语言100题集合026-使用指针交换两个数组中的最大值
- javaweb解决编码问题_学习编码? 首先,学会解决问题。
- JavaScript 移动和触摸框架
- 应该用怎样的态度对待孩子?
- 咸鸭蛋吃了对身体有什么好处?
- Open3d之点云顶点法线估计
- mysql学习笔记 51_MySQL学习笔记(一)
- hibernate5.0映射配置文件核心配置文件数据更新丢失
- ifonts下载ttf字体文件
- matlab环境下图像分形维数的计算,MATLAB环境下图像分形维数的计算.pdf
- uni-app H5+ 连接蓝牙打印机打印文字及二维码
- 微信支付V3版本的 签名生成,验签,解密,统一下单的简单封装
- 小米工程师爱心捐建的新阳光病房学校落地江西
- 罗技无线鼠标响应缓慢
- [Mysql] 多表连接查询
- 审稿审什么你真的弄清楚了吗
- Commvault斥资2.25亿美元收购Hedvig进行二次创业