• 结对第二次—文献摘要热词统计及进阶需求


    格式描述


    作业正文

    一、分工描述

    221600123:需求分析,编写热词统计代码,博客撰写
    221600128:需求分析,编写爬虫挖掘数据,代码测试


    二、PSP表格

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

    三、解题思路

    首先,大致浏览要求文档,知道本次作业是热词统计,并且分成基础与进阶两个部分。
    其次,讨论构思代码整体框架和需要使用的函数、结构,并将任务分工。
    接着,各自编写代码,遇到生疏的知识点百度查询。
    然后,跟据具体要求一一改进代码,以功能块为单位进行代码测试。
    最后,进行完整的代码测试后,完成任务。


    四、改进思路

    关于单词存储一开始不知道怎么用比较快,本来想用链表,但是查询和排序会很慢。之后听同学建议用map,hash表果然快很多。一开始将所有代码写在main函数里,显得很凌乱。之后整理了一次,拆分核心代码块,就很清晰明了。


    五、函数流程图

    计算单词个数流程图


    六、性能分析


    七、核心代码

    //计算单词数量
    int count_word()
    {
    	int num=0,flag=0,count=0;
    	char ch,word[100];
    	//ch每次读取一个字符,word存放缓存单词
    	
        ifstream in("input.txt");  
        if(!in.is_open())  
        { 
    		cout<<"Error opening file";
    		exit (1); 
    	}  
        while(!in.eof())  
        {  
        	in.get(ch);
        	//读取一个字符依次判断
        	if(count<4&&((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z')))
        	{
        		if(ch>='A'&&ch<='Z')ch+=32;
        		word[count++]=ch;
    		}
    		else if(count>=4&&((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z')||(ch>='0'&&ch<='9')))
        	{
        		if(ch>='A'&&ch<='Z')ch+=32;
        		word[count++]=ch;
    		}
    		else
    		{
    			if(count>=4)
    			//计算单词长度,如果单词长度大等4,计数加一,并且存入map
    			{
    				num++;
    				++word_count[word];
    			}
    			//结束一次单词判断后重置长度计数和缓存单词
    			count=0;
    			for(int i=0;i<30;i++)
    				word[i]='';
    		}
        }
        if(count>=4)
    	{
    		word[count-1]='';
    		num++;
    		++word_count[word];
    	}
        in.close();
        return num;
    }
    
    //比较函数用于vec排序
    bool cmp(pair<int, string> a, pair<int, string> b)
    {
    	return (a.first != b.first) ? a.first > b.first:a.second < b.second;
    }
    //将map存入vec进行排序
    void MapSortOfValue(vector<pair<int, string> >& vec, map<string, int>& m)
    {
    	for(map<string, int>::iterator it = m.begin(); it != m.end(); it++)
    		vec.push_back(make_pair(it->second, it->first));
    	sort(vec.begin(),vec.end(),cmp);
    }
    
    //python爬虫代码
    import requests
    from bs4 import BeautifulSoup
    from urllib.request import urlopen
    sUrl = 'http://openaccess.thecvf.com/CVPR2018.py'
    fb = open(r'd:
    esult.txt', 'w', encoding='utf-8')
    def getPager(Url):
        req = requests.get(Url)
        req.encoding = 'utf-8'
        soup = BeautifulSoup(req.text, 'html.parser')
        fb.write('Title: %s
    ' % soup.select('#papertitle')[0].text.strip())
        fb.write('Abstract: %s
    
    
    ' % soup.select('#abstract')[0].text.strip())
        return
    num = 0
    res = requests.get(sUrl)
    res.encoding = 'utf-8'
    # noinspection SpellCheckingInspection
    soup1 = BeautifulSoup(res.text, 'html.parser')
    # noinspection SpellCheckingInspection
    for ptitles in soup1.select('.ptitle'):
        each_url = ptitles.select('a')[0]['href']
        temp = 'http://openaccess.thecvf.com/' + each_url
        print(num, file=fb)
        getPager(temp)
        num = num + 1
    
    

    八、心得总结

    221600123林信康

    • 自我评价
      在编写热词搜索的程序中,bug出现的频率还是挺高的,特别是刚刚解决了一个bug,又产生了一个新的问题。解决方案就是打开调试,一步一步运行监视变量,找到问题关键,对症下药。
    • 队友评价
      关于我的队友我觉得他是一个十分稳健的队友,爬虫代码他一个人自学完成,交付任务。我的代码遇到难题,与他探讨也是能得到启发,合作过程也十分愉快。

    221600128王华峰

    • 自我评价
      写爬虫程序最大的难题就是这是一个全新的挑战。以前都没学习过这个东西,突然从认识到入手还是费了一点时间。然后自学了python语言,有点生疏,写代码也是犹犹豫豫不够自信。最后爬取数据等了10分钟,一度以为自己的代码有问题,与同学交流后才明白是常态,才完成任务。
    • 队友评价
      我的队友在c++编程上会略强于我,思路清晰,所以分工是他写热词搜索代码。虽然写的比较简单,但是还是基本完成了要求。
  • 相关阅读:
    赫尔维茨公式
    从解析几何的角度分析二次型
    Struts 1 Struts 2
    记一次服务器被入侵的调查取证
    契约式设计 契约式编程 Design by contract
    lsblk df
    Linux Find Out Last System Reboot Time and Date Command 登录安全 开关机 记录 帐号审计 历史记录命令条数
    Infrastructure for container projects.
    更新文档 版本控制 多版本并发控制
    Building Microservices: Using an API Gateway
  • 原文地址:https://www.cnblogs.com/lxk12345/p/10538715.html
Copyright © 2020-2023  润新知