网页去重算法介绍

从“语义指纹算法”到“网页去重算法”,最终在csdn blog上找到部分我想要的资料了。不能直接转载,只好实施起“人工+智能”。
 
================================================================================================
以下内容来自csdn的"机器学习和我关注的技术"
================================================================================================
网页去重-比较文本的相似度-Near duplication detection http://blog.csdn.net/beta2/article/details/4974221
Near duplicate detection 的任务是检测重复的内容,这项工作在搜索引擎,版权保护,信息展示等方面都有很好的应用。在搜索引擎上,主要是去掉重复的页面,图片,文件,文档等等。下面就指讨论网页的deduplication。
 
问题是什么?
    据统计,网页上的大部分相同的页面占29%,而主体内容完全相同的占22%,这些重复网页有的是没有一点改动的拷贝,有的在内容上稍作修改,比如同一文章的不同版本,一个新一点,一个老一点,有的则仅仅是网页的格式不同(如 HTML, Postscript),文献[Models and Algorithms for Duplicate Document Detection 1999年]将内容重复归结为以下四个类型:
1.如果2篇文档内容和格式上毫无差别,则这种重复叫做full-layout duplicate。
2.如果2篇文档内容相同,但是格式不同,则叫做full-content duplicates
3.如果2篇文档有部分重要的内容相同,并且格式相同,则称为partial-layout duplicates
4.如果2篇文档有部分重要的内容相同,但是格式不同,则称为partial-content duplicates
 
网页去重的任务就是去掉网页中主题内容重复的部分。它和网页净化(noise reduction),反作弊(antispam) 是搜索引擎的3大门神
 
去重在我看来起码有四好处:减少存储;增强检索效率;增强用户的体验;死链的另一种解决方案。
 
目前从百度的搜索结果来看,去重工作做的不是很完善,一方面可能是技术难度(precision和recall都超过90%还是很难的);另一方面可能是重复的界定,比如转载算不算重复?所以另一项附属的工作是对个人可写的页面(PWP)进行特殊的处理,那么随之而来的工作就是识别PWP页面。^_^这里就不扯远呢。
 
问题如何解决?
网页的deduplication,我们的算法应该是从最简单的开始,最朴素的算法当然是
 
        对文档进行两两比较,如果A和B比较,如果相似就去掉其中一个
 
然而这个朴素的算法,存在几个没有解决的问题:
     0.要解决问题是什么?full-layout?full-content?partial-layout还是partial-content?
     1. 怎么度量A 和 B的相似程度
     2. 去掉A还是去掉B,如果A ~B(~表相似,!~表示不相似),B~C 但是 A!~C,去掉B的话,C就去不掉。
 
另一个更深入的问题是,算法的复杂度是多少?假设文档数为n,文档平均长度为m,如果相似度计算复杂度为m的某一个复杂度函数:T=T(m),文档两两比较的复杂度是O(n^2),合起来是O(n^2 * T(m)) . 这个复杂度是相当高的,想搜索引擎这样处理海量数据的系统,这样的复杂度是完全不能接受的,所有,另外三个问题是:
 
      3. 如何降低相似度计算的复杂化度
      4. 如何减少文档比较的复杂度
      5. 超大数据集该如何处理
第0个问题是,我们要解决的关键,不同的问题有不同的解决方法,从网页的角度来看,结构的重复并不能代表是重复,比如产品展示页面,不同的产品展示页面就有相同的文档结构。内容来看,复制网站会拷贝其他网站的主要内容,然后加些广告或做些修改。所以,解决的问题是,partial-content deduplication,那么首先要抽取网页的主体内容。算法变成:
 
     抽取文档主体内容,两两比较内容的相似性,如果A和B相似,去掉其中一个
其次,问题2依赖于问题1的相似度度量,如果度量函数具有传递性,那么问题2就不存在了,如果没有传递性,我们的方法是什么呢?哦,那就找一个关系,把相似关系传递开嘛,简单,聚类嘛,我们的框架可以改成:
 
     抽取文档主体内容,两两比较内容的相似性,如果A和B相似,把他们聚类在一起,最后一个类里保留一个page
最后,归纳为几个步骤
第一步:识别页面的主题内容,网页净化的一部分,以后讨论
第二步:计算相似度
第三步:聚类算法,计算出文档那些文档是相似的,归类。
 
核心的问题是,“如何计算相似度?”这里很容易想到的是
   1. 计算内容的编辑距离edit distance(方法很有名,但是复杂度太高)
   2. 把内容分成一个个的token,然后用集合的jaccard度量(好主意,但是页面内容太多,能不能减少啊?)
 
好吧,但是,当然可以减少集合的个数呢,采样,抽取满足性质的token就可以啦,如满足 mod m =0 的token,比如有实词?比如stopwords。真是绝妙的注意.在把所有的idea放一起前,突然灵光一现,啊哈,
   3. 计算内容的信息指纹,参考google研究员吴军的数学之美系列http://www.googlechinablog.com/2006/08/blog-post.html
 
把他们放在一起: 
     
第一步:识别页面的主题内容,网页净化的一部分,以后讨论
第二步:提取页面的特征。将文章切分为重合和或不重合的几个结合,hash out
第三步:用相似度度量来计算集合的相似性,包括用信息指纹,Jaccard集合相似度量,random projection等。
第四步:聚类算法,计算出文档那些文档是相似的,归类。
 
方法分类:
 
按照利用的信息,现有方法可以分为以下三类
1.只是利用内容计算相似
2.结合内容和链接关系计算相似
3.结合内容,链接关系以及url文字进行相似计算
 
一般为内容重复的去重,实际上有些网页是
按照特征提取的粒度现有方法可以分为以下三类
 
1.按照单词这个级别的粒度进行特征提取.
2.按照SHINGLE这个级别的粒度进行特征提取.SHNGLE是若干个连续出现的单词,级别处于文档和单词之间,比文档粒度小,比单词粒度大.
3.按照整个文档这个级别的粒度进行特征提取
 
算法-具体见真知
1. I-Match
2. Shingling
3. Locality Sensitive Hashing.(SimHash)
4. SpotSigs
5. Combined
 
网页去重-算法篇 http://blog.csdn.net/beta2/article/details/5014530
前一篇提到了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。
 
网页去重-镜像站点的特殊处理 http://blog.csdn.net/beta2/article/details/5028411
基于关键词的复制网页算法
想前面的提到的算法都是基于这个文档的,对于大型的搜索引擎来说,在性能上有些差距,所以有些优化,针对是网页的关键词,或者网页的meta描述部分。所以,必须有以下的技术做支撑:
1、网页中出现的关键词(中文分词技术)以及每个关键词的权重(关键词密度);
2、提取meta descrīption或者每个网页的若干(比如:512)个字节的有效文字。
在以下算法描述中,我们约定几个信息指纹变量:
Pi表示第i个网页;
该网页权重最高的N个关键词构成集合Ti={t1,t2,...tn},其对应的权重为Wi={w1,w2,...wi}
摘要信息用Des(Pi)表示,前n个关键词拼成的字符串用Con(Ti)表示,对这n个关键词排序后形成的字符串用Sort(Ti)表示。
以上信息指纹都用MD5函数进行加密。
基于关键词的复制网页算法有以下5种:
1、MD5(Des(Pi))=MD5(Des(Pj)),就是说摘要信息完全一样,i和j两个网页就认为是复制网页;
2、MD5(Con(Ti))=MD5(Con(Tj)),两个网页前n个关键词及其权重的排序一样,就认为是复制网页;
3、MD5(Sort(Ti))=MD5(Sort(Tj)),两个网页前n个关键词一样,权重可以不一样,也认为是复制网页。
4、MD5(Con(Ti))=MD5(Con(Tj))并且Wi-Wj的平方除以Wi和Wj的平方之和小于某个阙值a,则认为两者是复制网页。
5、MD5(Sort(Ti))=MD5(Sort(Tj))并且Wi-Wj的平方除以Wi和Wj的平方之和小于某个阙值a,则认为两者是复制网页。
关于第4和第5的那个阙值a,主要是因为前一个判断条件下,还是会有很多网页被误伤,搜索引擎开发根据权重的分布比例进行调节,防止误伤。
这个是北大天网搜索引擎的去重算法(可以参考:《搜索引擎--原理、技术与系统》一书),以上5种算法运行的时候,算法的效果取决于N,就是关键词数目的选取。当然啦,选的数量越多,判断就会越精确,但是谁知而来的计算速度也会减慢下来。所以必须考虑一个计算速度和去重准确率的平衡。据天网试验结果,10个左右关键词最恰当。
资源:
SCAM (Stanford Copy Analysis Mechanism)=.http://infolab.stanford.edu/~shiva/SCAM/scamInfo.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值