python實(shí)現(xiàn)simhash算法實(shí)例
Simhash的算法簡(jiǎn)單的來(lái)說(shuō)就是,從海量文本中快速搜索和已知simhash相差小于k位的simhash集合,這里每個(gè)文本都可以用一個(gè)simhash值來(lái)代表,一個(gè)simhash有64bit,相似的文本,64bit也相似,論文中k的經(jīng)驗(yàn)值為3。該方法的缺點(diǎn)如優(yōu)點(diǎn)一樣明顯,主要有兩點(diǎn),對(duì)于短文本,k值很敏感;另一個(gè)是由于算法是以空間換時(shí)間,系統(tǒng)內(nèi)存吃不消。
#!/usr/bin/python
# coding=utf-8
class simhash:
#構(gòu)造函數(shù)
def __init__(self, tokens='', hashbits=128):
self.hashbits = hashbits
self.hash = self.simhash(tokens);
#toString函數(shù)
def __str__(self):
return str(self.hash)
#生成simhash值
def simhash(self, tokens):
v = [0] * self.hashbits
for t in [self._string_hash(x) for x in tokens]: #t為token的普通hash值
for i in range(self.hashbits):
bitmask = 1 << i
if t & bitmask :
v[i] += 1 #查看當(dāng)前bit位是否為1,是的話將該位+1
else:
v[i] -= 1 #否則的話,該位-1
fingerprint = 0
for i in range(self.hashbits):
if v[i] >= 0:
fingerprint += 1 << i
return fingerprint #整個(gè)文檔的fingerprint為最終各個(gè)位>=0的和
#求海明距離
def hamming_distance(self, other):
x = (self.hash ^ other.hash) & ((1 << self.hashbits) - 1)
tot = 0;
while x :
tot += 1
x &= x - 1
return tot
#求相似度
def similarity (self, other):
a = float(self.hash)
b = float(other.hash)
if a > b : return b / a
else: return a / b
#針對(duì)source生成hash值 (一個(gè)可變長(zhǎng)度版本的Python的內(nèi)置散列)
def _string_hash(self, source):
if source == "":
return 0
else:
x = ord(source[0]) << 7
m = 1000003
mask = 2 ** self.hashbits - 1
for c in source:
x = ((x * m) ^ ord(c)) & mask
x ^= len(source)
if x == -1:
x = -2
return x
if __name__ == '__main__':
s = 'This is a test string for testing'
hash1 = simhash(s.split())
s = 'This is a test string for testing also'
hash2 = simhash(s.split())
s = 'nai nai ge xiong cao'
hash3 = simhash(s.split())
print(hash1.hamming_distance(hash2) , " " , hash1.similarity(hash2))
print(hash1.hamming_distance(hash3) , " " , hash1.similarity(hash3))
相關(guān)文章
python實(shí)現(xiàn)從wind導(dǎo)入數(shù)據(jù)
今天小編就為大家分享一篇python實(shí)現(xiàn)從wind導(dǎo)入數(shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12從多個(gè)tfrecord文件中無(wú)限讀取文件的例子
今天小編就為大家分享一篇從多個(gè)tfrecord文件中無(wú)限讀取文件的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02使用python圖形模塊turtle庫(kù)繪制櫻花、玫瑰、圣誕樹(shù)代碼實(shí)例
這篇文章主要介紹了用python繪制櫻花、玫瑰、圣誕樹(shù)代碼實(shí)例,需要的朋友可以參考下2020-03-03PYTHON壓平嵌套列表的簡(jiǎn)單實(shí)現(xiàn)
下面小編就為大家?guī)?lái)一篇PYTHON壓平嵌套列表的簡(jiǎn)單實(shí)現(xiàn)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-06-06Python裝飾器如何實(shí)現(xiàn)修復(fù)過(guò)程解析
這篇文章主要介紹了Python裝飾器如何實(shí)現(xiàn)修復(fù)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09Python析構(gòu)函數(shù)__del__定義原理解析
這篇文章主要介紹了Python析構(gòu)函數(shù)__del__定義原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11Numpy數(shù)組的廣播機(jī)制的實(shí)現(xiàn)
這篇文章主要介紹了Numpy數(shù)組的廣播機(jī)制的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11