参考文章:
理论:竹笋炒肉:Google的PageRank算法学习 http://hedong.3322.org/archives/000199.html
算法: PageRank算法的原理和源代码实现(C++)http://renxijun.blog.sohu.com/60220486.html
模仿上面这个算法实现了java版的计算,我写的这个性能不好,3496987篇网页迭代1次居然需要3分钟左右,贴出来希望高手帮我指点改正。
package pagerank;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Hashtable;
/*
linkmaptest.txt内容为
d00000-0 d00000-0 d00000-1 d00000-2
d00000-1 d00000-2 d00000-1
d00000-2 d00000-0
d00000-3
*/
public class PageRank {
public static void main(String[] args) throws Exception {
String[] linesarr;
Hashtable<String, Integer> docIDandNum = new Hashtable<String, Integer>();
int total = 0;
int father, son;
int outdegree = 0;
// 读取文件,得到docid,计算链接总数total,outdegree在迭代的时候计算
File linkfile = new File("E:/larbin/linkmaptest.txt");
BufferedReader linkinput = new BufferedReader(new FileReader(linkfile));
String line = linkinput.readLine();
while (line != null) {
++total;
linesarr = line.split(" ");
if (linesarr.length > 0) {
// outdegree = linesarr.length - 1;
// for(int j = 1; j <= linesarr.length - 1; ++j) {
// if(linesarr[j].equals(linesarr[0]))
// outdegree--;
// }
if (linesarr[0] != null) {
docIDandNum.put(linesarr[0], total);
// System.out.println("链接" + linesarr[0] + "的出度为" + outdegree);
}
}
linesarr = null;
line = linkinput.readLine();
}
linkinput.close();
// System.out.println("链接总数为:" + total);
if (total > 0) {
// pageRank[]存放PR值
float[] pageRank = new float[total + 1];
// 链入页面的计算总和
float[] prTmp = new float[total + 1];
// 设置pageRank[]初始值为1.0f
for (int i = 1; i <= total; ++i) {
pageRank[i] = 1.0f;
prTmp[i] = 0.0f;
}
// 当前页面的PR值
float fatherRank = 1f;
// 阻尼系数d或称为alpha
float alpha = 0.85f;
// 进行10次迭代
for (int iterator = 0; iterator < 10; iterator++) {
long startTime = System.currentTimeMillis();
linkinput = new BufferedReader(new FileReader(linkfile));
line = linkinput.readLine();
// 读出docid和outdegree和sons
while (line != null) {
linesarr = line.split(" ");
if (linesarr.length > 0) {
outdegree = linesarr.length - 1;
for (int j = 1; j <= linesarr.length - 1; ++j) {
// 指向自身的链接无效,不计算在内
if (linesarr[j].equals(linesarr[0]))
outdegree--;
}
}
if (outdegree > 0) {
father = (int) docIDandNum.get(linesarr[0]);
// 对应公式中的pr(Ti)/c(Ti),Ti为指向father的页面
fatherRank = pageRank[father] / outdegree;
for (int k = 1; k <= linesarr.length - 1; ++k) {
if (linesarr[k].equals(linesarr[0])) {
continue;
}
son = docIDandNum.get(linesarr[k]);
if (total >= son && son >= 0) {
prTmp[son] += fatherRank;
}
}
}
linesarr = null;
line = linkinput.readLine();
}
// 准备下次迭代的初始值
for (int i = 1; i <= total; ++i) {
// PR公式1
// prTmp[i] = 0.15f + alpha * prTmp[i];
// PR公式2
prTmp[i] = 0.15f / total + alpha * prTmp[i];
// 每次迭代后的真正pr值
pageRank[i] = prTmp[i];
prTmp[i] = 0.0f;
}
// 打印出每次迭代值,此操作耗费时间和内存
// for (int i = 1; i <= total; ++i)
// System.out.print(pageRank[i] + " \t ");
// System.out.println(" ");
linkinput.close();
long endTime = System.currentTimeMillis();
System.out.println("第" + iterator + "次迭代耗时" + (endTime - startTime) + "ms");
}
//最终PR值输出至文件
BufferedWriter newlink = new BufferedWriter(new FileWriter(
new File("E:/larbin/pageranktest.txt")));
for (int i = 1; i <= total; ++i) {
// System.out.println(docIDandNum.toString());
newlink.write(String.valueOf(pageRank[i]));
newlink.newLine();
}
newlink.flush();
newlink.close();
pageRank = null;
prTmp = null;
}
}
}
学java有段时间了,但是总感觉自己不着道,第一次在论坛发帖,也希望大家指出我的很多不规范的地方,给我些改正的建议,分享些经验给新手们,(比如有什么好的书适合我,在编程习惯技巧等方面我应该如何去改正以便更加规范些),谢谢。
分享到:
相关推荐
实现PageRank算法最为简单的代码,此代码使用java编写,适合与学习搜索引擎了解pageRank算法的初学者。
完整的用JAVA和MATLAB实现的Pagerank算法,且富有详细的注释
本文详细介绍了pagerank算法,深入浅出
南开大学大数据课程大作业一 :PageRank算法代码
人工智能 PageRank算法的具体实现 有代码
内含数据集。执行main.py即可
用类封装了的pagerank算法模拟实现
pageRank算法是机器学习中经典的算法,资源里面包含pageRank算法的原理分析,pageRank算法的源码,用的是python编写,适合初学者学习使用
无向图pagerank算法,java版本,完美运行!!!!!!!
谷歌传统而经典的网页排序模型PageRank的MATLAB算法代码
基于Hadoop的PageRank算法并行实现+源代码+文档说明 -------- 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载...
近来自己在研究一下排序算法,结果在网上找了很久都只有两个Java实现的PageRank算法,其余的基本上是理论研究,对初学者帮助不大,希望能对你有些帮助。
内含三个m函数,createRandomMetrics可以生成pagerank算法需要的矩阵,mypagerank计算pagerank值,runPageRank整合前两个函数。
搜索引擎PageRank算法实现及测试数据,测试输出,可执行文件。搜索引擎PageRank算法实现及测试数据,测试输出,可执行文件。
对pagerank 算法 用java实现
PageRank, PageRank算法的实现 警告警告这不是一个完整的,也不是一个很好的PageRank实现。 这是一个学习实现,因此,应该把它当作一个简单的学习项目。 使用自己的风险。 PageRank) ( @timothyasp )) ) ( @ccarlton...
java实现网页排名算法java实现网页排名算法java实现网页排名算法java实现网页排名算法java实现网页排名算法
PageRank 算法的 C 实现,有和没有并行化 包括几个文件: step1.c,PageRank的顺序实现。使用转置的邻接矩阵; step2.c,PageRank的顺序实现。使用邻接矩阵的压缩稀疏行组织; step3.c,PageRank的并行实现。...
pagerank - 加权PageRank算法Go实现
数据科学导论大作业-基于python的PageRank算法实现和理论作业+源代码+文档说明+实验报告 - 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩...