原文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来进行文本去重复相关推荐

  1. python文本去重复_python多个文本组合后去除重复项

    有三个txt文件:a.txt.b.txt.c.txta.txt有4行数据以"\n"分隔行,即:北京天津南京上海b.txt有2行数据以"\n"分隔行,即:北京西安 ...

  2. txt文本去重复 亲测50G文本高效去重复

    链接: https://pan.baidu.com/s/15fzfFHCbNHF_Dc_V4Hb_xQ&shfl=shareset 提取码: r81d 下载地址

  3. java 两个数组去重复数据_Java实现数组去除重复数据的方法详解

    本文实例讲述了Java实现数组去除重复数据的方法.分享给大家供大家参考,具体如下: 前一段时间被面试问到:如果一个数组中有重复元素,用什么方法可以去重?一时间会想到用一种方法,但是后来查阅资料后发现, ...

  4. python去重复排序_Python实现删除排序数组中重复项的两种方法示例

    本文实例讲述了Python实现删除排序数组中重复项的两种方法.分享给大家供大家参考,具体如下: 对于给定的有序数组nums,移除数组中存在的重复数字,确保每个数字只出现一次并返回新数组的长度 注意:不 ...

  5. Java利用Set集合去重复

    需求: 创建一个存储学生对象的集合,存储多个学生对象,使用程序实现在控制台遍历该集合,要求:学生对象的成员变量值相同,我们就认为是同一个对象. 分析: ①定义学生类,创建HashSet集合对象, 创建 ...

  6. linux排列去重复的命令,实例详细说明linux下去除重复行命令uniq

    一,uniq干什么用的 文本中的重复行,基本上不是我们所要的,所以就要去除掉.linux下有其他命令可以去除重复行,但是我觉得uniq还是比较方便的一个.使用uniq的时候要注意以下二点 1,对文本操 ...

  7. List去重复——多个复杂字段判断去重

    List去重复 ,我们首先想到的可能是 利用List转Set 集合,因为Set集合不允许重复. 所以达到这个目的. 如果集合里面是简单对象,例如Integer.String等等,这种可以使用这样的方式 ...

  8. python去重复记录_Python列表去重复项的N种方法(实例代码)

    说明 Python语言中列表(List)与其他语言的数组(Array)类似,是一种有序的集合数据结构,Python List可支持各种数据类型,长度也可动态调整,与JS中的数组或Java ArrayL ...

  9. linux去重复程序,Linux下大文件的排序和去重复

    命令介绍: sort  :将文本文件内容加以排序. sort -u [file]  =  sort [file] | uniq (去重) 参数说明 -b 忽略每行前面开始出的空格字符 -c 检查文件是 ...

最新文章

  1. epoll示例(边沿触发)
  2. 机器学习入门到进阶学习路线图
  3. 数据处理奇技巧——python数据处理小技能
  4. arrays中copyof复制两个数组_C语言100题集合026-使用指针交换两个数组中的最大值
  5. javaweb解决编码问题_学习编码? 首先,学会解决问题。
  6. JavaScript 移动和触摸框架
  7. 应该用怎样的态度对待孩子?
  8. 咸鸭蛋吃了对身体有什么好处?
  9. Open3d之点云顶点法线估计
  10. mysql学习笔记 51_MySQL学习笔记(一)
  11. hibernate5.0映射配置文件核心配置文件数据更新丢失
  12. ifonts下载ttf字体文件
  13. matlab环境下图像分形维数的计算,MATLAB环境下图像分形维数的计算.pdf
  14. uni-app H5+ 连接蓝牙打印机打印文字及二维码
  15. 微信支付V3版本的 签名生成,验签,解密,统一下单的简单封装
  16. 小米工程师爱心捐建的新阳光病房学校落地江西
  17. 罗技无线鼠标响应缓慢
  18. [Mysql] 多表连接查询
  19. 审稿审什么你真的弄清楚了吗
  20. Commvault斥资2.25亿美元收购Hedvig进行二次创业

热门文章

  1. Python鼠标模拟
  2. 图片下载_二维码生成
  3. 树莓派 电脑 文件共享 搬移
  4. SSRNet:用于大规模点云表面重建的深度学习网络(CVPR2020)
  5. COSELF 次元秀场伦敦时装周预告 #虚拟时尚
  6. ChatGPT助力之论文速成秘籍
  7. 10.Python面向对象编程
  8. mysql的information_schema数据库
  9. 网络计算机要不要用电脑,电脑连不上网怎么办 电脑连不上网解决方法
  10. 基于Python实现的在线教育系统考试作业案例源代码APP大作业nodejs程序设计微信小程序计算机