Nutch 1.3 学习笔记 11-1 页面评分机制 OPIC
--------------------------------------
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算法的伪代码如下:
view plain
引用
OPIC:
On-line Page Importance Computation
for each i let C[i] := 1/n ;
for each i let H[i] := 0 ;
let G:=0 ;
do forever
begin
choose some node i ;
%% each node is selected
%% infinitely often
H[i] += C[i];
%% single disk access per page
for each child j of i,
do C[j] += C[i]/out[i];
%% Distribution of cash
%% depends on L
G += C[i];
C[i] := 0 ;
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方法。源代码如下:
view plain
float score = scoreInjected; //得到插入的分数,不过好像没用
// 得到解析后初始化的分数,这个分数在FetchThread在对网页解析之前进行了设置
// scfilters.passScoreBeforeParsing(key, datum, content);
引用
String scoreString = parseData.getContentMeta().get(Nutch.SCORE_KEY);
if (scoreString != null) {
try {
score = Float.parseFloat(scoreString);
} catch (Exception e) {
e.printStackTrace(LogUtil.getWarnStream(LOG));
}
}
// 得到有效的网页个数
int validCount = targets.size();
if (countFiltered) {
score /= allCount;
} else {
if (validCount == 0) {
// no outlinks to distribute score, so just return adjust
return adjust;
}
score /= validCount;
}
// internal and external score factor
float internalScore = score * internalScoreFactor; // 设置内链接的分数值,乘以一个内链接的权重因子,默认为1.0f
float externalScore = score * externalScoreFactor; // 设置外链接的分数值,乘以一个外链接的权重因子,默认为1.0f
for (Entry<Text, CrawlDatum> target : targets) {
try {
String toHost = new URL(target.getKey().toString()).getHost();
String fromHost = new URL(fromUrl.toString()).getHost();
if(toHost.equalsIgnoreCase(fromHost)){
target.getValue().setScore(internalScore); // 设置内链接的贡献值
} else {
target.getValue().setScore(externalScore); // 设置外链接的贡献值
}
} catch (MalformedURLException e) {
e.printStackTrace(LogUtil.getWarnStream(LOG));
target.getValue().setScore(externalScore);
}
}
// XXX (ab) no adjustment? I think this is contrary to the algorithm descr.
// XXX in the paper, where page "loses" its score if it's distributed to
// XXX linked pages...
return adjust;
}
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
分享到:
相关推荐
- **页面评分机制**:Nutch支持多种页面评分算法,如OPIC和LinkRank,这些机制有助于提高搜索结果的相关性和质量。学习笔记第11章提供了OPIC和LinkRank的具体实现细节。 - **Nutch 2.0的主要变化**:学习笔记的最后...
Nutch1.3是其一个稳定版本,提供了强大的爬虫功能和可扩展性。MyEclipse(这里误写为myclipse)是基于Eclipse的一款集成开发环境(IDE),尤其适合Java开发,支持多种Java应用的创建、调试和部署。本教程将详细介绍...
配置好的Nutch1.3开发环境,解压后直接导入Eclipse Workspace即可,调试通过,默认爬163两层,解决Eclipse3.6+版本无基于源码创建工程选项问题
这个源码包 "apache-nutch-1.3-src.tar.gz" 和 "nutch-1.3.tar.gz" 包含了 Nutch 1.3 的源代码和编译后的二进制文件,对于开发者和研究者来说是非常有价值的资源。 **Nutch 概述** Nutch 是基于 Java 开发的,遵循 ...
Nutch-1.3 版本是该项目的一个稳定版本,主要由 Java 语言编写,提供了丰富的功能和良好的可扩展性。 在 Nutch-1.3 的源码中,我们可以深入理解其工作原理和核心组件。源码分析可以帮助我们掌握以下关键知识点: 1...
Nutch是一个由Java实现的,刚刚诞生开放源代码(open-source)的web搜索引擎。 尽管Web搜索是漫游Internet的基本要求, 但是现有web搜索引擎的数目却在下降. 并且这很有可能进一步... Nutch目前最新的版本为version1.3。
Nutch 插件机制是其核心功能之一,它允许开发者轻松地扩展Nutch的功能,以适应不同的数据处理需求。Nutch 是一个开源的网络爬虫项目,主要用于收集、索引和搜索互联网上的信息。通过插件机制,Nutch可以处理各种不同...
### Nutch插件机制详解 #### 一、引言 Nutch是一款开源的网络爬虫项目,能够自动抓取互联网上的网页并建立索引。为了提高系统的灵活性、可扩展性和可维护性,Nutch采用了插件化的设计思路,即通过一系列可插拔的...
nutcher 是 Apache Nutch 的中文教程,在... Nutch流程控制源码详解(bin/crawl中文注释版) Nutch教程——URLNormalizer源码详解 Nutch参数配置——http.content.limit 文档截图:
本教程将详细介绍如何搭建Nutch 1.2的Web开发环境,因为从Nutch 1.3版本开始,Web界面部分已被移除。 首先,我们需要理解Nutch的工作流程,它主要包括五个主要步骤:抓取、解析、索引、查询和排名。Nutch提供了强大...
Nutch的评分机制不仅考虑了页面的相关性,还可能涉及权威性、链接结构等多种因素。 - **Searcher(搜索器)**:提供用户界面,接受用户输入的查询请求,并从索引库中检索相关信息,返回最匹配的结果列表。 #### ...
Nutch是一个优秀的开放源代码的Web搜索引擎。虽然Nutch的页面排序方法比较合理,但是很多情况下仍然不能 满足需要。分析开源搜索引擎Nutch代码,研究了Nutch的页面排序方法。在Nutch原有的结构基础上提出了3种修改...
Nutch各个配置项的详细说明,非常详细的说明了每一项
1.3 nutch的目标..1 1.4 nutch VS lucene.....2 2. nutch的安装与配置.....3 2.1 JDK的安装与配置.3 2.2 nutch的安装与配置........5 2.3 tomcat的安装与配置......5 3. nutch初体验7 3.1 爬行企业内部网....7 3.1.1...
四、Nutch工作流详解 Nutch的工作流程包括多个步骤,如生成段(Segments)、迭代抓取(Fetch)、解析(Parse)、更新链接数据库(Update)、生成新的种子(Generate)、选择待抓取页面(Select)、重定向处理(Fetch...
Apache Nutch 是一个开源的网络爬虫框架,用于抓取互联网上的网页并生成索引,以便于搜索引擎使用。本文将详细介绍如何在Windows环境下配置Nutch 1.4,并使用Eclipse进行开发。以下是你需要知道的关键步骤: 1. **...