资讯专栏INFORMATION COLUMN

simhash+汉明距离计算文本相似度

lx1036 / 693人阅读

摘要:由于最近需要做大规模的文本相似度的计算,所以用到了汉明距离来快速计算文本的相似度。的原理如下图其中的采用的是的的结果。附上的源代码对列表进行降维海明距离判定距离是否相似

****由于最近需要做大规模的文本相似度的计算,所以用到了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":
                keylist.append(int(weight))
            else:
                keylist.append(-int(weight))
        ret.append(keylist)
    # 对列表进行"降维"
    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"
        result.append(tmp)
    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

if name == "__main__":

simhash = SimHash()
s1 = u"I am very happy"
s2 = u"I am very happu"

hash1 = simhash.simHash(s1)
hash2 = simhash.simHash(s2)
distince = simhash.getDistince(hash1, hash2)
value = 5
print("海明距离:", distince, "判定距离:", value, "是否相似:", distince<=value)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42802.html

相关文章

  • 如何运用python完成Sim哈希算法

      此篇文章主要是阐述了如何运用python完成Sim哈希算法,文章内容依托于python的相关信息开展Sim哈希算法的详细介绍一下,具有很强的参考意义,感兴趣的朋友可以了解一下  1.为何需用Simhash?  传统式相关性优化算法:语义相似度测算,一般采用线性空间实体模型(VSM),先向文字中文分词,提取特征,依据特点创建文字空间向量,把文字中间相关性测算转化成矩阵的特征值之间的距离测算,如欧...

    89542767 评论0 收藏0
  • 8种相似量方式的原理及实现

    摘要:实现参考链接计算各类距离关于机器学习距离的理解机器学习中的相似性度量如何通俗易懂地理解皮尔逊相关系数数学应用 8种相似度度量方式的原理及实现 欧氏距离(Euclidean Distance) 欧氏距离(也称欧几里得度量)指在m维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离) showImg(https://raw.githubusercontent.com/ele...

    lewif 评论0 收藏0
  • 利用python进行识别相似图片(一)

    摘要:图像指纹与汉明距离在介绍下面其他判别相似度的方法前,先补充一些概念。汉明距离为,即代表两张图片完全一样。下一次将讲述利用和以训练好的模型来进行人脸识别。本文参考文章和图片来源的文章赖勇浩的文章下一篇地址利用进行识别相似图片二 文章简介 在网上看到python做图像识别的相关文章后,真心感觉python的功能实在太强大,因此将这些文章总结一下,建立一下自己的知识体系。当然了,图像识别这个...

    HitenDev 评论0 收藏0
  • 详解相似图片匹配算法:差异值哈希算法 + 颜色直方图

    摘要:由于最近涉及到匹配相似图片的问题,所以在此记录下解决办法差异值哈希算法颜色直方图环境要求库库差异值哈希算法检索相似图片,第一个想到的就是差异值哈希算法。 由于最近涉及到匹配相似图片的问题,所以在此记录下解决办法:差异值哈希算法 + 颜色直方图 环境要求:Python cv2库 math库 差异值哈希算法 检索相似图片,第一个想到的就是差异值哈希算法。这个算法的步骤是: 缩小尺寸 一般...

    eternalshallow 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<