来源:http://my.oschina.net/pathenon/blog/65210

1.概述

跟SimHash一样,MinHash也是LSH的一种,可以用来快速估算两个集合的相似度。MinHash由Andrei Broder提出,最初用于在搜索引擎中检测重复网页。它也可以应用于大规模聚类问题。

2.Jaccard index
在介绍MinHash之前,我们先介绍下Jaccard index。
也就是说,集合A,B的Jaccard系数等于A,B中共同拥有的元素数与A,B总共拥有的元素数的比例。很显然,Jaccard系数值区间为[0,1]。
3.MinHash
先定义几个符号术语:
h(x):  把x映射成一个整数的哈希函数。   
hmin(S):集合S中的元素经过h(x)哈希后,具有最小哈希值的元素。

那么对集合A、B,hmin(A) = hmin(B)成立的条件是A ∪ B 中具有最小哈希值的元素也在 ∩ B中。这里

有一个假设,h(x)是一个良好的哈希函数,它具有很好的均匀性,能够把不同元素映射成不同的整数。

所以有,Pr[hmin(A) = hmin(B)] = J(A,B),即集合A和B的相似度为集合A、B经过hash后最小哈希值相

等的概率。

有了上面的结论,我们便可以根据MinHash来计算两个集合的相似度了。一般有两种方法:
第一种:使用多个hash函数
为了计算集合A、B具有最小哈希值的概率,我们可以选择一定数量的hash函数,比如K个。然后用这K个hash函数分别对集合A、B求哈希值,对
每个集合都得到K个最小值。比如Min(A)k={a1,a2,...,ak},Min(B)k={b1,b2,...,bk}。
那么,集合A、B的相似度为|Min(A)k ∩ Min(B)k| / |Min(A)k  ∪  Min(B)k|,及Min(A)k和Min(B)k中相同元素个数与总的元素个数的比例。
第二种:使用单个hash函数
第一种方法有一个很明显的缺陷,那就是计算复杂度高。使用单个hash函数是怎么解决这个问题的呢?请看:
前面我们定义过 hmin(S)为集合S中具有最小哈希值的一个元素,那么我们也可以定义hmink(S)为集合S中具有最小哈希值的K个元素。这样一来,
我们就只需要对每个集合求一次哈希,然后取最小的K个元素。计算两个集合A、B的相似度,就是集合A中最小的K个元素与集合B中最小的K个元素
的交集个数与并集个数的比例。
看完上面的,你应该大概清楚MinHash是怎么回事了。但是,MinHash的好处到底在哪里呢?计算两篇文档的相似度,就直接统计相同的词数和总的
次数,然后就Jaccard index不就可以了吗?对,如果仅仅对两篇文档计算相似度而言,MinHash没有什么优势,反而把问题复杂化了。但是如果有海量的文档需要求相似度,比如在推荐系统
中计算物品的相似度,如果两两计算相似度,计算量过于庞大。下面我们看看MinHash是怎么解决问题的。
比如 元素集合{a,b,c,d,e},其中s1={a,d},s2={c},s3={b,d,e},s4={a,c,d}   那么这四个集合的矩阵表示为:  

如果要对某一个集合做MinHash,则可以从上面矩阵的任意一个行排列中选取一个,然后MinHash值是排列中第一个1的行号。
例如,对上述矩阵,我们选取排列 beadc,那么对应的矩阵为
那么, h(S1) = a,同样可以得到h(S2) = c, h(S3) = b, h(S4) = a。
如果只对其中一个行排列做MinHash,不用说,计算相似度当然是不可靠的。因此,我们要选择多个行排列来计算MinHash,最后根据Jaccard index公式 来计算相似度。但是求排列本身的复杂度比较高,特别是针对很大的矩阵来说。因此,我们可以设计一个随机哈希函数去模拟排列,能够把行号0~n随机映射到0~n上。比如H(0)=100,H(1)=3...。当然,冲突是不可避免的,冲突后可以二次散列。并且如果选取的随机哈希函数够均匀,并且当n较大时,冲突发生的概率还是比较低的。
说到这里,只是讨论了用MinHash对海量文档求相似度的具体过程,但是它到底是怎么减少复杂度的呢?
比如有n个文档,每个文档的维度为m,我们可以选取其中k个排列求MinHash,由于每个对每个排列而言,MinHash把一篇文档映射成一个整数,所以对k个排列计算MinHash就得到k个整数。那么所求的MinHash矩阵为n*k维,而原矩阵为n*m维。n>>m时,计算量就降了下来。
4.参考文献
(1) http://en.wikipedia.org/wiki/MinHash
(2)  http://fuliang.iteye.com/blog/1025638

转载于:https://www.cnblogs.com/bonelee/p/6423334.html

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

  1. hash算法和常见的hash函数

    Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre--mage),通过散列算法,变换成固定长度的输出,该输出就 ...

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

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

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

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

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

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

  5. minhash算法检索相似文本_文本相似度算法之-minhash

    在做文本去重任务时其实有很多中方法可供选择,譬如,对文章分词,两两对比词集合的jaccard系数,但是当遇到大规模文本去重时,这种方法的效率就太低了,接下来介绍一种大规模文本去重算法minhash. ...

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

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

  7. [039]文本去重、过滤——文本指纹

    1. 文本指纹介绍 互联网网页存在大量的重复内容网页,无论对于搜索引擎的网页去重和过滤.新闻小说等内容网站的内容反盗版和追踪.还是社交媒体等文本去重和聚类,都需要对网页或者文本进行去重和过滤. 最简单 ...

  8. 百度咋做长文本去重(一分钟系列)--转

    2016-01-19 58沈剑 架构师之路 缘起: (1)原创不易,互联网抄袭成风,很多原创内容在网上被抄来抄去,改来改去 (2)百度的网页库非常大,爬虫如何判断一个新网页是否与网页库中已有的网页重复 ...

  9. 海量数据去重之SimHash算法简介和应用

    SimHash是什么 SimHash是Google在2007年发表的论文<Detecting Near-Duplicates for Web Crawling >中提到的一种指纹生成算法或 ...

最新文章

  1. 操作系统(Linux与Windows)的进程管理
  2. yii mysql 2002_YII 错误 SQLSTATE[HY000] [2002] No such file or directory
  3. spring 注解说明以及@Resource和@Autowired的区别
  4. 浏览器差异总结,可以用此判断浏览器版本(转)
  5. java7 uri,细数Java8中那些让人纵享丝滑的文件操作
  6. arm b bl 地址无关码_海边同居有甜有虐,又一部BL日剧来了
  7. 基于DEAP库的python进化算法-3.简单遗传算法的实现
  8. 注册表系列之恶作剧之吻
  9. js获取数组中的最大值和最小值的方法汇总
  10. ajax 单击事件删除,AJAX删除事件与加载数据方法介绍
  11. 游戏制作(详细教程)
  12. 人工智能与大数据的区别
  13. 快递查询网站php源码,全国快递查询PHP源码单号自动识别支持国内上百家快递
  14. php省略后缀,隐藏php后缀的方法是什么
  15. spacy教程--基础
  16. CAPM与多因子定价模型
  17. 关于“AHCI模式”解析
  18. 互联网技术-alibaba-gateway网关中routers路由匹配规则
  19. Java实现 LeetCode 756 金字塔转换矩阵(DFS)
  20. Windows程序设计最新书籍教程

热门文章

  1. 完全卸载Oracle方法(亲测有效)
  2. 保定理工学院专科计算机专业分数线,保定理工学院历年分数线 2021保定理工学院录取分数线...
  3. java接口返回值_java后台调用接口并返回值
  4. springboot的jsp应该放在哪_详解SpringBoot 添加对JSP的支持(附常见坑点)
  5. sqlserver查询当月的每一天_SQLServer 查询最近一天,三天,一周,一月,一季度数据的方法...
  6. c# mysql 触发器 实时,C#-.Net SqlDataAdapter和SQL Server中的触发器
  7. java 文本编辑器替换特殊字符_linux中批量替换文本中字符串--转载
  8. mysql 视图 教程_MySQL VIEW(视图)
  9. php的filter input,记一个php://filter和php://input的CTF题
  10. java cell报错_有一个小小点问题,现在我想从eclipse上读取Excel表