1. Nutch 1.3 的页面评分机制

Nutch1.3目前默认还是使用OPIC作为其网页分数算法,但其之后,已经引入了PageRank-like算法,以弥补OPIC算法的不足,目前OPIC算法还是作为Nutch中ScoreFilter扩展点的一个扩展来实现的,而新的LinkRank算法有一个叫做org.apache.nutch.scoring.webgraph的包来对网页进行分数计算,它可以解决OPIC解决不了的问题,一个是重复地抓取页面,会引起那些被抓取的页面重要性增加;另一个是同时新添加的页面必须进行抓取,这样会使整个网络的总cash流通量增加,这样会造成那些没有重复抓取的页面重要性降低。

2. 什么是OPIC算法及其特点

下面内容来自[http://www.endless-loops.com/2011/03/nutch%E6%BA%90%E7%A0%81%E4%B8%AD%E7%9A%84%E9%93%BE%E6%8E%A5%E5%88%86%E6%9E%90%E7%AE%97%E6%B3%95-497.html]

OPIC算法是针对静态图的。OPIC算法的基本思想是:每个页面都有一个初始的cash,在抓取某页面时,该页面的cash会平均地分配到其所接向的页面,总的整个网络图中总的cash量是个定值,在抓取网页的过程这些一定量的cash在页面之间流通,很直观地,OPIC算法中页面的重要性就定义为流通过程中流过该页面的cash的总量在总流通量中占的比重。

对于每个网面(图中的结点),OPIC算法维护两个值cash与history,cash是网页当前的cash值,history表示的则是该网页从OPIC算法开始到最后一次被抓取,获得的cash的总和。cash的初始值一般为1/n (n为网页总数),history初始值为0。

OPIC算法使用两个向量C[1,…,n] 和H[1,…,n]分别表示各个网页的cash值和history值,为了优化算法,还引入一个变量G,使每一次抓取网页时都有G=|H|=∑i H[i],原论文中OPIC算法的伪代码如下:

  1. OPIC:    
  2.     On-line Page Importance Computation    
  3.     for each i let C[i] := 1/n ;    
  4.     for each i let H[i] := 0 ;    
  5.     let G:=0 ;    
  6.     do forever    
  7.     begin    
  8.      choose some node i ;    
  9.      %% each node is selected    
  10.      %% infinitely often    
  11.      H[i] += C[i];    
  12.      %% single disk access per page    
  13.      for each child j of i,    
  14.      do C[j] += C[i]/out[i];    
  15.      %% Distribution of cash    
  16.      %% depends on L    
  17.      G += C[i];    
  18.      C[i] := 0 ;    
  19.     end    

OPIC算法的几个问题:
1.无外向链接的sink页面处理:
 OPIC算法中有个虚拟网页 (virtual page)的概念,虚拟网页与所有网页之间都有双向链接。
2.收敛性:
OPIC算法将网页重要性的计算集成到了网页抓取的过程中,OPIC算法依赖于反复的抓取,一个重要的问题就是(*)式的值在页面反复抓取过程中是收敛的,只有确保这一点算法才是正确有意义的,关于收敛性的证明,原论文里有严密的证明,这里只提示一下。
3.抓取策略
上面提到OPIC算法依赖于反复抓取,那么抓取策略就是个重要问题了,抓取策略直接影响网面重要性(*)式的收敛速度,事实上,理论与实验都证明贪心法中是最好的策略,即优先抓取那些cash值高的页面。

为了解决OPIC算法的收敛性问题,后来有人提出了Adaptive OPIC算法,它主要引一个时间窗(time window)的概念,它的点主要在于将网页重要性的计算集成到网页抓取的过程中了,简化了模型,简化了网页重要性值的求解。

3. OPIC在NUTCH中的应用

在Nutch1.3的源码org.apache.nutch.scoring.opic包OPICScoringFilter类的注释里提到Nutch实现的链接分析算法是基于《Adaptive On-Line Page Importance Computaion》。Nutch把它做为一个ScoringFilter插件来对付,也就是说用户可以扩展自已的分数算法,
   其中ParseOutputFormat是用来为计算分数做准备,而FetchOutputFormat中的RecordWriter集成了ParseOutputFormat,抓取解析后的网页都会通过ParseOutputFormat生成的RecordWriter写出去,而这个计算OPIC的方法就是在这个RecordWriter中调用的。

4. Nutch OPIC源代码分析

下面是OPICScoringFIlter的distributeScoreToOutlinks方法。源代码如下:

  1.   float score = scoreInjected; //得到插入的分数,不过好像没用  
  2. // 得到解析后初始化的分数,这个分数在FetchThread在对网页解析之前进行了设置  
  3. // scfilters.passScoreBeforeParsing(key, datum, content);  
  4.     String scoreString = parseData.getContentMeta().get(Nutch.SCORE_KEY);  
  5.     if (scoreString != null) {  
  6.       try {  
  7.         score = Float.parseFloat(scoreString);  
  8.       } catch (Exception e) {  
  9.         e.printStackTrace(LogUtil.getWarnStream(LOG));  
  10.       }  
  11.     }  
  12.     // 得到有效的网页个数  
  13.     int validCount = targets.size();  
  14.     if (countFiltered) {  
  15.       score /= allCount;  
  16.     } else {  
  17.       if (validCount == 0) {  
  18.         // no outlinks to distribute score, so just return adjust  
  19.         return adjust;  
  20.       }  
  21.       score /= validCount;  
  22.     }  
  23.     // internal and external score factor  
  24.     float internalScore = score * internalScoreFactor; // 设置内链接的分数值,乘以一个内链接的权重因子,默认为1.0f  
  25.     float externalScore = score * externalScoreFactor; // 设置外链接的分数值,乘以一个外链接的权重因子,默认为1.0f  
  26.     for (Entry<Text, CrawlDatum> target : targets) {  
  27.       try {  
  28.         String toHost = new URL(target.getKey().toString()).getHost();  
  29.         String fromHost = new URL(fromUrl.toString()).getHost();  
  30.         if(toHost.equalsIgnoreCase(fromHost)){  
  31.           target.getValue().setScore(internalScore);    // 设置内链接的贡献值  
  32.         } else {  
  33.           target.getValue().setScore(externalScore);    // 设置外链接的贡献值  
  34.         }  
  35.       } catch (MalformedURLException e) {  
  36.         e.printStackTrace(LogUtil.getWarnStream(LOG));  
  37.         target.getValue().setScore(externalScore);  
  38.       }  
  39.     }  
  40.     // XXX (ab) no adjustment? I think this is contrary to the algorithm descr.  
  41.     // XXX in the paper, where page "loses" its score if it's distributed to  
  42.     // XXX linked pages...  
  43.     return adjust;  
  44.   }  

