文本去重之MinHash算法

1.概述

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

2.Jaccard index

在介绍MinHash之前,我们先介绍下Jaccard index。

Jaccard index是用来计算相似性,也就是距离的一种度量标准。假如有集合A、B,那么,

也就是说,集合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

原文地址:http://my.oschina.net/u/576409/blog/65210

时间: 2024-11-19 03:07:18

文本去重之MinHash算法的相关文章

minhash算法用于文本查重

minhash算法查重是本科毕业设计题目 室友说本科毕业设计做不了什么水平,翔哥(宿舍另一个室友)可以做比毕设更难的作品 ——引言 这里以上的2张图片是来源自张荃硕士的研究论文,我把下载了截图上传的 详细清楚的讲了minhash的原理和怎么编程,我就是看了之后才一鼓作气编完的. 因为现在现在是4月,还没有毕业,所以代码就不贴了. 以下是完成的效果. 原文地址:https://www.cnblogs.com/shao1213/p/12658561.html

[Algorithm] 使用SimHash进行海量文本去重

转载:http://toutiao.com/news/6253252096791937537/?iid=3521431589 在之前的两篇博文分别介绍了常用的hash方法([Data Structure & Algorithm] Hash那点事儿)以及局部敏感hash算法([Algorithm] 局部敏感哈希算法(Locality Sensitive Hashing)),本文介绍的SimHash是一种局部敏感hash,它也是Google公司进行海量网页去重使用的主要算法. 1. SimHash与

使用SimHash进行海量文本去重[转载]

阅读目录 1. SimHash与传统hash函数的区别 2. SimHash算法思想 3. SimHash流程实现 4. SimHash签名距离计算 5. SimHash存储和索引 6. SimHash存储和索引 7. 参考内容 在之前的两篇博文分别介绍了常用的hash方法([Data Structure & Algorithm] Hash那点事儿)以及局部敏感hash算法([Algorithm] 局部敏感哈希算法(Locality Sensitive Hashing)),本文介绍的SimHas

使用SimHash进行海量文本去重[转]

阅读目录 1. SimHash与传统hash函数的区别 2. SimHash算法思想 3. SimHash流程实现 4. SimHash签名距离计算 5. SimHash存储和索引 6. SimHash存储和索引 7. 参考内容 在之前的两篇博文分别介绍了常用的hash方法([Data Structure & Algorithm] Hash那点事儿)以及局部敏感hash算法([Algorithm] 局部敏感哈希算法(Locality Sensitive Hashing)),本文介绍的SimHas

使用MinHash算法计算两个集合的相似度

集合相似度计算是一个常见的问题.例如,已知看过芈月传的人都有哪些,还知道看过琅琊榜的人都有哪些,那么想知道同时看过两者的人群占至少看过一部的人群的占比,就是求这两个集合的相似度: 集合A = 看过芈月传的人群集合B = 看过琅琊榜的人群相似度 = |A∩B| / |A∪B| = 既看过芈月传又看过琅琊榜的人数 / 看过芈月传或琅琊榜的人数 当集合的元素较少时,我们可以采用逐一比较的方式来找出既在集合A出现也在集合B出现的人,统计其人数,再除以至少在集合A或集合B出现的人数,得到相似度. 然而当集

文本去重算法——simhash简介

一.基本概念 simhash是为了计算一篇文档之间的相似度存在的,通过simhash算法可以计算出文档的simhash值,通过各个文档计算出的二进制值来计算文档之间的汉明距离,然后根据汉明距离来比较文档之间的相似度.汉明距离是指两个相同长度的字符串相同位置上不同的字符的个数.  simhash算法分为5个步骤:分词.hash.加权.合并.降维,具体过程如下所述: 二.步骤 1.分词         给定一段语句,进行分词,得到有效的特征向量,然后为每一个特征向量设置1-5等5个级别的权重(如果是

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

SimHash是什么 SimHash是Google在2007年发表的论文<Detecting Near-Duplicates for Web Crawling >中提到的一种指纹生成算法或者叫指纹提取算法,被Google广泛应用在亿级的网页去重的Job中,作为locality sensitive hash(局部敏感哈希)的一种,其主要思想是降维,什么是降维? 举个通俗点的例子,一篇若干数量的文本内容,经过simhash降维后,可能仅仅得到一个长度为32或64位的二进制由01组成的字符串,这一点

MinHash算法

MinHash是用于快速检测两个集合的相似性的方法.改方法由Andrei Broder(1997)发明,并最初用于搜索引擎AltaVista中来检测重复的网页的算法.它同样可以用于推荐系统和大规模文档聚类中. 我们先介绍Jaccard相似度量.对于两个集合A与B,Jaccard相似性系数可以定义为: 容易知道,Jaccard系数是0-1之间的值.当两个集合越接近,那么该值越接近1:反之跟接近0. 假设h是一个hash function,将A与B的元素映射成一个整数,定义:是集合S中具有最小哈希值

linux命令 sort文本去重

对于sort 可以输出 不重复的字段的用法 sort -u <taskfile> 扩展 命令 sortx.sh #!/bin/bash /bin/sort -u $1 -o $1 此命令扩展 的意图 去除指定的文件中重复的单字 并写回原文件 这个命令对于基于文本处理并作模型构建的同学有方便之处 不必要自己写去重工具了