短文本相似度计算-simHash从原理到实现
1、simHash简介
simHash
算法是GoogleMoses Charikear于2007年发布的一篇论文《Detecting Near-duplicates for web crawling》
中提出的, 专门用来解决亿万级别的网页去重任务。
simHash
是局部敏感哈希(locality sensitve hash)
的一种,其主要思想是降维,将高维的特征向量映射成低维的特征向量,再通过比较两个特征向量的 汉明距离(Hamming Distance) 来确定文章之间的相似性。
什么是局部敏感呢?假设A,B具有一定的相似性,在hash之后,仍能保持这种相似性,就称之为局部敏感hash
汉明距离:
Hamming Distance
,又称汉明距离,在信息论中,等长的两个字符串之间的汉明距离就是两个字符串对应位置的不同字符的个数。即将一个字符串变换成另外一个字符串所需要替换的字符个数,可使用异或操作。
例如: 1011与1001之间的汉明距离是1。
2、simHash具体流程
simHash算法总共分为5个流程: 分词、has、加权、合并、降维。
- 分词
对待处理文档进行中文分词,得到有效的特征及其权重。可以使用TF-IDF
方法获取一篇文章权重最高的前topK
个词(feature)和权重(weight)。即可使用jieba.analyse.extract_tags()
来实现 - hash
对获取的词(feature),进行普通的哈希操作,计算hash值,这样就得到一个长度为n位的二进制,得到(hash:weight)的集合。 - 加权
在获取的hash值的基础上,根据对应的weight值进行加权,即W=hash*weight。即hash为1则和weight正相乘,为0则和weight负相乘。例如一个词经过hash后得到(010111:5)经过步骤(3)之后可以得到列表[-5,5,-5,5,5,5]。 - 合并
将上述得到的各个向量的加权结果进行求和,变成只有一个序列串。如[-5,5,-5,5,5,5]、[-3,-3,-3,3,-3,3]、[1,-1,-1,1,1,1]进行列向累加得到[-7,1,-9,9,3,9],这样,我们对一个文档得到,一个长度为64的列表。 - 降维
对于得到的n-bit签名的累加结果的每个值进行判断,大于0则置为1, 否则置为0,从而得到该语句的simhash值。例如,[-7,1,-9,9,3,9]得到 010111,这样,我们就得到一个文档的 simhash值。
最后根据不同语句的simhash值的汉明距离来判断相似度。
<mark style="box-sizing: border-box; outline: 0px; background-color: rgb(248, 248, 64); color: rgb(0, 0, 0); overflow-wrap: break-word;">根据经验值,对64位的 SimHash值,海明距离在3以内的可认为相似度比较高。</mark>
3、Python实现simHash
使用Python实现simHash算法,具体如下:
# -*- coding:utf-8 -*-
import jieba
import jieba.analyse
import numpy as npclass 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('weight: {}'.format(weight))# weight = math.ceil(weight)weight = int(weight)binstr = self.string_hash(feature)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 simhashdef string_hash(self, source):if source == "":return 0else:x = ord(source[0]) << 7m = 1000003mask = 2**128 - 1for c in source:x = ((x*m)^ord(c)) & maskx ^= len(source)if x == -1:x = -2x = bin(x).replace('0b', '').zfill(64)[-64:]# print('strint_hash: %s, %s'%(source, x))return str(x)def getDistance(self, hashstr1, hashstr2):'''计算两个simhash的汉明距离'''length = 0for index, char in enumerate(hashstr1):if char == hashstr2[index]:continueelse:length += 1return lengthif __name__ == '__main__':simhash = SimHash()s1 = simhash.simHash('我想洗照片')s2 = simhash.simHash('可以洗一张照片吗')dis = simhash.getDistance(s1, s2)print('dis: {}'.format(dis))
simHash适用于对于短小的文本的相似度计算,较长的文本更适合计算词向量的相似度。
http://www.taodudu.cc/news/show-2430568.html
相关文章:
- 如何快速实现高并发短文检索
- Python学习资源大集合
- mysql命令(集合)
- 海量数据相似度计算之simhash短文本查找
- awesome-python(python集合框架)
- python短文本数据集的关联性_短文本分析----基于python的TF-IDF特征词标签自动化提取...
- 【自然语言处理】【聚类】ECIC:通过迭代分类增强短文本聚类
- 短文本分类---小白从0到0.3的辛酸历程(上)
- 文本相似度算法对比分析,短文本相似度主流算法
- 计算机英语阅读路线,计算机经典英语短文阅读
- mysql基础命令集合
- 短文本分类小结
- 短文本语义比对调研
- 自动生成短文
- 图书集合
- 刷题学习—数据结构(字符串、栈和队列、链表、数组与矩阵、哈希表、位运算)
- 短文本相似度算法
- java中怎么复制集合_Java中List集合间的复制
- JS短文 | 3分钟了解下 JS Sets 集合
- 2017年精选文章集合
- mysql 短文本相似度_短文本相似度比较
- 短文本匹配
- 2018文章集合
- 关于Latex出现Package CJK Error
- CJK安装
- python解决中文显示问题Glyph 24179 (\N{CJK UNIFIED IDEOGRAPH-5E73}) missing from current font. func(*args)
- UserWarning: Glyph 28857 (\N{CJK UNIFIED IDEOGRAPH-70B9}) missing from current font. FigureCanvasA
- Paragraph ended before \CJK@XX was complete
- matplotlib报错:Glyph 25151 (\N{CJK UNIFIED IDEOGRAPH-623F}) missing from current font. func(*args)
- LateX beamer 下的报错unknown CJK family \CJKsfdefault is being ignored
短文本相似度计算-simHash从原理到实现相关推荐
- [Python人工智能] 九.gensim词向量Word2Vec安装及《庆余年》中文短文本相似度计算
从本专栏开始,作者正式开始研究Python深度学习.神经网络及人工智能相关知识.前一篇详细讲解了卷积神经网络CNN原理,并通过TensorFlow编写CNN实现了MNIST分类学习案例.本篇文章将分享 ...
- gensim词向量Word2Vec安装及《庆余年》中文短文本相似度计算 | CSDN博文精选
作者 | Eastmount 来源 | CSDN博文精选 (*点击阅读原文,查看作者更多精彩文章) 本篇文章将分享gensim词向量Word2Vec安装.基础用法,并实现<庆余年>中文短文 ...
- 文本相似度计算——Simhash算法(python实现)
互联网网页存在着大量重复内容,必须有一套高效的去重算法,否则爬虫将做非常多的无用功,工作时效性无法得到保证,更重要的是用户体验也不好.业界关于文本指纹去重的算法众多,如 k-shingle 算法.go ...
- 协同过滤算法之通过Jaccard相似度计算推荐结果原理及代码实现
文章目录 Jaccard相似度介绍 Jaccard相似度计算推荐结果代码及实现 基本介绍 Jaccard相似度计算代码 协同过滤推荐代码实现 Jaccard相似度介绍 两个集合的交集元素个数在并集中所 ...
- LSF-SCNN:一种基于 CNN 的短文本表达模型及相似度计算的全新优化模型
欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 本篇文章是我在读期间,对自然语言处理中的文本相似度问题研究取得的一点小成果.如果你对自然语言处理 (natural language proc ...
- LSF-SCNN:一种基于CNN的短文本表达模型及相似度计算的全新优化模型
本篇文章是我在读期间,对自然语言处理中的文本相似度问题研究取得的一点小成果.如果你对自然语言处理 (natural language processing, NLP) 和卷积神经网络(convolut ...
- 短文本相似度在线计算_短文本相似度在线比较_短文本相似度在线查询_自然语言处理_百度AI开放平台
短文本相似度计算服务能够提供不同短文本之间相似度的计算,输出的相似度是一个介于0到1之间的实数值,越大则相似度越高.相似度数值建议在一组数据中进行整体比对选用,输出数值越大,则代表语义相似程度相对越高 ...
- 短文本相似度算法研究
短文本相似度,即求解两个短文本之间的相似程度:它是文本匹配任务或文本蕴含任务的一种特殊形式,返回文本之间相似程度的具体数值.然而在工业界中,短文本相似度计算占有举足轻重的地位. 例如:在问答系统任务( ...
- 向量空间模型(VSM)在文档相似度计算上的简单介绍
向量空间模型(VSM:Vector space model)是最常用的相似度计算模型,在自然语言处理中有着广泛的应用,这里简单介绍一下其在进行文档间相似度计算时的原理. 假设共有十个词:w1,w2 ...
- vsm java_向量空间模型(VSM)在文档相似度计算上的简单介绍
C#实现在: 向量空间模型(VSM:Vector space model)是最常用的相似度计算模型,在自然语言处理中有着广泛的应用,这里简单介绍一下其在进行文档间相似度计算时的原理. 假设共有十个词: ...
最新文章
- Java调用net的webservice问题分享
- JSP学习笔记(四十九):抛弃POI,使用iText生成Word文档
- leetcode 7 Reverse Integer
- Android Flow遇见Retrofit网络请求实践
- mvn 本地jar包 加入自己的maven仓库
- 安卓动画知识总结 Animation AnimationSet LayoutAnimation
- java读取资源文件(Properties)
- 投影仪融合+拼接处理系统制作原理
- Qt6.2.2+libCef Demo
- 关于下载的wide形式的数据(横轴为地区,纵轴为年份)批量转换为long形式的代码(stata版)
- android银河城游戏,Endless Memories安卓版
- Python--发送邮件和钉钉消息
- 在线选毕业照片相册系统开发
- Python Web开发(四):从零开始创建数据库和表
- Altium Designer系列:问题之无法打开pcb文件
- Facade与Adapter模式应用
- Download下载DRM
- 统计学之描述性统计(一)
- 从零开始玩单反 相机参数之光圈/快门篇(转)
- 综合案例:使用Scanner,Random,ArrayList完成一个不重复的点名程序