5. 总结

在网页抓取中,排序算法的好坏直接影响到搜索引擎出现的更新结果,特点是在聚焦爬虫中更是这样。可能在Nutch 2.0以后就不会用OPIC,而是使用新的评分功能,在org.apache.nutch.scoring.webgraph中可以发现。

6. 参考

[1] Fixing the OPIC algorithm in Nutch  http://wiki.apache.org/nutch/FixingOpicScoring
[2] Abiteboul et al., 2003  http://www2003.org/cdrom/papers/refereed/p007/p7-abiteboul.html
[3] http://www.endless-loops.com/2011/03/nutch%E6%BA%90%E7%A0%81%E4%B8%AD%E7%9A%84%E9%93%BE%E6%8E%A5%E5%88%86%E6%9E%90%E7%AE%97%E6%B3%95-497.html
[4] http://wiki.apache.org/nutch/FixingOpicScoring

作者:http://blog.csdn.net/amuseme_lu


相关文章阅读及免费下载:

Apache Nutch 1.3 学习笔记目录

Apache Nutch 1.3 学习笔记一

Apache Nutch 1.3 学习笔记二

Apache Nutch 1.3 学习笔记三(Inject)

Apache Nutch 1.3 学习笔记三(Inject CrawlDB Reader)

Apache Nutch 1.3 学习笔记四(Generate)

Apache Nutch 1.3 学习笔记四(SegmentReader分析)

Apache Nutch 1.3 学习笔记五(FetchThread)

Apache Nutch 1.3 学习笔记五(Fetcher流程)

Apache Nutch 1.3 学习笔记六(ParseSegment)

Apache Nutch 1.3 学习笔记七(CrawlDb - updatedb)

Apache Nutch 1.3 学习笔记八(LinkDb)

Apache Nutch 1.3 学习笔记九(SolrIndexer)

Apache Nutch 1.3 学习笔记十(Ntuch 插件机制简单介绍)

Apache Nutch 1.3 学习笔记十(插件扩展)

Apache Nutch 1.3 学习笔记十(插件机制分析)

Apache Nutch 1.3 学习笔记十一(页面评分机制 OPIC)

Apache Nutch 1.3 学习笔记十一(页面评分机制 LinkRank 介绍)

Apache Nutch 1.3 学习笔记十二(Nutch 2.0 的主要变化)

更多《Apache Nutch文档》,尽在开卷有益360 http://www.docin.com/book_360

转载于:https://www.cnblogs.com/ibook360/archive/2011/10/24/2222181.html

