互联网网页存在大量的重复内容网页,无论对于搜索引擎的网页去重和过滤、新闻小说等内容网站的内容反盗版和追踪,还是社交媒体等文本去重和聚类,都需要对网页或者文本进行去重和过滤。最简单的文本相似性计算方法可以利用空间向量模型,计算分词后的文本的特征向量的相似性,这种方法存在效率的严重弊端,无法针对海量的文本进行两两的相似性判断。模仿生物学指纹的特点,对每个文本构造一个指纹,来作为该文本的标识,从形式上来看指纹一般为固定长度较短的字符串,相同指纹的文本可以认为是相同文本。
最简单的指纹构造方式就是计算文本的 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 re
def 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_hashbit
return similar
if __name__ == '__main__':
text1="simhash算法的主要思想是降维,将高维的特征向量映射成一个低维的特征向量,通过两个向量的Hamming Distance来确定文章是否重复或者高度近似。"
text2="simhash算法的主要思想是降维,将高维的特征向量映射成一个低维的特征向量,通过两个向量的Hamming Distance来确定文章是否重复或者高度近似。"
similar=simhash_similarity(text1,text2)
print(similar)
运行结果:
0b1110001100110011110000001000001110110100111000011010110110100101
0b1110001100110011110000001000001110110100111000011010110110100101
0
1.0
Process finished with exit code 0
来源:CSDN
作者:开心果汁
链接:https://blog.csdn.net/u013421629/article/details/85052915