在文章开头给出结对同学的博客链接、本作业博客的链接、你所Fork的同名仓库的Github项目地址
队友链接 张子纯:http://www.cnblogs.com/zzc2018/
附加题所有代码及文件:https://files.cnblogs.com/files/heshoucheng/031602408.zip
给出具体分工
031602441:(2) 自定义输入输出文件;(3)加入权重的词频统计;(4)新增词组词频统计功能;(5)自定义词频统计输出;(6)多参数的混合使用;附加功能 2;单元测试和性能分析; 博客书写
031602408:(1) 使用工具爬取论文信息;附加功能 1,3;博客书写
PSP表格
PSP2.1 |
Personal Software Process Stages |
预估耗时(分种) |
实际耗时(分钟) |
Planning |
计划 |
|
|
Estimate |
估计这个任务需要多少时间 |
1710 |
|
Development |
开发 |
|
|
Analysis |
需求分析 (包括学习新技术) |
900 |
1000 |
Design Spec |
生成设计文档 |
10 |
10 |
Design Review |
设计复审 |
10 |
10 |
Coding Standard |
代码规范 (为目前的开发制定合适的规范) |
10 |
10 |
Design |
具体设计 |
30 |
30 |
Coding |
具体编码 |
600 |
600 |
Code Review |
代码复审 |
10 |
10 |
Test |
测试(自我测试,修改代码,提交修改) |
60 |
90 |
Reporting |
报告 |
|
|
Test Repor |
测试报告 |
20 |
20 |
Size Measurement |
计算工作量 |
0 |
0 |
Postmortem & Process Improvement Plan |
事后总结, 并提出过程改进计划 |
60 |
60 |
|
合计 |
1710 |
1840 |
解题思路描述与设计实现说明
- 爬虫使用
1.流程图
通过jsoup进行html解析(流程图如上)。
2.关键代码解析:
(1)、传递目标网站url进行连接返回一个Document。
1 Document document1 =Jsoup.connect(URL)
2 .header("Accept-Encoding", "gzip, deflate")
3 .userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0")
4 .maxBodySize(0)
5 .timeout(600000)
6 .get();
(2)、利用select容器过滤出论文所在链接。
(3)、循环传递爬取的论文url并建立连接,返回一个目标论文所在的html页面。
1 for(Element element6:hrefs){
2 String url=element6.absUrl("href");
3 //运用爬取得链接进行二次爬取
4 Document document2 =Jsoup.connect(url)
5 header("Accept-Encoding", "gzip, deflate")
6 .userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0")
7 .maxBodySize(0)
8 .timeout(600000)
9 .get();
10 //解析出想要爬取的内容
(4)、
1 Elements elements1 = document2.select("[id=papertitle]");
2 String title=elements1.text();
3 bi.write("Title: "+title+"
");
4 Elements elements2 = document2.select("[id=abstract]");
5 String abstract1=elements2.text();
6 bi.write("Abstract: "+abstract1+"
"+"
"+"
");
7 同样适用select()方法过滤出想要的Title及Abstract。
- 代码组织与内部实现设计(类图)
代码组织
031602441&031602222
|
-src
|
-Main.java
(
主程序,可以从命令行接收参数
)
|
-sort.java
(
排序
)
|
-export1.java
(
输出到文件
)
|
-Readwords.java
(
提取单词,字符数等
)
|
-cvpr
|
-result.txt
(
爬虫结果
)
|
-Main.java
(
爬虫程序,可以爬取
CVPR2018
论文列表
)
内部实现设计(类图)
- 说明算法的关键与关键实现部分流程图
流程图
算法关键
- 短语是由n个单词组成的,判断短语就是连续判断由字符串某个位置开始的n个单词。记录下字符串中单词的某次判断中上次结束的位置和这次结束的位置,再把字符串两个位置间的数据插到记录词组的字符串里,这样就能录入两个有效单词和他们间的分割符。如果最后确实连续判断了n个单词,则把该词组插入到map中。
附加题设计与展示
设计的创意独到之处
- 1.从网站综合爬取论文的除题目、摘要外其他信息
- 2.分析论文列表中各位作者之间的关系,论文A的第一作者可能同时是论文B的第二作者,不同论文多位作者之间可能存在着联系。对数据的图形可视化做出一些努力,比如对上一条功能可以形成关系图谱
- 3.统计各位作者发表的作品数,并得到发表数排名前十的名单,形成可视化数据。
实现思路
- 1.和之前爬取的过程一样,就是变一下select的内容
- 2.看到那个图的时候真的一脸懵,问了下学姐发现那个图是social network。然后去网上查了下,发现有自动分析的软件,只要生成作者信息的文本,就可以生成社交网路。我选取了Gephi进行操作。爬取出每一篇论文的作者,将文本导入Excel中,再导入Gephi生成作者间的关系图谱。
- 3.在爬取论文Title、Abstract代码的基础上新增Type、Author等信息写入本地文件“result.txt”。
读取result.txt文件分离出作品数排名前十的作者姓名,利用jfreeChart描绘出柱形图。
JFreeChart chart = ChartFactory.createBarChart3D("作者作品数排序", "作者姓名", "论文数", dataset, PlotOrientation.VERTICAL, true, true, true);
实现成果展示
- (1)
- (2)
边缘部分
密集部分
- (3)
关键代码解释
贴出你认为重要的/有价值的代码片段,并解释
1 String re="";if(s.length()!=0)
2 {
3 if(s.charAt(0)=='T')//title
4 {
5 s=s.substring(7);
6 m = p1.matcher(s);
7 while(m.find())
8 {
9 s4=new StringBuffer();
10 s1 = m.group();//s1找到第一个单词
11 m1 = p.matcher(s1);
12 if(m1.find())//判断单词
13 {
14 s1=s1.toLowerCase();
15 s4.append(s1);//将找到第一个单词插入短语中
16 s2=s.substring(m.end());//句子中剩下的部分
17 Matcher m2 = p1.matcher(s2);//找短语其他成分
18 START1=0;
19 for(i=1;i<Numflag;i++)//判断短语
20 {
21 if(m2.find())
22 {
23 String s3=m2.group();//短语第二部分
24 m1=p.matcher(s3);//判断是否是单词
25 if(m1.find())
26 {
27 END1=m2.end();
28 re=s2.substring(START1,END1);
29 re=re.toLowerCase();
30 //是单词插入短语
31 s4.append(re);
32 START1=m2.end();
33 }
34 else
35 {
36 break;
37 }
38 }
39 else break;
40 }
41 if(i==Numflag)//满足短语要求,插入map
42 {
43 if(words.get(s4.toString())!=null)
44 {
45 words.put(s4.toString(),words.get(s4.toString())+weight);
46 }
47 else
48 {
49 words.put(s4.toString(),weight);
50 }
51 }
52 }
53 }
54 }
具体分析
- 单词判断
之前写个人项目的时候用的不是正则判断而我队友用的是正则,他的代码会比我快很多,所以这次我用的是正则表达式
1 Pattern p1 = Pattern.compile("[0-9a-zA-Z]+");//字符串Pattern p = Pattern.compile("(^[a-zA-Z]{4}[a-zA-Z0-9]*)");//单词
p1:提取出由数字和字母组成的字符串
p:判断该字符串是否符合单词要求。
如果两次find()都符合则是单词
- 组成词组
1 START1=0;for(i=1;i<Numflag;i++)//判断短语
2 {
3 if(m2.find())
4 {
5 String s3=m2.group();//短语第二部分
6 m1=p.matcher(s3);//判断是否是单词
7 if(m1.find())
8 {
9 END1=m2.end();
10 re=s2.substring(START1,END1);
11 re=re.toLowerCase();
12 //是单词插入短语
13 s4.append(re);
14 START1=m2.end();
15 }
16 else
17 {
18 break;
19 }
20 }
21 else break;
22 }
短语是由n个单词组成的,判断短语就是连续判断由字符串某个位置开始的n个单词。记录下字符串中单词的某次判断中上次结束的位置和这次结束的位置,再把字符串两个位置间的数据插到记录词组的字符串里,这样就能录入两个有效单词和他们间的分割符。如果最后确实连续判断了n个单词,则把该词组插入到map中。
性能分析与改进
描述你改进的思路
- 使用正则表达式判断单词,正则判断流程图如上。
- 使用map录单词
- 在统计频率时,原本想的是记下来每个单词出现的频率后再排序,这样会用到O(N*log N)。在查阅一些资料后,后来才发现可以直接保存频率最高的几个单词,遍历的同时替换就可以了,降到了O(N)。
展示性能分析图和程序中消耗最大的函数
单元测试
展示出项目部分单元测试代码,并说明测试的函数,构造测试数据的思路
- 思路:正常运行退出返回0
代码覆盖率
贴出Github的代码签入记录
请合理记录commit信息
-
遇到的代码模块异常或结对困难及解决方法
-
问题描述:
- 刚开始接触爬虫比较迷茫,不知道运用什么合适的工具,与目标网站建立连接,爬取并分析html页面都较为困难。
-
做过哪些尝试:
- 一开始自己写方法利用正则表达式来提取想要的内容
-
是否解决:
- 经过查询资料,找到较为方便的Jsoup包,通过select容器很快完成爬取。
-
有何收获:
- 学会用java在目标网站爬取html页面内容并通过select()等方法解析出想要的内容。
- 学会用社会网络分析(如Gephi)工具描绘社会网络关系图。
- 学会用JfreeChart描绘柱形图、折线图、饼状图。
-
-
评价你的队友
-
值得学习的地方:
- 善于思考,做事细心认真
-