原文作者:剪水作花飞
原文地址:https://zhuanlan.zhihu.com/p/43640234

日前接到一个对名言警句这种短文本进行去重的小任务,下图是几个重复文本的示例:

很直观的结论就是重复度越高的文本,具有更多重复的词汇。一个最直接的去重思路可以描述为:将文本进行分词处理,统计各文本词汇的重合度。KShingle算法就是基于这样朴素的思想。

一、KShingle算法
对于一篇文档而言,K-shingle定义为文档中连续的K个词汇组成的词组,即:

对于一个包含 N 个词汇的文档D=[w_{1},w_{2},…,w_{N}],

指定词组长度 K ,

有 K-shingling={n\in(1,2,…,N-K+1) | (w_{n},w_{n+1},…,w_{n+K-1})} 。

(一)算法步骤
K-shingle算法通过将文档表示为K-shingle的集合,比较各文档K-shingle集合之间的相似性,来衡量文档的相似度。算法主要步骤如下:

  1. 预处理:读取文档数据集,根据需求,对文档中的标点、空白、中英文、简繁体等字符进行清洗和整理。

  2. 提取K-shingle:对清洗后的文档进行分词处理,指定shingle长度 K ,对每篇文档提取对应的K-shingle集合。

  3. 统计特征向量:所有文档的K-shingle互异值构成一个大小为 M 的词组库。用one-hot的方式对每篇文档进行编码,得到一个长度为 M 的特征向量,当词组库中的第 m 个K-shingle在文档中出现时,该文档特征向量的第 m 个元素为1,否则为0。

  4. 计算Jaccard相似度:对于集合 A 和集合 B ,Jaccard相似度定义为交集元素占并集元素的比例大小,即 \frac{\left| A \cap B \right|}{\left| A \cup B \right|} ,显然比例越大,集合越相似。对两篇文档的特征向量而言,分子指同位元素都为1的元素个数,分母指同位元素至少一个为1的元素个数。

  5. 文本去重:基于文档相似度的结果,根据预定规则,舍弃重复文本。

(二)算法分析
关于K-shingle算法的几点分析如下:

1.超参数

算法需要指定的唯一超参数是shingle中包含的连续词汇的个数 K 。该参数主要有两方面的影响:

(1) Shingle对文档语义特征的捕捉能力。

K 越小,K-shingle对文档语义的捕捉能力越差。以英文为例,如果 K=1 ,那么任何一篇文章的K-shingle都是由一个个英文单词构成的集合,因此即便内容完全不相关的文档,它们的Jaccard相似度也可能很高。随着 K 增大,不同词汇的组合能反应出越来越多的语义层面的特征。文本长度越长, K 的取值越大。根据经验,短文本相似度通常取 K=5 ,长文本相似度通常取 K=10 。

(2) Shingle对存储空间和计算效率的影响。

假设任一词汇 w_{n} 的存储空间为 B ,则文档 D 的存储空间为 N*B ,K-shingle的存储空间为 (N-K+1)KB ,当 K \ll N 时,文档D对应K-shingle的存储空间扩大至 K 倍。

此外,随着 K 增大,文档特征向量的维数也急剧增加。当 K=1 时,特征向量的维数即为文档集中互异词汇的个数;当 K为文档集中最大的文本长度,即K=max(len(D)) 时,由于重复的文本为少数,此时特征向量的维数接近于文档集中的文档个数。在海量文本,如互联网网页数据中,文档个数远远大于词汇个数。

进一步地,由于特征向量维数的增加,大大降低了特征向量之间距离的计算效率。

2.特征向量处理

文档特征向量是取值为范围为 \left{ 0,1 \right} 的向量。如果用int存储,每一个元素占4个字节共32个bit;如果用二进制存储,每个元素只占1个bit。特征向量的交集和并集,对二进制向量来说,可以通过效率更高的位运算实现。因此用二进制来表示文档的特征向量,从时间和空间上都有更好的性能。

但不论以int还是bit来存储,得到的特征向量都是稀疏且高维的。如果能对特征向量进行降维,再计算相似度,可以提高计算效率,代表算法有minhash。

3.相似度计算

假设文档集包含 T 个文档,两两比较需要计算 \frac{T*(T-1)}{2} 次,对海量文档集计算两两之间的Jaccard相似度是不现实的。如果能缩小两两比较的计算范围,也能提高计算效率,代表算法有simhash。

注:minhash和simhash都属于局部敏感哈希(Local Sensitive Hash)。一般的哈希算法对于相似文本的哈希结果可能差别非常大,局部敏感哈希在普通哈希的基础上保留了一定程度的相似性,即相似文本的哈希结果距离较小。

