[原]网页去重-算法篇

标签: | 发表时间:2009-12-16 06:15 | 作者:beta2
出处:http://blog.csdn.net/beta2

前一篇提到了5个解决网页去重的算法,这里我想讨论下这些算法

1. I-Match

2. Shingliing

3. SimHashing( locality sensitive hash)

4. Random Projection

5. SpotSig

6. combined

I-Match算法
I-Match算法有一个基本的假设说:不经常出现的词和经常出现的词不会影响文档的语义,所以这些词是可以去掉的。
算法的基本思想是:将文档中有语义的单词用hash的办法表示成一个数字,数字的相似性既能表达文档的相似性
算法的框架是:
1. 获取文档(或者是主体内容)
2. 将文档分解成token流,移除格式化的标签
3. 使用term的阈值(idf),保留有意义的tokens
4. 插入tokens到升序排列的排序树中
5. 计算tokens的SHA1
6. 将元组(doc_id,SHA hash) 插入到某一词典中,如果词典有冲突,这两个文档相似。

算法有一个缺点是稳定性差。如果文档的某个词改变了,最终的hash值就会发生显著的变化。对空文档,算法是无效的。
有一个解决办法是,用随机化的方法,参考 Lexicon randomization for near-duplicate detection with I-Match。具体细节这里就不提了

Shingling算法
Shingling算法说,I-Match以词为单位做hash显然是不准确的,因为它忽略了文档之间的顺序。另,Shingle指的是连续的若干个单词的串。
Shingling算法有个简单的数学背景。如果一个shingle的长度为k,那么长度为n的文档就有n-k+1个shingle,每一个shingle可以用MD5或者其他算法表示成一个fingerprint,而两个文档的相似性Jacard相似性来表示,Jarcard公式是指两个集合的相似性=集合之交/集合之并。为了估计两个文档的相似性,有时候n-k+1个fingerprint还是太大了,所以取m个fingerprint函数,对每一个函数fi,都可以计算出n-k+1个fingerprint,取其中的最小的fingerprint,称为i-minvalue. 那么一个文档就有m个i-minvalue。数学上,Broder大师说:

        平均来讲,两个文档中相同的唯一single的比率和两个文档中相同的i-minvalue的比率是一样的

Shingling的算法框架是:
1. 获取文档(或者是主体内容)
2. 将文档分解成n-k+1个shingle,取m个fingerprint函数,对每一个fingerpint函数计算i-minvalue值
3. 将m个i-minvalue值组合成更少m’个surpersingle
4.计算两个文档相同的surpergingle的个数a。
5. 如果a大于某一个值b(say:2),那么两个文档Jarcard 相似

一般的参数设置为:m=84,m’=6,b=2

SimHash 算法

locality sensitive hash算法博大精深。基本思想是,如果两个东西相似,我可以用一个hash函数把他们投影到相近的空间中 LSH。用到near duplication detection上,算法框架是:
1. 将文档转换为特征的集合,每一个特征有一个权重
2. 利用LSH函数把特征向量转换为f位的fingerprint,如:64
3. 查找fingerprint的海明距离

haha,看,多么简单和明朗,这里的几个问题及时寻找正确的LSH

Random Projection算法
shingling关注了文档顺序,但是忽略了文档单词出现的频率,random projection说我要讨论文档的频率。

Random Projection也是很有意思的一种算法,它是一种随机算法。简单描述为:
1. 将每一个token映射到b位的空间。每一个维度是由{-1,1}组成。对所有页面投影函数是一样的
2. 每一个页面的b维度向量,是所有token的投影的简单加和
3. 最后把b维向量中的正数表示为1,负数和0都写成0
4. 比较两个page的b维向量一致的个数

Charikar最牛的地方是,证明,两个b位变量一致的位数的比率就是文档向量的consine相似性。这里的数学基础还是很有意思的,如果感兴趣,可以参考M.S. Charikar. Similarity Estimation Techniques for Rounding Algorithm(May 2002)

SpotSig算法

ref:SpotSigs:Robust and Efficient Near Duplicate Detection in Large Web Collection
SpotSig是个比较有意思的算法,它说,我为什么要关注所有的单词啊,我要关注的单词是有语义的词,哪些是有语义的词呢?哦,想 the a this an 的等虚词后面的就是我要关注的东西罗。Spot就是指这些虚词的后面的词串。然后呢,每一个文档我都有很多很多Spot了,现在一个文档就是一个Spot的集合,两个文档是相似程度就是集合的Jaccard相似度。算法虽然简单,但是我想重点是两个比较有借鉴意义的工程上的性能考虑。

     1. Optimal Partition

     Sim(A,B) = | A B交集| / | A B 并集| <= min(A,B)/max(A,B) <= |A|/|B| say: |A|<|B|

好了,这是一个很好的枝剪条件,如果文档spot vector的个数比小于某个值(当然是,小 / 大),就可以完全不用求交,并了。Optimal Partition就是说,好啊,我把每一个文档的spot vector的长度都投影到相应的从小到大的bucket中,保证|d1|/|d2| >=r if |d1| < |d2| . 且不存在这样的反例。另一个保证是这个bucket是满足条件的最小的。有了这个partition,我们最多只用关心相邻的三个bucket了

   2. Inverted Index Pruning

   说,两个文档,如果能相似,起码有一个公共的spot。逆向索引说的就是把spot做为index,包含它的所有文档作为其value。

