`
diddyrock
  • 浏览: 45293 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论
阅读更多
n版本 0.9
n采用了 OPIC算法来实现
目前网络上的排序算法都是依托图论来实现对整个互联网页面的排序,起基本的思想有以下几点:将互联网表示为一个图G,用矩阵L来描述,其中L非负,如果在L中的两点(i,j)存在链接,那么L|(i,j)|>0,google直接认为如果存在链接,那么d(i,j)=外链的倒数。
剩下的就是一堆md所谓的数学推导,其实基本上离不开d(i,j)这个鸟概念,对于函数实现主要就是搞搞d(ij)
n 中的 OPIC算法主要就是基于d(i,j)这个概念出发,构建了L矩阵,将整个爬到的网页分为n个节点,每个节点分配一个cash值一个history值,cash值在初始分配的时候被n设置为1,然后在抓取到了网页之后,score=history = sum(links[i].cash),即修改history值为所有其他外链的cash值之和,修改之后,将外链的cash值置为当前score/validLinkNumber,即将其本身的cash再分配给其他的网页,不过原论文里面在这里会将当前页面cash值置零,而n并没有,nutch用了一个score同时充当了history和cash,这样搞下去好像有点诡异,因为在爬行中cash的总数会增多,估了一下大概是2倍的增量关系,增量就会传递错误,但是如果确保爬行的次数和完整性,后面的增加的网页又会将错误降低。就opic算法而言,其最终目的是证明在无限次爬行和等概率redirect情况下,网页的重要性大致等于history除以所有网页的history之和,在nutch中,只要保证被爬行的次数的增多话,其score一定是向上提高的,而且越多次迭代之后,其在整个拓扑中的排序应该是可靠的(只是一种直觉哈,我也给不出完备的数学证明),反正就是一个针对链接的算法。看了nutch的实现,发现工程和论文还是有差别的,一般论文都是数学上异常复杂吹牛逼吹的很圆,而我们如果自己实现论文算法,特别是某些领域,编程时候拍拍脑袋,方向上和论文一致就可以了,很复杂的算法也许可以简单实现,效果也不一定差啊(也没见谁去抱怨怀疑nutch,不过nutch排序算法实现程序确实没有人愿意署名倒是了:)),继续日之~。
贴段代码,这个实现的确很简单,opic算法可以去查看http://www2003.org/cdrom/papers/refereed/p007/p7-abiteboul.html
float adjust = 0.0f;
    for (int i = 0; i < inlinked.size(); i++) {
      CrawlDatum linked = (CrawlDatum)inlinked.get(i);
      adjust += linked.getScore();
    }
    if (old == null) old = datum;
    datum.setScore(old.getScore() + adjust);
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics