日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達者為師

網(wǎng)站首頁 編程語言 正文

python實現(xiàn)Simhash算法_python

作者:AlanDreamer ? 更新時間: 2022-04-20 編程語言

1、simhash步驟

simhash包含分詞、hash、加權(quán)、合并、降維五大步驟

simhash代碼如下:

import jieba
import jieba.analyse
import numpy as np

class SimHash(object):
? ? def simHash(self, content):
? ? ? ? seg = jieba.cut(content)
? ? ? ? # jieba.analyse.set_stop_words('stopword.txt')
? ? ? ? # jieba基于TF-IDF提取關(guān)鍵詞
? ? ? ? keyWords = jieba.analyse.extract_tags("|".join(seg), topK=10, withWeight=True)

? ? ? ? keyList = []
? ? ? ? for feature, weight in keyWords:
? ? ? ? ? ? # print('feature:' + feature)
? ? ? ? ? ? print('weight: {}'.format(weight))
? ? ? ? ? ? # weight = math.ceil(weight)
? ? ? ? ? ? weight = int(weight)
? ? ? ? ? ? binstr = self.string_hash(feature)
? ? ? ? ? ? print('feature: %s , string_hash %s' % (feature, binstr))
? ? ? ? ? ? temp = []
? ? ? ? ? ? for c in binstr:
? ? ? ? ? ? ? ? if (c == '1'):
? ? ? ? ? ? ? ? ? ? temp.append(weight)
? ? ? ? ? ? ? ? else:
? ? ? ? ? ? ? ? ? ? temp.append(-weight)
? ? ? ? ? ? keyList.append(temp)
? ? ? ? listSum = np.sum(np.array(keyList), axis=0)
? ? ? ? if (keyList == []):
? ? ? ? ? ? return '00'
? ? ? ? simhash = ''
? ? ? ? for i in listSum:
? ? ? ? ? ? if (i > 0):
? ? ? ? ? ? ? ? simhash = simhash + '1'
? ? ? ? ? ? else:
? ? ? ? ? ? ? ? simhash = simhash + '0'
? ? ? ? return simhash

? ? def string_hash(self, source):
? ? ? ? if source == "":
? ? ? ? ? ? return 0
? ? ? ? else:
? ? ? ? ? ? temp = source[0]
? ? ? ? ? ? temp1 = ord(temp)
? ? ? ? ? ? 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 getDistance(self, hashstr1, hashstr2):
? ? ? ? '''
? ? ? ? ? ? 計算兩個simhash的漢明距離
? ? ? ? '''
? ? ? ? length = 0
? ? ? ? for index, char in enumerate(hashstr1):
? ? ? ? ? ? if char == hashstr2[index]:
? ? ? ? ? ? ? ? continue
? ? ? ? ? ? else:
? ? ? ? ? ? ? ? length += 1

? ? ? ? return length

1.1分詞

分詞是將文本文檔進行分割成不同的詞組,比如詞1為:今天星期四,詞2為:今天星期五

得出分詞結(jié)果為【今天,星期四】【今天,星期五】

1.2hash

hash是將分詞結(jié)果取hash值
星期四hash為:0010001100100000101001101010000000101111011010010001100011011110
今天hash為:0010001111010100010011110001110010100011110111111011001011110101
星期五hash為:0010001100100000101001101010000000101111011010010000000010010001

1.3加權(quán)

1.4合并

1.5降維

降維是將合并的結(jié)果進行降維,如果值大于0,則置為1小于0 則置為0,因此得到的結(jié)果為:

2、simhash比對

一般simhash采用海明距離來進行計算相似度,海明距離計算如下:

對于A,B兩個n維二進制數(shù)

二者的海明距離為:

其中:

舉例:

1000與1111的海明距離為3

原文鏈接:https://blog.csdn.net/qq_39187538/article/details/122853908

欄目分類
最近更新