欢迎来到代码驿站!

Python代码

当前位置:首页 > 软件编程 > Python代码

python实现Simhash算法

时间:2022-11-24 09:11:28|栏目:Python代码|点击:

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

上一篇:用Python爬取英雄联盟的皮肤详细示例

栏    目:Python代码

下一篇:使用pyinstaller打包.exe文件的详细教程

本文标题:python实现Simhash算法

本文地址:http://www.codeinn.net/misctech/219771.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有