1. 文本指纹介绍
Web大量上的网页集合里存在大量的重复内容网页,无论对于搜索引擎的网页去重和过滤、新闻小说等内容网站的内容反盗版和追踪、还是社交媒体等文本去重和聚类,都需要对网页或者文本进行去重和过滤。
最简单的文本相似性计算方法可以利用空间向量模型,计算分词后的文本的特征向量的相似性,这种方法存在效率的严重弊端,无法针对海量的文本进行两两的相似性判断。模仿生物学指纹的特点,对每个文本构造一个指纹,来作为该文本的标识,从形式上来看指纹一般为固定长度较短的字符串,相同指纹的文本可以认为是相同文本。
最简单的指纹构造方式就是计算文本的md5或者sha哈希值,除非输入相同的文本,否则会发生“雪崩效应”,极小的文本差异通过md5或者sha计算出来的指纹就会不同(发生冲撞的概率极低),那么对于稍加改动的文本,计算出来的指纹也是不一样。
因此,一个好的指纹应该具备如下特点:
1. 指纹是确定性的,相同的文本的指纹是相同的;
2. 指纹越相似,文本相似性就越高;
3. 指纹生成和匹配效率高。
业界关于文本指纹去重的算法众多,如k-shingle算法、google提出的simhash算法、Minhash算法、top k最长句子签名算法等等,本文接下来将简单介绍各个算法以及指纹系统的基本架构和思路。
2. 常用的指纹算法
2.1 k-shingle算法
shingle在英文中表示相互覆盖的瓦片。对于一段文本,分词向量为[w1,w2, w3, w4, … wn], 设k=3,那么该文本的shingle向量表示为[(w1,w2,w3),(w2,w3,w4), (w3,w4,w5), …… (wn-2,wn-1,wn)],计算两个文本的shingle向量的相似度(jarccard系数)来判断文本是否重复。由于k-shingle算法的shingle向量空间巨大(特别是k特别大时),相比vsm更加耗费资源,一般业界很少采用这类算法。
2.2 Simhash算法
Simhash是google用来处理海量文本去重的算法,同时也是一种基于LSH(localitysensitive hashing)的算法。简答来说,和md5和sha哈希算法所不同,局部敏感哈希可以将相似的字符串hash得到相似的hash值,使得相似项会比不相似项更可能的hash到一个桶中,hash到同一个桶中的文档间成为候选对。这样就可以以接近线性的时间去解决相似性判断和去重问题。
simhash算法通过计算每个特征(关键词)的哈希值,并最终合并成一个特征值即指纹。
simhash算法流程
1. 首先基于传统的IR方法,将文章转换为