最简单的文本相似性计算方法可以利用空间向量模型,计算分词后的文本的特征向量的相似性,这种方法存在效率的严重弊端,无法针对海量的文本进行两两的相似性判断。模仿生物学指纹的特点,对每个文本构造一个指纹,来作为该文本的标识,从形式上来看指纹一般为固定长度较短的字符串。
最简单的指纹构造方式就是计算文本的md5或者sha哈希值,但易发生“雪崩效应”,极小的文本差异通过md5或者sha计算出来的指纹就会不同(冲撞的概率极低)。
因此,一个好的指纹应该具备如下特点:
指纹是确定性的,相同的文本的指纹是相同的;
指纹越相似,文本相似性就越高;
指纹生成和匹配效率高。
常用的指纹算法
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 Simhash算法
Simhash是google用来处理海量文本去重的算法,同时也是一种基于LSH(locality sensitive hashing)的算法。简单来说,和md5和sha哈希算法所不同,局部敏感哈希可以将相似的字符串hash得到相似的hash值,