1. python中simhash包怎么用
#!/usr/bin/python
#coding=utf-8
classsimhash:
#构造函数
def__init__(self,tokens='',hashbits=128):
self.hashbits=hashbits
self.hash=self.simhash(tokens);
#toString函数
def__str__(self):
returnstr(self.hash)
#生成simhash值
defsimhash(self,tokens):
v=[0]*self.hashbits
fortin[self._string_hash(x)forxintokens]:#t为token的普通hash值
foriinrange(self.hashbits):
bitmask=1<<i
ift&bitmask:
v[i]+=1#查看当前bit位是否为1,是的话将该位+1
else:
v[i]-=1#否则的话,该位-1
fingerprint=0
foriinrange(self.hashbits):
ifv[i]>=0:
fingerprint+=1<<i
returnfingerprint#整个文档的fingerprint为最终各个位>=0的和
#求海明距离
defhamming_distance(self,other):
x=(self.hash^other.hash)&((1<<self.hashbits)-1)
tot=0;
whilex:
tot+=1
x&=x-1
returntot
#求相似度
defsimilarity(self,other):
a=float(self.hash)
b=float(other.hash)
ifa>b:returnb/a
else:returna/b
#针对source生成hash值(一个可变长度版本的Python的内置散列)
def_string_hash(self,source):
ifsource=="":
return0
else:
x=ord(source[0])<<7
m=1000003
mask=2**self.hashbits-1
forcinsource:
x=((x*m)^ord(c))&mask
x^=len(source)
ifx==-1:
x=-2
returnx
if__name__=='__main__':
s='Thisisateststringfortesting'
hash1=simhash(s.split())
s=''
hash2=simhash(s.split())
s='nainaigexiongcao'
hash3=simhash(s.split())
print(hash1.hamming_distance(hash2),"",hash1.similarity(hash2))
print(hash1.hamming_distance(hash3),"",hash1.similarity(hash3))