有了这两个工具,计算复杂度可以明显下降,因为它不会计算不能是duplication的文档。
作者:beta2 发表于2009-12-15 22:15:00 原文链接
阅读:5150 评论:2 查看评论

相关 [网页 算法] 推荐:

搜索引擎网页去重算法

- - 醉清风
  相关统计数据表明:互联网上近似重复的网页的数量占网页总数量的比例高达29%,完全相同的网页大约占网页总数量的22%.研究表明,在一个大型的信息采集系统中,30%的网页是和另外70%的网页完全重复或近似重复的.     即:互联网的网页中相当高的比例的网页内容是近似相同或完全相同的. 搜索爬虫抓取会产生网页重复的类型:.

[原]网页去重-算法篇

- - 机器学习和我关注的技术
前一篇提到了5个解决网页去重的算法,这里我想讨论下这些算法. I-Match算法有一个基本的假设说:不经常出现的词和经常出现的词不会影响文档的语义,所以这些词是可以去掉的. 算法的基本思想是:将文档中有语义的单词用hash的办法表示成一个数字,数字的相似性既能表达文档的相似性. 将文档分解成token流,移除格式化的标签.

Simhash算法原理和网页查重应用

- - 互联网旁观者
传统的hash算法只负责将原始内容尽量均匀随机地映射为一个签名值,原理上相当于伪随机数产生算法. 产生的两个签名,如果相等,说明原始内容在一定概率下是相等的;如果不相等,除了说明原始内容不相等外,不再提供任何信息,因为即使原始内容只相差一个字节,所产生的签名也很可能差别极大. 从这个意义上来说,要设计一个hash算法,对相似的内容产生的签名也相近,是更为艰难的任务,因为它的签名值除了提供原始内容是否相等的信息外,还能额外提供不相等的原始内容的差异程度的信息.

Chrome采用新压缩算法 提升网页加载速度降低数据流量消耗

- - cnBeta.COM
谷歌Chrome浏览器很快就会提升网页加载速度并且降低数据流量消耗,这要归功于公司引进的Brotli压缩算法. Brotli压缩算法始于去年九月. 谷歌声称和使用已经达到3年时间的Zopfli算法相比,它可以将数据压缩率继续提升26%,谷歌表示,Brotli还可以帮助降低移动设备的电池使用量,达到省电目的.

缓存算法

- lostsnow - 小彰
没有人能说清哪种缓存算法由于其他的缓存算法. (以下的几种缓存算法,有的我也理解不好,如果感兴趣,你可以Google一下  ). 大家好,我是 LFU,我会计算为每个缓存对象计算他们被使用的频率. 我是LRU缓存算法,我把最近最少使用的缓存对象给踢走. 我总是需要去了解在什么时候,用了哪个缓存对象.

BFPRT算法

- zii - 小彰
BFPRT算法的作者是5位真正的大牛(Blum 、 Floyd 、 Pratt 、 Rivest 、 Tarjan),该算法入选了在StackExchange上进行的当今世界十大经典算法,而算法的简单和巧妙颇有我们需要借鉴学习之处. BFPRT解决的问题十分经典,即从某n个元素的序列中选出第k大(第k小)的元素,通过巧妙的分析,BFPRT可以保证在最坏情况下仍为线性时间复杂度.

贪心算法

- Shan - 博客园-首页原创精华区
顾名思义,贪心算法总是作出在当前看来最好的选择. 也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择. 当然,希望贪心算法得到的最终结果也是整体最优的. 虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解. 如单源最短路经问题,最小生成树问题等.

缓存算法

- 成 - FeedzShare
来自: 小彰 - FeedzShare  . 发布时间:2011年09月25日,  已有 2 人推荐. 没有人能说清哪种缓存算法由于其他的缓存算法. (以下的几种缓存算法,有的我也理解不好,如果感兴趣,你可以Google一下  ). 大家好,我是 LFU,我会计算为每个缓存对象计算他们被使用的频率.

K-Means 算法

- - 酷壳 - CoolShell.cn
最近在学习一些数据挖掘的算法,看到了这个算法,也许这个算法对你来说很简单,但对我来说,我是一个初学者,我在网上翻看了很多资料,发现中文社区没有把这个问题讲得很全面很清楚的文章,所以,把我的学习笔记记录下来,分享给大家. k-Means 算法是一种  cluster analysis 的算法,其主要是来计算数据聚集的算法,主要通过不断地取离种子点最近均值的算法.

查找算法:

- - CSDN博客推荐文章
从数组的第一个元素开始查找,并将其与查找值比较,如果相等则停止,否则继续下一个元素查找,直到找到匹配值. 注意:要求被查找的数组中的元素是无序的、随机的. 比如,对一个整型数组的线性查找代码:. // 遍历整个数组,并分别将每个遍历元素与查找值对比. 要查找的值在数组的第一个位置. 也就是说只需比较一次就可达到目的,因此最佳情况的大O表达式为:O(1).