网络爬虫之网页排重:语义指纹

引言:网络爬虫让我们高效地从网页获取到信息,但网页的重复率很高,网页需要按内容做文档排重,而判断文档的内容重复有很多种方法,语义指纹是其中比较高效的方法。
本文选自《网络爬虫全解析——技术、原理与实践》。

  现代社会,有效信息对人来说就像氧气一样不可或缺。互联网让有效信息的收集工作变得更容易。当你在网上冲浪时,网络爬虫也在网络中穿梭,自动收集互联网上有用的信息。
  自动收集和筛选信息的网络爬虫让有效信息的流动性增强,让我们更加高效地获取信息。随着越来越多的信息显现于网络,网络爬虫也越来越有用。
  不同的网站间转载内容的情况很常见。即使在同一个网站,有时候不同的URL地址可能对应同一个页面,或者存在同样的内容以多种方式显示出来,所以,网页需要按内容做文档排重。
  例如,一个企业商品搜索。搜商品名,有一家公司发的商品名字都一样,结果这家公司发的商品都显示在前面,但是要求一家企业只显示一条相似的商品在前面,可以把近似重复的文档权重降低,只保留一个文档不降低权重。
  判断文档的内容重复有很多种方法,语义指纹的方法比较高效。语义指纹是直接提取一个文档的二进制数组表示的语义,通过比较相等来判断网页是否重复。语义指纹是一个很大的数组,全部存放在内存会导致内存溢出,普通的数据库效率太低,所以采用内存数据库Berkeley DB。可以通过Berkeley DB判断该语义指纹是否已经存在。另外一种方法是通过布隆过滤器来判断语义指纹是否重复。
  提取网页语义指纹的方法是:从净化后的网页中,选取最有代表性的一组关键词,并使用该关键词组生成一个语义指纹。通过比较两个网页的语义指纹是否相同来判断两个网页是否相似。
  网络上一度出现过很多篇关于“罗玉凤征婚”的新闻报道,其中的两篇新闻内容对比如下表。
  

  对于这两篇内容相同的新闻,有可能提取出同样的关键词:“罗玉凤”“征婚”“北大”“清华”“硕士”,这就表示这两篇文档的语义指纹也相同。
  为了提高语义指纹的准确性,需要考虑到同义词,例如,“北京华联”和“华联商厦”可以看成相同意义的词。最简单的判断方法是做同义词替换。把“开业之初,比这还要多的质疑的声音环绕在北京华联决策者的周围”替换为“开业之初,比这还要多的质疑的声音环绕在华联商厦决策者的周围”。
  设计同义词词典的格式是:每行一个义项,前面是基本词,后面是一个或多个被替换的同义词,请看下面的例子。

华联商厦 北京华联 华联超市

  这样可以把“北京华联”或“华联超市”替换成“华联商厦”。对指定文本,要从前往后查找同义词词库中每个要替换的词,然后实施替换。同义词替换的实现代码分为两步。首先是查找Trie树结构的词典过程。

public void checkPrefix(String sentence,int offset,PrefixRet ret) {  if (sentence == null || root == null || "".equals(sentence)) {
    ret.value = Prefix.MisMatch;
    ret.data = null;
    ret.next = offset;
    return ;
  }
  ret.value = Prefix.MisMatch;//初始返回值设为没匹配上任何要替换的词
  TSTNode currentNode = root;
  int charIndex = offset;
  while (true) {    if (currentNode == null) {
          return;
    }
    int charComp = sentence.charAt(charIndex) - currentNode.splitchar;    if (charComp == 0) {
      charIndex++;      if(currentNode.data != null){
        ret.data = currentNode.data;//候选最长匹配词
        ret.value = Prefix.Match;
        ret.next = charIndex;
      }      if (charIndex == sentence.length()) {
        return; //已经匹配完
      }      currentNode = currentNode.eqKID;
    } else if (charComp < 0) {      currentNode = currentNode.loKID;
    } else {      currentNode = currentNode.hiKID;
    }
  }
}

  然后是同义词替换过程。

//输入待替换的文本,返回替换后的文本public static String replace(String content) throws Exception{  int len = content.length();
  StringBuilder ret = new StringBuilder(len);
  SynonymDic.PrefixRet matchRet = new SynonymDic.PrefixRet(null,null);  

  for(int i=0;i<len;){    //检查是否存在从当前位置开始的同义词
    synonymDic.checkPrefix(content,i,matchRet);    if(matchRet.value == SynonymDic.Prefix.Match) //如果匹配上,则替换同义词
    {
      ret.append(matchRet.data);//把替换词输出到结果
      i=matchRet.next;//下一个匹配位置
    }    else //如果没有匹配上,则从下一个字符开始匹配
    {
      ret.append(content.charAt(i));
      ++i;
    }
  }   return ret.toString();
}

  语义指纹生成算法如下所示。

  • 第1步:将每个网页分词表示成基于词的特征项,使用TF*IDF作为每个特征项的权值。地名、专有名词等,名词性的词汇往往有更高的语义权重。
  • 第2步:将特征项按照词权值排序。
  • 第3步:选取前n个特征项,然后重新按照字符排序。如果不排序,关键词就找不到对应关系。
  • 第4步:调用MD5算法,将每个特征项串转化为一个128位的串,作为该网页的指纹。

调用fseg.result.FingerPrint中的方法。

String fingerPrint = getFingerPrint("","昨日,省城渊明北路一名17岁的少年在6楼晾毛巾时失足坠楼,摔在楼下的一辆面包车上。面包车受冲击变形时吸收了巨大的反作用力能量,从而“救”了少年一命。目前,伤者尚无生命危险。据一位目击者介绍,事故发生在下午2时40分许,当时这名在某美发店工作的少年正站在阳台上晾毛巾,因雨天阳台湿滑而不小心摔下。 记者来到抢救伤者的医院了解到,这名少年名叫李嘉诚,今年17岁,系丰城市人。李嘉诚受伤后,他表姐已赶到医院陪护。据医生介绍,伤者主要伤在头部,具体伤情还有待进一步检查。");String md5Value = showBytes(getMD5(fingerPrint));
System.out.println("FingerPrint:"+fingerPrint+" md5:"+md5Value);

  MD5可以将字符串转化成几乎无冲突的hash值,但是MD5速度比较慢,MurmurHash或者JenkinsHash也可以生成冲突很少的hash值,在Lucene的企业搜索软件Solr1.4版本中提供了JenkinsHash实现的语义指纹,叫作Lookup3Signature。调用MurmurHash生成64位的Hash值的代码如下所示。

public static long stringHash64(String str, int initial) {  byte[] bytes = str.getBytes();  return MurmurHash.hash64(bytes, initial);
}

  本文选自《网络爬虫全解析——技术、原理与实践》,点此链接可在博文视点官网查看此书。
                    
  想及时获得更多精彩文章,可在微信中搜索“博文视点”或者扫描下方二维码并关注。
                       

此外,本周正在进行一项热门活动——《尽在双11》阿里专家问答!
《尽在双11》的作者乐田、仁重正通过开源问答来答复读者有关《尽在双11》这本书的疑问~
更多好问题,期待你来问!

时间: 2024-08-05 19:24:22

网络爬虫之网页排重:语义指纹的相关文章

Java 网络爬虫获取网页源代码原理及实现

Java 网络爬虫获取网页源代码原理及实现 1.网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成.传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件. 2.那么程序获取网页的原理到底是怎么回事呢?看下面的图:客服端首先向服务器端发出Http请求,之后服务器端返回相应的结果或者请求超时客户端自己报错. 服务器端发出的Http请求,实际上说是对服务器的文件的请求

Python网络爬虫之网页抓取(一)

网络爬虫,我们可以把它理解为在网络上面爬行的一只蜘蛛,互联网就比如一张大网,而爬虫就像一只蜘蛛在这上面爬来爬去, 遇到资源它就可以把它抓取下来. 在浏览器中输入一个网址,即打开一个网页后,我们可以看到这个页面上有好多文字.图片等,这个过程其实就是用户输入一个网址后,向服务器发出了一个请求,服务器经过解析后,发送给浏览器HTML.JS.CSS等文件,浏览器解析后,就出现了许许多多的文字.图片等.因此,我们看到的网页实质是由HTML代码构成的,只不过经过浏览器的解释后,将这些代码隐藏起来了:爬虫要爬

开源网络爬虫汇总

