网页排重算法(转)

本文转自http://blog.chinaunix.net/uid-1755993-id-2866390.html,纯粹个人作备份之用

1.1 信息指纹算法

判断重复网页的思想:为每个网页计算出一组信息指纹(Fingerprint),若两个网页有一定数量相同的信息指纹,则认为这两个网页的内容重叠性很高,也就是说两个网页是内容复制的。

判断内容复制的方法中最关键的两点:

1、计算信息指纹(Fingerprint)的算法;

2、判断信息指纹的相似程度的参数。

信息指纹就是提取网页正文信息的特征,通常是一组词或者一组词+权重,然后根据这组词调用特别的算法,例如MD5,将之转化为一组代码,这组代码就成为标识这个信息的指纹。从理论上讲,每两个不同文本的特征信息是不同的,那么得到的代码也应该是不一样的,就象人的指纹。

得到预处理后的网页,然后对网页进行向量化处理,简单的讲就是分词,统计,并按照词频生成一个列表.

例如:

网页12

搜索10

引擎7

...

...

然后取前N个关键词作为信息的矢量,例如:[网页12搜索10引擎7] 这是可以直接进行MD5哈系,或者按照其它规则进行重排后进行MD5哈系。例如本例,取前3个关键词,在进行哈系,得到的信息指纹就是:a7eb9d92a83cf438881915e0bc2df70b。

这样a7eb9d92a83cf438881915e0bc2df70b 就作为本文档的指纹和以往的文档进行比较,如果有相同的,就说明指纹上看是一样的,就可以进入消重处理。至于关键词的权重,因为有众多的提取算法,比较常用的是nf/df。

1.2 分段签名算法

这种算法是按照一定的规则把网页切成N段,对每一段进行签名,形成每一段的信息指纹。如果这N个信息指纹里面有M个相同时(M是系统定义的阈值),则认为两者是复制网页。

这种算法对于小规模的判断复制网页是很好的一种算法,但是对于像google这样海量的搜索引擎来说,算法的复杂度相当高。

1.3 基于关键词的复制网页算法

像google这类搜索引擎,他在抓取网页的时候都会记下以下网页信息:

1、网页中出现的关键词(中文分词技术)以及每个关键词的权重(关键词密度);

2、提取meta descrīption或者每个网页的512个字节的有效文字。

关于第2点,baidu和google有所不同,google是提取meta descrīption,没有查询关键字相关的512个字节,而百度是直接提取后者。

在以下算法描述中,首先约定几个信息指纹变量:

 Pi表示第i个网页;

该网页权重最高的N个关键词构成集合Ti={t1,t2,...tn},其对应的权重为Wi={w1,w2,...wn}

摘要信息用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,主要是因为前一个判断条件下,还是会有很多内容部分相同的网页被认为相同而被排除掉,因此要根据权重的分布比例调节a的大小。

以上5种算法运行的时候,算法的效果取决于N,就是关键词数目的选取。选的数量越多,判断就会越精确,但是随之而来的计算速度也会减慢下来。所以必须考虑一个计算速度和去重准确率的平衡。据天网试验结果,10个左右关键词最恰当。

1.4  随机映射(Random Projection)算法:

先给每个词语(Token)生成随机的特征向量,保存为一个集合,然后对网页正文进行分词,得到一系列的词语,从词语的特征向量集合中取出这些词语的特征向量(如果词语不在在集合中,那么给词语生成一个随机的特征向量,将其加入集合),将这些特征向量按位进行一个特殊的加运算,最后得到网页的特征向量。判断两个网页是否具有相似或重复内容就可以通过判断它们特征向量相同的位数(bit)来进行。

1.5  近似网页发现算法

首先,定义几个算法中用到的参数:

Percentage:允许参与生成指纹的关键词的比例。

Sum_interval:参与生成指纹的关键词个数的增长单位。

算法如下:

1、         对网页正文切词,生成网页正文的特征向量(已经去掉了停用词)

2、         将向量中保留的关键词按照词频排序,相同词频的关键词按照字符排序(从大到小)。

3、         在2中生成的关键词列表中选取前sum2 = sum1 * Percentage个关键词作为候选关键词。

4、         在3中生成的关键词列表中选取前sum3 = sum2 DIV Sum_interval * Sum_interval个作为参与生成指纹的关键词集合。

5、         将4中得到的关键词按照字符排序(从大到小),就得到了最终要生成指纹的字符串。

6、         以5中生成的字符串为源串调用MD5函数得到该网页的指纹。

指纹比较的过程中只要对网页的指纹值直接排序就可以将重复的网页聚到一起。

1.6

1、对于每一个xml文件去标记,得到文本内容并进行分词,生成分词后的语料库C;

2、 遍历语料库C,计算词语的IDF值;

3、 对于每一篇文档,保留其idf值较大的前70%,并降序排列,构成该文档的特征向量;

4、 计算任一文档的特征串的hash值,(拟用ELFhash),生成二元组<doc_id, hashvalue>。对具有相同hash值的文档,比较两个文档的特征串是否相同,如果相同,则是重合文档,否则不是重合文档。

简单说明:

a. hash函数的选择很关键,如果hash选择很好,时间复杂度为O(N), N为文档规模,最坏情况下所有特征串的hash值相等,则时间复杂度是 O(N*N);

b.我们添加了对同hash值文档的特征串进行比较,所以增加了时间复杂度;

经过几天编程方法已经实现,本方法相对对重复的要求更严格,内容完全重复的一定可以识别,另外对Hash函数的选择也很关键;

为了更好选择hash函数,做了以下实验,语料为1000个xml博客文件;

实际重复文档数:419

实际应该产生冲突数:419

ELFHash产生冲突数: 594  所用时间为:60s

RSHash产生冲突数:584    所用时间为:60S

JSHash产生冲突数:546    所用时间为:58S

PJWHash产生冲突数:594    所用时间为:61.4S

BKDRHash产生冲突数:601   所用时间为:64.5S

SDBMHash产生冲突数:546   所用时间为:61.5S

DJBHas产生冲突数:  595   所用时间为:66S

APHash产生冲突数:  543   所用时间为:57.1S

经以上实验,选用了APHash函数来处理重复文档检测
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值