本文主要是介绍【python 走进NLP】simhash 算法计算两篇文章相似度,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
互联网网页存在大量的重复内容网页,无论对于搜索引擎的网页去重和过滤、新闻小说等内容网站的内容反盗版和追踪,还是社交媒体等文本去重和聚类,都需要对网页或者文本进行去重和过滤。最简单的文本相似性计算方法可以利用空间向量模型,计算分词后的文本的特征向量的相似性,这种方法存在效率的严重弊端,无法针对海量的文本进行两两的相似性判断。模仿生物学指纹的特点,对每个文本构造一个指纹,来作为该文本的标识,从形式上来看指纹一般为固定长度较短的字符串,相同指纹的文本可以认为是相同文本。
最简单的指纹构造方式就是计算文本的 md5 或者 sha 哈希值,除非输入相同的文本,否则会发生“雪崩效应”,极小的文本差异通过 md5 或者 sha计算出来的指纹就会不同(发生冲撞的概率极低),那么对于稍加改动的文本,计算出来的指纹也是不一样。因此,一个好的指纹应该具备如下特点:
1、指纹是确定性的,相同的文本的指纹是相同的;
2、 指纹越相似,文本相似性就越高;
3、 指纹生成和匹配效率高。
业界关于文本指纹去重的算法众多,如 k-shingle 算法、google 提出的simhash 算法、Minhash 算法、百度top k 最长句子签名算法等等。
下面介绍下simhash算法以及python应用
SimHash算法
simhash算法的主要思想是降维,将高维的特征向量映射成一个f-bit的指纹(fingerprint),通过比较两篇文章的f-bit指纹的Hamming Distance来确定文章是否重复或者高度近似。
主要分以下几步:
1、抽取文本中的关键词及其权重。
2、对关键词取传统hash,并与权重叠加,算出文本的fingerprint值。
3、计算出两个文本之间fingerprint值的海明距离。
python 前辈们早已实现该算法,我们安装相应的包即可。
pip install simhash
使用例子:
# -*- coding:utf-8 -*-
from simhash import Simhash
import redef filter_html(html):""":param html: html:return: 返回去掉html的纯净文本"""dr = re.compile(r'<[^>]+>',re.S)dd = dr.sub('',html).strip()return dd# 求两篇文章相似度
def simhash_similarity(text1,text2):""":param tex1: 文本1:param text2: 文本2:return: 返回两篇文章的相似度"""aa_simhash = Simhash(text1)bb_simhash = Simhash(text2)max_hashbit=max(len(bin(aa_simhash.value)), (len(bin(bb_simhash.value))))print(max_hashbit)# 汉明距离distince = aa_simhash.distance(bb_simhash)print(distince)similar=1-distince/max_hashbitreturn similarif __name__ == '__main__':text1="simhash算法的主要思想是降维,将高维的特征向量映射成一个低维的特征向量,通过两个向量的Hamming Distance来确定文章是否重复或者高度近似。"text2="simhash算法的主要思想是降维,将高维的特征向量映射成一个低维的特征向量,通过两个向量的Hamming Distance来确定文章是否重复或者高度近似。"similar=simhash_similarity(text1,text2)print(similar)
运行结果:
0b1110001100110011110000001000001110110100111000011010110110100101
0b1110001100110011110000001000001110110100111000011010110110100101
0
1.0Process finished with exit code 0
这篇关于【python 走进NLP】simhash 算法计算两篇文章相似度的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!