二、Minhash算法
对海量文本而言,K-shingle算法得到的特征向量是超高维的,导致该算法非常巨大的时间复杂度和空间复杂度。Minhash算法设计了一种最小哈希函数,将原始超高维的稀疏向量转化为低维的稠密向量,降低了计算的空间复杂度。同时,对转换后的稠密向量进行分段索引,缩小潜在相似文本范围,降低了计算的时间复杂度。

最小哈希函数:对一个列向量按行进行随机排列,重排后第一个非零元素的行号就是最小哈希函数值。直观上来说,如果两个文本完全重复,那么不论如何重排,两个文本对应的最小哈希函数值都应该是一样的。

(一)算法步骤

  1. 提取K-shingle特征向量:执行K-shingle算法的1~3步,将每篇文档表示为01向量。

  2. 计算Minhash特征向量:生成一个随机排列,对文档矩阵进行重排:如果每一列表示一个文档,那么对行进行重排;如果每一行表示一个文档,那么对列进行重排。假设每一列表示一个文档,对行进行重排后,取每一列第一个取值为1的元素对应的行号,作为该列对应文档在此次随机排列后的最小哈希值。重复上述过程 N 次后,即可为每个文档生成一个 N 维的Minhash特征向量。

  3. 建立分段索引,提取潜在相似文本对:将 N 维特征向量进行分段后,建立倒排索引。不难理解,当分段数足够大时,两个相似文本有极大概率在某一段取值一样,极端情况下,每一个元素作为一段,两个重复的文本,必然每一段取值都一样。因此,可以将同一索引值下的文本两两组合,作为潜在相似文本对。

  4. 计算潜在相似文本对的相似性:两个Minhash向量对应位置元素相等的比例,即为这两个文本的相似度similarity = \frac{\sum_{n=1}^{N}{I(x_{n}==y_{n})}}{N} 。当相似度大于指定阈值时,可认为两个文本为重复文本。

(二)算法分析

  1. 两个集合最小哈希值相等的概率等于两个集合的Jaccard相似度,即:P(Minhash(S_{1}) = Minhash(S_{2})) = Jaccard(S_{1},S_{2})

关于这个结论,非严格的论证如下:

X=S_{1} \cap S_{2} ,即集合 S_{1} 和 S_{2} 中同时存在的元素

Y=(S_{1}-S_{2}) \cup (S_{2}-S_{1}) ,即只存在于集合 S_{1} 中或只存在于集合 S_{2} 中的元素

Z=\sim S_{1} \cap \sim S_{2} ,即集合 S_{1} 和 S_{2} 中都不存在的元素

由于 Z 对集合 S_{1} 和 S_{2} 的相似性没有影响,因此可以忽略。由于排列是完全随机的,因此任一行为 X 类元素的概率为 \frac{\left| X \right|}{\left| X \right| + \left| Y \right|} ,即集合 S_{1} 和 S_{2}的Jaccard相似度。

  1. 当分段数足够大时,两个相似文本有极大概率在某一段取值一样。

假设将 N 维的Minhash特征向量分成 B 段,每一段长度为 C ,即 N=B*C ,记 r=P(Minhash(S_{1}) = Minhash(S_{2})) ,则集合 S_{1}的Minhash值 和 S_{2}的Minhash值至少有一段相同的概率为: p=1-\left( 1-r^{C} \right)^{B} 。当 r 和 N 固定时,p 随 B 单调递增。

令 r = 0.4,C=3,B = 100 ,代入公式计算的概率为 p=0.9986585,这表明两个Jaccard相似度为0.4的集合,各自300维的Minhash特征向量分100段后,在至少一段内冲撞的概率达到了99.9%。

  1. 最小哈希方案

方案一是每次重排后,取第一个非零元素下标,重复 N 次,得到 N 维向量

方案二是一次重排后,随机取 N 个非零元素下标,得到 N 维向量

方案二比方案一的计算效率更高。

三、Simhash算法
KShingle算法和Minhash算法都需要生成一个庞大的Shingle词组库,当文本数量和文本长度很大时,计算这个词组库需要耗费巨大的时间和空间资源,且各文档的特征向量计算都依赖这个共同的词组库,因此计算特征向量的过程很难完全地并行化。Simhash算法仅基于文档中包含的词汇生成文档的特征向量,极大提高了计算效率。

(一)算法步骤

  1. 预处理:读取文档数据集,根据需求,对文档中的标点、空白、中英文、简繁体等字符进行清洗和整理。

  2. 分词后计算词汇哈希:对文档进行分词处理,统计各词汇的词频,以字典形式表示即为 \left{ word: counts \right} 。通过哈希函数,将词汇从字符串形式转换为长度为 N 的01形式的向量,以字典形式表示即为 \left{ [01]\left{ N \right}: counts \right} 。

  3. 计算Simhash特征向量:将词汇哈希中的 0 映射为 -1 ,然后与词频按位相乘,得到的词汇特征向量集可以表示为 \left{ [I(x_{n}=1)-I(x_{n}=0)]counts | n\in\left( 1,N \right) \right} 。设文档共有 M 个词汇,将这M个词汇的 N 维特征向量按行拼接,,则得到一个 MN 的矩阵。对这个矩阵按列进行求和,得到一个 N 维行向量,再对这个行向量按位进行 I(y_{n}>0) 变换,即正数映射为1,负数映射为0,最后的结果就是这个文档的simhash特征向量。

  4. 建立分段索引,提取潜在相似文本对:Simhash采用Hamming距离衡量文本相似度,Hamming距离小于等于 K 的文本对,认为是重复文本。根据抽屉原理,若将Simhash分为 K+1 段,则重复文本必有一段取值相同。与Minhash类似,可以将同一索引值下的文本两两组合,作为潜在相似文本对。

  5. 计算潜在相似文本对的Hamming距离:两个Simhash向量按位异或之后取值为1的个数即为两个文本的距离 distance=\sum_{n=1}^{N}{I(x_{n}=y_{n})} 。当距离小于等于指定阈值时,可认为两个文本为重复文本。

(二)算法分析

  1. 哈希函数

这里的哈希函数是指将词汇哈希为01向量的函数。个人认为这个哈希函数应该具有两个特征:

一是哈希结果中的0和1尽量均匀地分布,否则在分段索引时,很容易造成某一段文本数量爆炸的情况。例如将词汇哈希为64维01向量时,采用高(低)位补零的策略,就会导致分段后高(低)位全为0的这个索引下有几乎全量的文本,无法达到缩小潜在相似文本范围的目的。

二是哈希结果最好能使相似词汇具有相近的哈希值,如果能做到那也是一个局部敏感哈希。

  1. Simhash准确率低于Minhash

一是Simhash对文本进行分词处理并统计词频,可以认为是一个词袋模型,并没有考虑词汇的先后顺序。Minhash采用滑动窗口提取词组,加入了词汇次序信息。

二是Simhash对词汇特征向量按列求和再做符号映射,丢失了文本特征信息。

四、KSentence算法
KSentence算法基于一个朴素的假设:两个重复文本中,最长的K个句子应该是完全一样的。

(一)算法步骤
1.预处理:读取文档数据集,根据需求,对文档中的中英文、简繁体等字符进行清洗和整理。

2.提取语句:根据标点、换行符等划分语句,统计语句长度

3.计算指纹:拼接最长的 K 个语句,计算MD5值作为文本指纹

4.文本去重:根据文本指纹,过滤重复文本

(二)算法分析
关于KSentence算法的几点注解如下:

1.KSentence算法的假设很严格,实验结果显示,KSentence算法准确率较高,召回率低于Minhash和Simhash。

2.算法实现简单,计算效率高,很容易并行化。算法对于具有固定格式的模板类文档具有很好的辨识能力,但对于抄袭后进行部分修改的文本识别度较低。

五、总结

  1. 算法步骤

四类算法步骤对比
2. 算法评估

实验对比Minhash、Simhash、KSentence的性能,结果如下:

运行速度:KSentence > Simhash > Minhash

准确率:KSentence > Minhash > Simhash

召回率:Simhash > Minhash > KSentence

工程应用上,海量文本用Simhash,短文本用Minhash,追求速度用KSentence。

