ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

由浅入深弄懂simhash来比较文本的相似度

2020-02-19 20:51:44  阅读:288  来源: 互联网

标签:由浅入深 hash weight int 弄懂 list simhash 文本 向量


背景

  彻底搞懂simhash原理,及如何进行文本相似度的比较。

simhash原理

  概括的说即是:将文本向量化后,进行向量间的距离计算,卡某个阈值来判定两个文本是否相似。

  涉及关键点

  1. 文本向量化操作
    1. 切词,并赋权重值
    2. bin(hash(切词)).zfill(64); 转成定长01向量
    3. 向量乘权重;遇到1的乘正权重,遇到0乘负权重
    4. 全部向量对应维度上进行加和
    5. 降维:大于0的变成1,小于0的变成0,产出文本的向量
  2. 海明距离计算
    1. 异或时,只有在两个比较的位不同时其结果是1 ,否则结果为0
    2. 两个向量“异或”后得到1的个数即为海明距离的大小

举个例子

需要安装的包

  1. jieba分词包:https://pypi.org/project/jieba/
    1. 选择半自动安装:下载最新tar包,本地解压后,python setup.py install
  2. numpy包:pip install numpy

详细代码如下:

# -*- coding: utf-8 -*-

import jieba.analyse
import jieba
import json
import numpy as np

class SimHash(object):

    # 文本使用simhash方法,转成64维向量
    def content_vector(self, contents):
        # 获取关键词及其tf-idf权重值
        # 分词 hash 加权
        keywords = jieba.analyse.extract_tags(contents, withWeight=True)
        ret_list = []
        for word, weight in keywords:
            # hash
            word_hash = bin(hash(word)).replace('0b', '').replace('-', '').zfill(64)
            weight = int(weight)
            tmp_list = []
            for feature in word_hash:
                if feature == '1':
                    # 加权
                    tmp_list.append(weight)
                else:
                    tmp_list.append(-1 * weight)
            ret_list.append(tmp_list)
        
        # 降维
        sum_list = np.sum(np.array(ret_list), axis=0)
        res_str = ''
        for i in sum_list:
            if i > 0:
                res_str += '1'
            else:
                res_str += '0'
        return res_str

    # 计算两个向量的海明距离
    def cal_hamming_distance(self, vector1, vector2):
        vec1_int = int(('0b'+ vector1), 2)
        vec2_int = int(('0b' +vector2), 2)
        # 异或操作
        num = vec1_int ^ vec2_int
        # 获取num中1的个数,即为海明距离
        count = 0
        for i in bin(num).replace('0b', ''):
            if i == '1':
                count += 1
        return count

 

标签:由浅入深,hash,weight,int,弄懂,list,simhash,文本,向量
来源: https://www.cnblogs.com/syw-home/p/12332413.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有