`
qindongliang1922
  • 浏览: 2184579 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7265517b-f87e-3137-b62c-5c6e30e26109
证道Lucene4
浏览量:117549
097be4a0-491e-39c0-89ff-3456fadf8262
证道Hadoop
浏览量:125937
41c37529-f6d8-32e4-8563-3b42b2712a50
证道shell编程
浏览量:59934
43832365-bc15-3f5d-b3cd-c9161722a70c
ELK修真
浏览量:71309
社区版块
存档分类
最新评论

网页去重思路浅析(一)

    博客分类:
  • JAVA
阅读更多

最近,由于工作需要,需要对爬虫爬下来的网页数据进行相似度去重。

那么问题来了,为什么要去重?
爬虫采集的数据可能来自各个网站,比如一个热门新闻,可能网易,搜狐,新浪,都有转载报道,如果不做任何措施,那么存储到库里就是3条数据,当然这仅仅是一个例子,假如,你有几TB或PB的数据,如果还这样,那么你的库可能有30%都是大量的重复数据,这些重复数据,一般不会给你带来任何价值,而且会占用大量的存储空间,查询和计算性能。所以这些然并卵的数据,还是需要考虑一下去重删减的步骤。

其实去重是一件说复杂也非常复杂的事情,说简单也是一件非常简单的事情。不同的情景下,可能处理的规则也是不一样,所以还得因地制宜。

大部分情况,去重一般分为如下几个步骤,网上找了个图,比较直接,如下所示:





其中分几个步骤:
(1)正文抽取: 尽可能的保留文档主要信息,抛弃无关紧要的信息,一般而言,定向采集的内容会比较准确,非定向采集的内容需要考虑
如何拿到文档的主要信息,不让噪音,影响数据去重质量。


(2)特征抽取:
一般会使用分词算法,通过tf-idf词频得到前topN个特征词,当前在这之前是需要把一些禁用词给去掉的,这种方式比较
粗糙,相对来说,比较适合大部分网页数据,另外一种方式,就是培训语料库特征词,并给与权重,比如汽车这个词,在不同的类别的文章中是不一样的权重,然后分词完后,提取这些特征词,这些特征词并不一定会和前n个高频词一致,这种方式适合已知比较精确的行业或定向采集的爬虫数据里。

(3)生成指纹:其实如果数据量很小,那么完全没必要生成指纹,直接拿着特征词与库里已经有的数据的特征词做对比,求相似度即可,具体步骤:两两做比较时,把他们的特征词的共同部分提取出来个数/特征词个数多的总数,得到即为相似度,当然这是最简单有效的,而且准确率一般比较高,但是这种这种方式不太适合海量数据的去重,因为中间涉及的计算的部分太多了,所以就有了指纹一说,有了指纹以后,比较简单粗暴的方式,直接对特征词合并做md5,然后当成一个字段,存储进去,此列做索引,然后新增数据,就是判断有没有重复,比较高效,但有一定几率误杀,如果有其他能够解析的业务字段作为辅助,则比较好,最后一种方法,就是类似于google的simhash(局部敏感hash)的做法,对每个特征做加权hash映射,并降维为32或者64位特征向量,来形成指纹,最后使用海明距离来求相似度,所为海明距离,举个例子:010011和010000的海明距离就为2,其实就是求同位数0和1的差异为有多少,google的网页去重,映射向量64位特征,求海明距离3之内的文档,就是非常接近重复的数据了。当然这种方式,也是需要遍历全库做比较的,效果比较适合长文本,短文本貌似特性提取比较不太好,性能方面,没有测过,不过貌似效率还是非常高的,值得探究。



(4)以上几步大致就是通用的网页去重套路了,当然每步都可以有多种定制实现思路,与自己的业务结合,找到最优的去重策略。


最后欢迎大家扫码关注微信公众号:我是攻城师(woshigcs),我们一起学习,进步和交流!(woshigcs)
本公众号的内容是有关搜索和大数据技术和互联网等方面内容的分享,也是一个温馨的技术互动交流的小家园,有什么问题随时都可以留言,欢迎大家来访!



  • 大小: 153.5 KB
1
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics