网页数据的预处理部分略过不提,假设我们已经得到了链接对,并且给前链赋上PR初值(规模较小时,初值0.5效果已经不错)。对于迭代过程的Map/Reduce可以用伪码(Pseudo)表示如下:
Mapper函数的伪码:
input <PageN, RankN> -> PageA, PageB, PageC ... // 链接关系
begin
Nn := the number of outlinks for PageN;
for each outlink PageK
output PageK -> <PageN, RankN/Nn>
// 同时输出链接关系,用于迭代
output PageN -> PageA, PageB, PageC ...
end
Mapper的输出如下(已经排序,所以PageK的数据排在一起,最后一列则是链接关系对):
PageK -> <PageN1, RankN1/Nn1>
PageK -> <PageN2, RankN2/Nn2>
...
PageK -> <PageAk, PageBk, PageCk>
Reduce函数的伪码:
input mapper's output // 如上面的说明
begin
RankK := 0;
for each inlink PageNi
RankK += RankNi/Nni * beta
// output the PageK and its new Rank for the next iteration
output <PageK, RankK> -> <PageAk, PageBk, PageCk...>
end
至此,Map/Reduce函数就完成,我们只需要不断迭代,直接其收敛就可以。收敛函数简单的判定方法可以选择前后两次计算的PR值的误差绝对值之和小于一定阈值。
上面这个Map/Reduce是最基本的方法,具体实践中还有很大的优化空间。关于优化算法留待具体工作中再做考虑。
转载自:http://hi.baidu.com/internetview/blog/item/579ebf00204f06da267fb531.html