simhash 漢明距離計算文字相似度

2021-09-13 00:05:48 字數 2226 閱讀 1071

****由於最近需要做大規模的文字相似度的計算,所以用到了simhash+漢明距離來快速計算文字的相似度。**

**simhash的原理如下圖:其中的weight採用的是jieba的tf-idf的結果。****

**附上python3的源**:**
import math

import jieba

import jieba.analyse

class simhash(object):

def __init__(self):

pass

def getbinstr(self, source):

if source == "":

return 0

else:

x = ord(source[0]) << 7

m = 1000003

mask = 2 ** 128 - 1

for c in source:

x = ((x * m) ^ ord(c)) & mask

x ^= len(source)

if x == -1:

x = -2

x = bin(x).replace('0b', '').zfill(64)[-64:]

return str(x)

def getweight(self, source):

# fake weight with keyword

return ord(source)

def unwrap_weight(self, arr):

ret = ""

for item in arr:

tmp = 0

if int(item) > 0:

tmp = 1

ret += str(tmp)

return ret

def simhash(self, rawstr):

seg = jieba.cut(rawstr)

keywords = jieba.analyse.extract_tags("|".join(seg), topk=100, withweight=true)

ret =

for keyword, weight in keywords:

binstr = self.getbinstr(keyword)

keylist =

for c in binstr:

weight = math.ceil(weight)

if c == "1":

else:

# 對列表進行"降維"

rows = len(ret)

cols = len(ret[0])

result =

for i in range(cols):

tmp = 0

for j in range(rows):

tmp += int(ret[j][i])

if tmp > 0:

tmp = "1"

elif tmp <= 0:

tmp = "0"

return "".join(result)

def getdistince(self, hashstr1, hashstr2):

length = 0

for index, char in enumerate(hashstr1):

if char == hashstr2[index]:

continue

else:

length += 1

return length

ifname== "__main__":

simhash = simhash()

hash1 = simhash.simhash(s1)

hash2 = simhash.simhash(s2)

distince = simhash.getdistince(hash1, hash2)

value = 5

print("海明距離:", distince, "判定距離:", value, "是否相似:", distince<=value)

SimHash演算法原理(漢明距離)

解釋一下 這裡feature可以指一篇文件分詞後的某個詞,即將文件中的某個詞作為乙個特徵。weight是這個詞的權重,這裡可以是這個詞在這個句子中出現的次數。這裡的hash演算法就是傳統的hash演算法,通過呼叫乙個hash函式實現的。simhash是為了計算一篇文件之間的相似度存在的,通過simh...

漢明距離理解與計算

漢明距離 是求兩個等長字串之間對應位置的不同字元的個數。也就是求將乙個字串變換成另乙個字串所需要替換字元的個數。1.有如下兩個字串 abcde abbdc 則這兩個字串的漢明距離為2,因為兩個字串的第三個和第五個位置的字元不同 2.12345 54321 同理這兩個字串的漢明距離為4,除了第三個字元...

Hamming Distance 漢明距離

在資訊理論中,hamming distance 表示兩個等長字串在對應位置上不同字元的數目,我們以d x,y 表示字串x和y之間的漢明距離。從另外乙個方面看,漢明距離度量了通過替換字元的方式將字串x變成y所需要的最小的替換次數。舉例說明以下字串間的漢明距離為 karolin and kathrin ...