具体分工说明 | 分工 |
---|---|
1. 编写爬虫爬取论文信息 | 叶一帆 |
2. 自定义输入输出文件 | 叶一帆 |
3. 加入权重的词频统计 | 林世杰 |
4. 新增词组词频统计功能 | 林世杰 |
5. 自定义词频统计输出 | 叶一帆 |
6. 多参数的混合使用 | 叶一帆 |
7. 附加题 | 叶一帆 |
8.性能分析与改进 | 叶一帆 |
9.单元测试 | 林世杰,叶一帆 |
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 0 | 0 |
· Estimate | · 估计这个任务需要多少时间 | 630 | 640 |
Development | 开发 | 0 | 0 |
· Analysis | · 需求分析 (包括学习新技术) | 100 | 100 |
· Design Spec | · 生成设计文档 | 50 | 50 |
· Design Review | · 设计复审 | 50 | 50 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 30 | 30 |
· Design | · 具体设计 | 40 | 40 |
· Coding | · 具体编码 | 100 | 100 |
· Code Review | · 代码复审 | 30 | 30 |
· Test | · 测试(自我测试,修改代码,提交修改) | 50 | 50 |
Reporting | 报告 | 0 | 0 |
· Test Repor | · 测试报告 | 50 | 60 |
· Size Measurement | · 计算工作量 | 10 | 10 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 20 | 20 |
合计 | 630 | 640 |
爬虫部分(自己写的):
????这里用到了Java的两个包,httpclient
和jsoup
,本来是直接用jsoup解析,但是发现解析后的内容不全,有部分html源码没生成全就解析了,所以加了httpclient,先请求读取网页,然后用jsoup开始解析。
????整个爬虫流程:先找到标签的class为ptitle
的段,然后获取链接,但是这里的链接是相对地址,所以完整的链接需要自己拼接。这样就能拿到一个论文列表的url表。然后遍历每个链接,解析找标签的值为papertitle和abstract的文本,分别对应标题跟摘要。然后各种拼接字符串。
????大体流程:
新增词组词频统计功能:
用一个队列存给定词组长度的单词。
多参数的混合使用:获取CLI的各种参数判断,调用对应的模块或者做出对应的异常抛出
analy_result.txt
,这个文本里包含一千多篇论文的类别、标题、摘要、作者以及作者来自、PDF链接。然后继续导出各种json文件,包含各种数据,由于时间问题,没用java做图形化。用pyecharts库快速生成图形化表格,对应文件cvpr数据可视化.html
热词高频词组
不同类型的论文统计图
不同地区的论文发表数
/*
* 统计词组
* 参数 字符串 ant:词组的单词数 ty权重类型
* ty 参数当ty==1 权重为10 ty==0 权重为1
*/
public void CountforPhrase(String ss,int ant,int ty){
ss = ss.toLowerCase();
ss = ss.replaceAll("\n","");
StringBuilder mid=new StringBuilder();//分隔符
StringBuilder wword=new StringBuilder();//单词拼接
Queue<String> que1=new LinkedList<String>();//用于存储词组单词
Queue<String> que2=new LinkedList<String>();//用于存储分隔符
String feng=",./;'[] \\<>?:\"{}|`~!@#$%^&*()_+-=";//分隔符集合
StringTokenizer words = new StringTokenizer(ss,feng,true); //分割文本成单词。
try {
while (words.hasMoreTokens()) {
String word =words.nextToken();
if (word.length() >= 4 && Character.isLetter(word.charAt(0)) && Character.isLetter(word.charAt(1)) && Character.isLetter(word.charAt(2)) && Character.isLetter(word.charAt(3))) { //判断单词前4个是否为字母
que2.offer(mid.toString());
mid.delete(0,mid.length());
que1.offer(word);
if(que1.size()>=ant){//达到词组单词数量
int cnt=0;
wword.delete(0,wword.length());
for(String w:que1){
wword.append(w);
cnt++;
if(que2.size()>cnt)
{
String tmp=((LinkedList<String>) que2).get(cnt);//取出中间的分隔符
wword.append(tmp);//拼接
}
}
//最后生成正确的wword 词组
// 进行统计操作
if(!phraseCount.containsKey(wword.toString()))
{
phraseCount.put(wword.toString(),new Integer( ty==1 ? 10:1 ));
}
else{
int count=phraseCount.get(wword.toString()) + (ty==1 ? 10:1);
phraseCount.put(wword.toString(),count);
}
que1.remove();
que2.remove();
}
}
else if(word.length()!=1){//不符合条件 将其前面的都删除
que1.clear();
que2.clear();
}else if(word.length()==1 && !(Character.isLetter(word.charAt(0)))){//判断是否为分隔符
mid.append(word);
}
}
}catch (Exception e){
System.out.println("词频统计报错:");
System.out.println(e.getMessage());
}
}
改进思路:目前没有改进,在写的过程中一边调优一边实现功能。
展示性能分析图和程序中消耗最大的函数:
代码覆盖率的图:
覆盖率最高的函数——词组词频统计
性能分析图:
展示出项目部分单元测试代码
脏数据
1.txt&2.txt
3.txt
读空文件
构造测试数据的思路
问题描述:
字符串处理、乱七八糟的,非ascii会显示不全之类的干扰统计。
做过哪些尝试:
直接把字符串清洗一遍再开始处理词频统计。
是否解决:
不知道是否解决,反正测试过来没问题。
有何收获:
学会了字符串的各种处理。
值得学习的地方
人好相处,由于打acm的,在算法结构上思维比较缜密。
需要改进的地方
由于经常敲C++跟刷OJ题,一些实战的地方,或者其他语言比如Java或者python,不是那么熟悉,可以多接触接触。
第N周 | 新增代码(行) | 累计代码(行) | 本周学习耗时(小时) | 累计学习耗时(小时) | 重要成长 |
---|---|---|---|---|---|
5 | 1000+ | 1000+ | 30 | 30 | Lua流程控制学习、 |
6 | 1000+ | 1000+ | 5 | 5 | 复习java |
原文:https://www.cnblogs.com/yyf031602438/p/9768628.html