经过网上的学习,自己写个demo,试试这个算法。
如图,页面的连接示意图。
首先定义PageEntity类,代表页面。public class PageEntity { /* 页面的路径 */ private String path; /* 页面内容 */ private String content; /* 外链(本页面链向其它页面)*/ private List utLinks = new ArrayList(); /* 内链(其它页面链向本页面)*/ private List inLinks = new ArrayList(); /* 本页面的PageRank值 */ private double pr;再定义测试类,这个类包括pagerank的算法public class PageRankDemo { /* 阈值 */ public static double MAX = 0.00000000001; /* 阻尼系数 */ public static double alpha = 0.85; 。。。。。。。。 public static void main(String[] args) { //加载要进行计算的页面,将pageMap,pageList,init等进行初始化。 //PageEntity的pr属性无值外,其它属性已经初始化完毕。 loadHtmlPages(); //使用PageRank算法对pr进行初始化 pr = doPageRank();
//进行Pagerank计算,只要值超出界限,就停止计算,保留结果。 while (!(checkMax())) { System.arraycopy(pr, 0, init, 0, init.length); pr = doPageRank(); }
//将pr值保存到对应的页面对象中 for (int i = 0; i < pr.length; i++) { PageEntity pe = pageList.get(i); pe.setPr(pr);
}
。。。。。。。。
具体的算法实现:
private static double[] doPageRank() {
double[] pr = new double[init.length];
for (int i = 0; i < init.length; i++) {
double temp = 0;
PageEntity pe0 = pageList.get(i);
for (int j = 0; j < init.length; j++) {
PageEntity pe = pageList.get(j);
if (i != j && pe.getOutLinks().size() != 0
&& pe.getOutLinks().contains(pe0.getPath())) {
temp = temp + init[j] / pe.getOutLinks().size();
}
}
pr = alpha + (1 - alpha) * temp;
}
return pr;
}
最后得到4个页面的pr值:
d:\Projects\PageRankDemo\htmldocs\3.html : 1.098420818505078
d:\Projects\PageRankDemo\htmldocs\4.html : 0.9755338078290176
d:\Projects\PageRankDemo\htmldocs\1.html : 0.9415035587187258
d:\Projects\PageRankDemo\htmldocs\2.html : 0.9415035587187258
pr1.jpg
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26812308/viewspace-745821/
,如需转载,请注明出处,否则将追究法律责任。