文本去重算法:Minhash/Simhash/Klongsent相关推荐

  1. [转]文档去重算法:SimHash和MinHash

    simhash与重复信息识别 来源: http://grunt1223.iteye.com/blog/964564 在工作学习中,我往往感叹数学奇迹般的解决一些貌似不可能完成的任务,并且十分希望将这种 ...

  2. minhash算法检索相似文本_文本去重算法:Minhash/Simhash/Klongsent

    日前接到一个对名言警句这种短文本进行去重的小任务,下图是几个重复文本的示例: 很直观的结论就是重复度越高的文本,具有更多重复的词汇.一个最直接的去重思路可以描述为:将文本进行分词处理,统计各文本词汇的 ...

  3. 路由器距离向量算法计算举例_文本去重算法:Minhash/Simhash/Klongsent

    日前接到一个对名言警句这种短文本进行去重的小任务,下图是几个重复文本的示例: 很直观的结论就是重复度越高的文本,具有更多重复的词汇.一个最直接的去重思路可以描述为:将文本进行分词处理,统计各文本词汇的 ...

  4. [转]文本相似性算法:simhash/minhash/余弦算法

    数据挖掘之lsh(局部敏感hash) minhash.simhash 在项目中碰到这样的问题: 互联网用户每天会访问很多的网页,假设两个用户访问过相同的网页,说明两个用户相似,相同的网页越多,用户相似 ...

  5. 文本去重之MinHash算法——就是多个hash函数对items计算特征值,然后取最小的计算相似度...

    来源:http://my.oschina.net/pathenon/blog/65210 1.概述 跟SimHash一样,MinHash也是LSH的一种,可以用来快速估算两个集合的相似度.MinHas ...

  6. 网页去重||SimHash(高效的文本相似度去重算法)——适合大批量文档的相似度计算

    网页去重 之前我们对下载的url地址进行了去重操作,避免同样的url下载多次.其实不光url需要去重,我们对下载的内容也需要去重. 在网上我们可以找到许多内容相似的文章.但是实际我们只需要其中一个即可 ...

  7. 算法 # SimHash 算法:文本相似度、文本去重、海量文本快速查询

    SimHash SimHash 是 Google 发明的海量网页去重的高效算法,将原始的文本映射为 64 位的二进制串,然后通过比较二进制的差异进而表示原始文本内容的差异. 传统的 Hash 算法只负 ...

  8. hashset去重原理_基于simhash的文本去重原理

    互联网网页存在着大量重复内容,必须有一套高效的去重算法,否则爬虫将做非常多的无用功,工作时效性无法得到保证,更重要的是用户体验也不好.业界关于文本指纹去重的算法众多,如 k-shingle 算法.go ...

  9. 文本相似度计算——Simhash算法(python实现)

    互联网网页存在着大量重复内容,必须有一套高效的去重算法,否则爬虫将做非常多的无用功,工作时效性无法得到保证,更重要的是用户体验也不好.业界关于文本指纹去重的算法众多,如 k-shingle 算法.go ...

  10. pbewithmd5anddes算法 对应.net_文本相似度算法之-simhash

    文本相似度算法种类繁多,今天先介绍一种常见的网页去重算法Simhash. 1.什么是simhash simhash是google于2007年发布的一篇论文<Detecting Near-dupl ...

最新文章

  1. Qt4连接mysql5数据库
  2. 123. Leetcode 72. 编辑距离 (动态规划- 字符串系列)
  3. HTML5中各种标签总结(body标签)
  4. easyUI的图标设置
  5. 北京理工大学计算机课答案,北京理工大学计算机专业考研课程模拟试题.doc
  6. HTTP学习笔记1-基本定义
  7. leetcode python3 简单题27. Remove Element
  8. java实现 tf-idf
  9. 容器与微服务持续交付
  10. 【ArcGIS|空间分析|网络分析】9 使用位置分配选择最佳商店位置
  11. Android Multimedia框架总结(八)Stagefright框架之AwesomePlayer及数据解析器
  12. 高等代数——大学高等代数课程创新教材(丘维声)——3.6笔记+习题
  13. CCL语料库检索系统(网络版)
  14. 计算机cmd管理员,cmd获取管理员权限的命令是什么
  15. 物联网应用技术和计算机应用技术哪个更好,2020物联网应用技术专业选什么大学好?...
  16. linkinfo.dll病毒 盗取 用户登陆 网页帐号,和密码
  17. 计算机毕设(附源码)JAVA-SSM交通事故证据交易平台
  18. 听说这两款是最适合程序员编程的电脑
  19. 微信支付--网页版-V3-(3)
  20. Java中接口的作用,为什么要写接口?

热门文章

  1. 微信小程序服务器布置轮播图,微信小程序自定义轮播图
  2. 操作系统多道程序设计和分时---笔记02
  3. Amazfit T-Rex Pro 体验:户外运动爱好者的装备清单里,有它一席之地
  4. Mysql数据库中修改密码的几种方式
  5. matlab的火山图,Python数据可视化-火山图的绘制
  6. java使用过滤器/拦截器过滤response信息
  7. power supply surges detected
  8. Eclipse下如何使用Maven——超详细教程
  9. Java开发快递物流项目(7)
  10. 传智播客python毕业_2018年传智播客黑马python人工智能15期