Awesome-crawler-cn 互联网爬虫,蜘蛛,数据采集器,网页解析器的汇总,因新技术不断发展,新框架层出不穷,此文会不断更新... 交流讨论 欢迎推荐你知道的开源网络爬虫,网页抽取框架. 开源网络爬虫QQ交流群:322937592 email address: liinux at qq.com Python Scrapy - 一种高效的屏幕,网页数据采集框架. django-dynamic-scraper - 基于Scrapy内核由django Web框架开发的爬虫. Scrapy-R

[Search Engine] 搜索引擎技术之网络爬虫

随着互联网的大力发展,互联网称为信息的主要载体,而如何在互联网中搜集信息是互联网领域面临的一大挑战.网络爬虫技术是什么?其实网络爬虫技术就是指的网络数据的抓取,因为在网络中抓取数据是具有关联性的抓取,它就像是一只蜘蛛一样在互联网中爬来爬去,所以我们很形象地将其称为是网络爬虫技术.其中网络爬虫也被称为是网络机器人或者是网络追逐者. 网络爬虫技术是搜索引擎架构中最为根本的数据技术,通过网络爬虫技术,我们可以将互联网中数以百亿计的网页信息保存到本地,形成一个镜像文件,为整个搜索引擎提供数据支撑. 1.

nutch从搜索引擎到网络爬虫

人物介绍 姓名:DougCutting 个人名望:开发出开源全文检索引擎工具包Lucene. 个人简介/主要荣誉:除了 Lucene,还开发了著名的网络爬虫工具 Nutch,分布式系统基础架构Hadoop,这些大师级作品都是开源的.目前任职 Apache 软件基金会主席. 网络上对 Doug Cutting 的评价:“他开发出卓越超群的全文检索引擎工具包(Lucene/Solr)以及为世界打开了一扇通往大数据的大门.”“开源的Lucene 以及 Hadoop 为全球创造了无数的财富以及就业机会.

[Python]网络爬虫(一):抓取网页的含义和URL基本构成

一.网络爬虫的定义 网络爬虫,即Web Spider,是一个很形象的名字. 把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛.网络蜘蛛是通过网页的链接地址来寻找网页的. 从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址, 然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页都抓取完为止. 如果把整个互联网当成一个网站,那么网络蜘蛛就可以用这个原理把互联网上所有的网页都抓取下来. 这样看来,网络爬虫就是一个爬行程序,一个抓取

网络爬虫:使用多线程爬取网页链接

前言: 经过前面两篇文章,你想大家应该已经知道网络爬虫是怎么一回事了.这篇文章会在之前做过的事情上做一些改进,以及说明之前的做法的不足之处. 思路分析: 1.逻辑结构图 上图中展示的就是我们网络爬虫中的整个逻辑思路(调用Python解析URL,这里仅仅作了简略的展示). 2.思路说明: 首先.我们来把之前思路梳理一下.之前我们採用的两个队列Queue来保存已经訪问过和待訪问的链接列表,并採用广度优先搜索进行递归訪问这些待訪问的链接地址.并且这里使用的是单线程操作. 在对数据库的操作中.我们加入了

网络爬虫初步:从访问网页到数据解析

前言: 网络爬虫这个东西看上去还是很神奇的.不过,如果你细想,或是有所研究就知道,其实爬虫并不那么高深.高深的是在我们的数据量很大的时候,就是当我们网络"图"的回环越来越多的时候,应该怎么去解决它. 本篇文章在这里只是起一个抛砖引玉的作用.本文主要是讲解了如何使用Java/Python访问网页并获得网页代码.Python模仿浏览器进行访问网页和使用Python进行数据解析.希望我们以本文开始,一步一步解开网络蜘蛛神秘的一面. 参考: 1.<自己动手写网络爬虫> 2.用pyt

[转]网络爬虫(一):抓取网页的含义和URL基本构成

一.网络爬虫的定义 网络爬虫,即Web Spider,是一个很形象的名字. 把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛.网络蜘蛛是通过网页的链接地址来寻找网页的. 从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址, 然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页都抓取完为止. 如果把整个互联网当成一个网站,那么网络蜘蛛就可以用这个原理把互联网上所有的网页都抓取下来. 这样看来,网络爬虫就是一个爬行程序,一个抓取