Apache Nutch 1.3 学习笔记十一(页面评分机制 OPIC)相关推荐

  1. Apache Nutch 1.3 学习笔记十一(页面评分机制 LinkRank 介绍)

    下面是Google翻译的http://wiki.apache.org/nutch/NewScoring内容,是关于Nutch 新的链接分数算法的说明,有点类似于Google的PageRank,这里有其 ...

  2. Apache Nutch 1.3 学习笔记十(插件机制分析)

    1. 一些对象说明 PluginRepository:这是一个用于存储所有插件描述对象(PluginDescriptor),插件扩展点(ExtensionPoint)和被激活的插件. PluginDe ...

  3. Apache Nutch 1.3 学习笔记目录

    目录 Apache Nutch 1.3 学习笔记一 Apache Nutch 1.3 学习笔记二 Apache Nutch 1.3 学习笔记三(Inject) Apache Nutch 1.3 学习笔 ...

  4. Vue学习笔记(十一)

    1.Vue学习笔记(十一) 文章目录 1.Vue学习笔记(十一) 1.1Vue_配置代理_方式 1.1.0演示问题 1.1.1运行node server1 1.1.2运行node server2 1. ...

  5. 微信小程序开发:学习笔记[8]——页面跳转及传参

    微信小程序开发:学习笔记[8]--页面跳转及传参 页面跳转 一个小程序拥有多个页面,我们可以通过wx.navigateTo推入一个新的页面.在首页使用2次wx.navigateTo后,页面层级会有三层 ...

  6. 吴恩达《机器学习》学习笔记十一——应用机器学习的建议

    吴恩达<机器学习>学习笔记十一--应用机器学习的建议 一.训练完模型后下一步要做什么 二.评估算法与模型选择 1.训练集与测试集 2.训练/测试步骤 3.模型选择 4.数据集新的划分--验 ...

  7. 吴恩达《机器学习》学习笔记十一——神经网络代码

    吴恩达<机器学习>学习笔记十一--神经网络代码 数据准备 神经网络结构与代价函数· 初始化设置 反向传播算法 训练网络与验证 课程链接:https://www.bilibili.com/v ...

  8. ROS学习笔记十一:ROS中数据的记录与重放

    ROS学习笔记十一:ROS中数据的记录与重放 本节主要介绍如何记录一个正在运行的ROS系统中的数据,然后在一个运行的系统中根据记录文件重新产生和记录时类似的运动情况.本例子还是以小海龟例程为例. 记录 ...

  9. Linux C/C++ 开发(学习笔记十一 ):TCP服务器(并发网络网络编程 一请求一线程)

    Linux C/C++ 开发(学习笔记十一 ):TCP服务器(并发网络网络编程 一请求一线程) 一.TCP服务器(一请求一线程) 的原理 二.完整代码 三.测试 四.补充 一.TCP服务器(一请求一线 ...

最新文章

  1. 最常用 150 个Linux命令汇总(建议收藏)
  2. MetaPhlAn2-增强版宏基因组分类谱工具
  3. 使用JVisualVM远程监控Tomcat
  4. matlab内将数组内所有数累乘,数学实验上机汇总【未完成】
  5. win7系统怎样打开音频服务器,win7系统打开音频管理器的具体教程
  6. 2018-2019 20165226 Exp9 Web安全基础
  7. ARM再出手,软银攀登新高山
  8. service nginx start启动nginx出现Failed to start nginx.service:unit not found
  9. Linux 双网卡绑定方法
  10. 普开数据第15届全国高校师资班(青海西宁)
  11. opencv常用函数整理(二)
  12. 第5讲 zend原理深度剖析
  13. php怎么异步执行,php怎么实现异步
  14. 解微分方程数值解法(理论部分)
  15. asm bin hex elf文件区别
  16. 软件工程-基本流程图
  17. Java--反射机制
  18. Memory基本debug指令与基础知识(一)
  19. 支付宝里程怎么用 支付宝里程兑换在哪里
  20. 堆的简单应用——TopK

热门文章

  1. Android Studio 一些方便使用的设置
  2. (笔试题)将数组分成两组,使两组的和的差的绝对值最小
  3. 火狐不支持event.keyCode,用jquery中的event.which轻松解决。
  4. Vue 脚手架CLI 初始化项目
  5. 自定义关键字_Java项目实践,如何获取自定义sql里的表名及关键字段
  6. idea2019中文版
  7. Python学习并发与多线程
  8. Centos7.5.1804永久生效修改主机名
  9. 【Codeforces Round #430 (Div. 2) D】Vitya and Strange Lesson
  10. mkisofs简单定制linux iso