zl程序教程

您现在的位置是:首页 >  前端

当前栏目

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

网页爬虫网络 语义 指纹
2023-09-11 14:15:57 时间

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

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

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

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

这样可以把“北京华联”或“华联超市”替换成“华联商厦”。对指定文本,要从前往后查找同义词词库中每个要替换的词,然后实施替换。同义词替换的实现代码分为两步。首先是查找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 ){

 //检查是否存在从当前位置开始的同义词

 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》这本书的疑问~
更多好问题,期待你来问!


Python爬虫网页IP被封的问题分析 如果你在爬虫过程中有遇到“您的请求太过频繁,请稍后再试”,或者说代码完全正确,可是爬虫过程中突然就访问不了,那么恭喜你,你的爬虫被对方识破了,轻则给予友好提示警告,严重的可能会对你的ip进行封禁,所以代理ip那就尤为重要了。今天我们就来谈一下代理IP,去解决爬虫被封的问题。
实现网络图片爬虫,只需5秒快速把整个网页上的图片全下载打包zip 我们经常需要用到互联网上的一些共享资源,图片就是资源的一种,怎么把网页上的图片批量下载下来?有时候我们需要把网页上的图片下载下来,但网页上图片那么多,怎么下载我们想要的东西呢,如果这个网页都是我们想要的图片,难道我们要一点一点一张一张右键下载吗? 当然不好,这里提供一段Java实现的网络爬虫抓图片代码,程序员同志有喜欢的记得收藏哦, 材料:必须会java开发,用到的核心jar Jsoup自己去网上下载很多。
还在辛辛苦苦的查找网页规律,写正则或者其他方式去匹配文本内容吗?还在纠结怎么去除小说网站的其他字符吗? 先来看看下面2张图,都是某小说网站的小说内容
最近有点时间在玩爬虫,看到网上很多喜欢的照片、电源以及图书等资源,心想能不能通过所学的Python技术把它给拿下来并保存在文件夹中,网上找了一下资料。发现,可以通过网络爬虫技术将网络上的资源下载下来,爬虫之路即将开始,现将手记做下记录。
java爬虫HttpURLConnect获取网页源码 public abstract class HttpsURLConnection extends HttpURLConnection HttpsURLConnection 扩展 HttpURLConnection,支持各种特定于 https 功能。