集合相似度-minhash
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
集合相似度-minhash
文章来源:/blog/1025638
第三章查找相似的Items
数据挖掘的一个基本问题是检测相似的Items.比如网页去重,从网页集合中找到近似重复的网页,这类网页通常是内容相同,但是有一些是关于不同站点和镜像的内容。
这章从集合中找到交集,交集和集合大小的相对比率表示相似度,展开介绍相似度。我们会介绍怎样把文本文档的相似性表示为集合问题,这种技术被称为指纹方式。然后介绍了minhashing,他可以将大的集合压缩,并从压缩后的版本导出原来集合的相似度。其他的一些相似度算法在3.9进行了介绍。
一个非常重要的问题是,我们要搜索相似的Items,我们需要比较两两比较,这需要比较太多
的次数,即使每一对比较都非常的简单,但是仍然需要非常大的计算量。使用"locality-senitive hashing"可以解决这个问题,他只搜索可能相似的pair。
最后,介绍了不通过集合交集来表达的形似度计算方法,然后介绍了LSH通用的框架,可以使用其他定义的相似度算法。
3.1 临近搜索应用
3.1.1
Jaccard 相似度表示为:两个集合S和T,
SIM(S,T) = |S ∩ T |/|S ∪T |.
3.1.2 文档相似度
从文档比如网页或者新闻文章集中找出文本相似的文档,Jaccard相似度可以很好的解决。文本相似度具有很大的用处,比如找出重复或者近似重复的文档,测试两个文档完全重复是很好做的事情,但是有一些应用中,他们不是完全一样,而是共享很大一部分内容。有以下应用:
文章抄袭
查找文档的抄袭可以检测我们查找文档相似度的能力。抄袭者可能只有一部分时他自己的,他可能修改了措辞或者调整了句子的顺序,但是仍有50%是抄袭别人的。简单的逐字的对比来是检测不出复杂的抄袭。
镜像网页
一些流行的网站会把网页镜像到不同的域中,以此来均衡服务器压力。网站的镜像中的网页非常相似,但是并不是完全相同,他们可能会包含自己的域的信息,链接到其他的镜像而不是他们自身。能够检测出重复网页是一个很重要的应用,比如搜索引擎应该避免近似相同的两个网页同时出现在搜索结果的第一页。
同一个来源的文章
一个记者写的一篇新闻,可能被多个媒体使用,每一个可能只是将这篇文章做了一些修改,比如删除掉了一些段落,添加了他们自己的内容,内容周边环绕了他们的logo,广告,链接到他们自己网站的其他文章。Google新闻应该能够找到这个文章的所有版本,并只显示出一个,这需要查找两篇文章的文本相似度。
3.1.3 基于相似集合的协同过滤
另一类使用集合相似度的应用是协同过滤,协同过滤描述了把具有相似口味的用户的items
推荐给其他用户。
在线购物
比如在亚马逊有上百万的用户和物品,记录了哪些用户买了哪些物品,如果两各个人购买的物品集合具有很高的Jaccard相似度,那么这两个客户也是相似的。
除了根据Jaccard相似度,还需要一些其他的工具,比如两个客户都喜欢看科幻小说,但是他们购买了不同的小说,具有很少的重复,那么我们还需要通过组合相似度和聚类来做协同过滤。
电影分级评分
NetFlix记录了哪些客户租了哪些电影,已经他们对这些电影的评分,我们可以认为如果相同的顾客对不同电影评分比较高的,它们具有很大的相似性。
bag相似度:
{a, a, a, b} 与{a, a, b, b, c} 的相似度为1/3.
3.2 文档指纹签名
用文档的一个短的字符串集合来描述文档词法上的相似度,是非常有效的方法。这种方式,文档公用一些短的句子或者短语,这样这些文档的字符串集合会有很多的共同元素,即使这些句子出现的顺序不同。
3.2.1 k-shingles
一个文档是由字符组成的字符串,k-shingles表示文档中任意长度为k的字串集合。
我们还可以将他们出现的次数关联上去。比如文档D为abcdabd字符串,那么2-shingles为{ab,bc,cd,da,bd}。ab出现了两次但是没有在2-shingles出现过两次。也可以采用bag的方式,对出现的个数进行技术。
对于空白字符的处理,最好的办法是将所有的连续空白都替换为单个空格。
3.2.2如何选择k
我们可以取k为任意常数,然而,如果我们选择k太小,则会有非常多的k-shingles出现在大多数的文章中。那么他们的指纹集合的Jaccard相似度就会很高。如果我们取k=1,那么大多数的网页中都含有非常多的共同的字符,很少的其他字符,那么所有的网页都是相似的。k的长度应该根据文档的长度和字符集的大小来选定,但是最重要的是:k应该选择让任意的指纹在任意的文档中都应该是很低的概率
如果我们的语料是emails,那么选择k是5是一个很好的选择。对于大的文档,比如研究论文,可以选择k=9.
3.2.3 哈希指纹
除了使用子串进行指纹签名,我们还可以使用hash函数,他可以把长度为k的字符串映射到
一些桶中,将桶的数字作为指纹。这样一个文档的集合可以表示为一个或者多个k-shingles 出现桶的数字。我们可以为文档构建9-shingles,然后将每一个9-shingles映射到0~2^32-1之间桶的标号中。这样每一个指纹只有4字节而不是9个了。这样不仅空间被压缩了,而且操作是单个机器字的操作。
我们可以使用9-shingles,然后将它hash成4个字节,这样文档的区分度就会别使用4-shingles 要高,虽然在空间消耗上是一样的。
3.2.4 根据单词构建指纹
一个好的方式是,首先定义文中的停顿词,然后取出停顿词后面的两个单词,这样可以组成很好的指纹信息。这个在网页去重中非常有用,因为导航、边框都是很短的很少停顿词的句