结对第2次作业——WordCount进阶需求

本文介绍了一次软件工程实践项目,重点在于爬虫技术和词频统计的应用。项目通过爬取指定网站的论文标题和摘要,进行词频分析,并实现了自定义命令以调整权重和统计词组。此外,还探讨了性能分析与改进,以及在实施过程中遇到的挑战和解决方案。

软工实践第五次作业-爬虫和自定义词频统计

题目地址:https://edu.cnblogs.com/campus/fzu/FZUSoftwareEngineering1816W/homework/2160

031602111傅海涛
031602115黄家雄

PSP2.1Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划  
• Estimate• 估计这个任务需要多少时间600750
Development开发  
• Analysis• 需求分析 (包括学习新技术)4050
• Design Spec• 生成设计文档1020
• Design Review• 设计复审1020
• Coding Standard• 代码规范 (为目前的开发制定合适的规范)1020
• Design• 具体设计60100
• Coding• 具体编码400550
• Code Review• 代码复审1020
• Test• 测试(自我测试,修改代码,提交修改)30200
Reporting报告  
• Test Repor• 测试报告1010
• Size Measurement• 计算工作量2020
• Postmortem & Process Improvement Plan• 事后总结,并提出过程改进计划3040
 合计6301050

分工

使用工具:Java

傅海涛:爬虫,词频统计

黄家雄:词频统计

解题思路

爬虫
网站源码查看分析

爬虫实现分析
    • 获取全部代码
    • 获取Title和摘要url:筛选<dt> 标签,得到的内容contents清洗掉所有html标签,剩下的就是Title的内容,存到名为titles的List里.在把之前得到的content中筛选 <a> 标签的 href属性,存到名为urls的List里.
    • 将得到的urls传到封装好的函数中进行爬虫.操做和上面差不多,筛选<div id="abstract">的内容,在清洗掉html的标签就可以获得所有的摘要.把内容存到 名为abstracts的List里.
    • 将获得的titles和abstracts进行拼接并生成到result.txt中.

获取title和url
    //获取title和url
    public static void getTitle(String content){
        Pattern r = Pattern.compile("<dt [^>]*?>[\\w\\W]*?<\\/dt>"); Matcher m = r.matcher(content); while ( true ) { if (m.find()) { Pattern r2 = Pattern.compile("<a [^>]*?>[\\w\\W]*?<\\/a>"); Matcher m2 = r2.matcher(m.group(0)); //输出标题 if (m2.find()) { String url = GetContent.match(m2.group(0), "a", "href"); // System.out.println(url); urls.add(url); //筛除html标签 String title = outHtml(m2.group(0)); titles.add(title); // System.out.println(title); } } else { break; } } }
获取html标签里面的某个属性值
    //获取html标签里面的某个属性值
    public static String  match(String source, String element, String attr) { String result = new String(); String reg = "<" + element + "[^<>]*?\\s" + attr + "=['\"]?(.*?)['\"].*?>"; Matcher m = Pattern.compile(reg).matcher(source); while (m.find()) { String r = m.group(1); result = r; } return result; }
清除html标签
//筛除html标签
    public static String outHtml(String cont){
        String con =cont.replaceAll("</?[^>]+>", ""); return con; }
词频统计
分析
    • 主要功能和之前的一次作业要求一样,在此基础上添加新的自定义命令,之前的统计只是把单词的数量累加,就好比权重为1,只需要把按照命令把title的累加*10.至于输出n个就只需在原来的基础上面封装个函数并把n传进.至于词组统计则需要将原来单词统计上修改判断单词数量并拼接输出.
  • 关键代码分析

单词统计时候调用的内函数,把每一次的title和abstract一次作为str传入,依据weight计算权值,aNum是词组的个数,不是词组的话为0

    public static int strCount(int wordNum,int weight,String str,int aNum){ String regex = "[^0-9A-Za-z]"; String[] contns = null; //把内容已“|”分割 String contentString = str.toLowerCase().replaceAll(regex, "|"); contns = contentString.split("\\|"); int i = 0; int[] wordnumS = new int[500]; int wnum = 0; //单词切割后进行判断单词 for (; i < contns.length; i++) { if (contns[i].length() >= 4) { if (Character.isLetter(contns[i].charAt(0))) { if (Character.isLetter(contns[i].charAt(1))) { if (Character.isLetter(contns[i].charAt(2))) { if (Character.isLetter(contns[i].charAt(3))) { wordNum++; if(aNum == 0){ ma = Maps(ma,contns[i],weight); }else { wordnumS[wnum] = i; wnum++; } } } } } } } Boolean flag = false; //如果是词组的话进行单词重组,匹配符合的词组在找到之前替换的字符 if(aNum > 0){ if(aNum <= wnum){ for(int j = 0;j < wnum + 1 - aNum;j++){ //0到1 flag = false; String s = new String(); for (int k = j ; k < j + aNum; k++ ){ if(wordnumS[k] == wordnumS[j] + k - j){ // s += contns[wordnumS[j]]; s += contns[wordnumS[k]]; if(k != j + aNum -1) { s += "[\\w\\W]"; }else { flag = true; } } } if (flag) { Pattern r = Pattern.compile(s); Matcher m = r.matcher(str.toLowerCase()); if(m.find()) { ma = Maps(ma , m.group() , weight); } } } } } return wordNum; }
附加题的设计和展示
设计的创意独到之处

对每篇论文的标题,摘要,链接,作者.对同一篇论文的作者进行关联,输出一个csv文件,用Gephi的可视化处理生成关系图谱.

实现思路

和获取标题摘要的实现原理类似,将网页源代码文本先筛选出内容所在的标签部分,对获取的清洗掉html标签.

实现成果展示



性能分析与改进

性能分析

爬虫部分,获取title和url由于在同一个页面比较好处理,而摘要处于子页面中,所以到对得到的url依次进行爬取对应的摘要内容,所花的时间大部分用于爬取论文摘要上面
词频分析部分,我主要对文档title和abstract获取其内容,依次将内容进行单词判断和第一次wordcount相比,直接对所有文档进行清洗筛选相比,所花时间大大增加.

改进

在单词判断上,和第一次相比改进比较大,将原先的比较固话的函数重新构造成由参数决定功能的函数,使代码的可用性更强

 

遇到的代码模块异常或结对困难及解决方法

在电脑上运行的时候不知道出现什么错误,程序不能运行,怀疑电脑配置问题

最后队友帮忙解决

有时候请教别人能学的很快

评价你的队友

技术高超、刻苦专研

希望还是要更多体验生活

学习进度条

 

第N周新增代码行累计代码行本周学习(时)重要成长
41501509java爬虫
580080011代码规范

转载于:https://www.cnblogs.com/caicai999/p/9781005.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值