python实现Simhash算法
作者:AlanDreamer 时间:2022-06-29 06:21:05
1、simhash步骤
simhash包含分词、hash、加权、合并、降维五大步骤
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提取关键词
? ? ? ? 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为:今天星期五
得出分词结果为【今天,星期四】【今天,星期五】
1.2hash
hash是将分词结果取hash值
星期四hash为:0010001100100000101001101010000000101111011010010001100011011110
今天hash为:0010001111010100010011110001110010100011110111111011001011110101
星期五hash为:0010001100100000101001101010000000101111011010010000000010010001
1.3加权
1.4合并
1.5降维
降维是将合并的结果进行降维,如果值大于0,则置为1小于0 则置为0,因此得到的结果为:
2、simhash比对
一般simhash采用海明距离来进行计算相似度,海明距离计算如下:
对于A,B两个n维二进制数
二者的海明距离为:
其中:
举例:
1000与1111的海明距离为3
来源:https://blog.csdn.net/qq_39187538/article/details/122853908
标签:python,Simhash,算法
0
投稿
猜你喜欢
python事件驱动event实现详解
2021-07-27 21:17:04
MySQL limit使用方法以及超大分页问题解决
2024-01-24 21:46:56
vue 踩不完的异步之坑及解决
2024-04-28 09:30:05
利用JavaScript正则表达式模拟Google Talk的文本处理
2007-12-04 18:43:00
aspjpeg 添加水印教程及生成缩略图教程
2011-04-04 11:04:00
Python图片处理之图片裁剪教程
2022-02-02 06:32:40
python对绑定事件的鼠标、按键的判断实例
2021-05-20 03:12:58
pytorch构建多模型实例
2021-05-14 13:30:00
Python爬虫程序中使用生产者与消费者模式时进程过早退出的问题
2022-10-12 03:37:52
python中Mako库实例用法
2022-01-05 16:38:21
python requests库爬取豆瓣电视剧数据并保存到本地详解
2022-05-29 08:35:05
微信小程序实现扫雷游戏
2024-05-11 09:06:59
Python爬虫之正则表达式基本用法实例分析
2022-12-20 17:02:16
python语言基本语句用法总结
2023-07-03 01:26:34
Thinkphp5.0 框架使用模型Model添加、更新、删除数据操作详解
2024-06-07 15:35:37
python opencv 找出图像中的最大轮廓并填充(生成mask)
2021-01-14 23:42:10
Python Matplotlib条形图之垂直条形图和水平条形图详解
2022-07-24 04:07:45
D3.js 实现带伸缩时间轴拓扑图的示例代码
2024-05-09 10:20:13
Python爬虫爬取博客实现可视化过程解析
2023-12-16 08:58:33
python监控linux内存并写入mongodb(推荐)
2022-02-04 11:28:01