福大軟工1816 · 第五次做業 - 結對做業2

結隊同窗連接html

本做業博客的連接
python

Github地址c++

 

  • 分工明細:

蔣熊:負責WordCount的升級以及python學習,添加新的命令行參數的重要支持(權重詞頻統計,詞組統計等新功能設計)、
黃志銘:負責python的學習,自定義輸入輸出文件,VS上詞頻、行數等設計,性能測試。git

  • PSP:

 

PSP2.2 Personal Software Process Stages 預估耗時(分鐘) 實際耗時(分鐘)
Planning 計劃 100 200
· Estimate · 估計這個任務須要多少時間 10 10
Development 開發 500 800
· Analysis · 需求分析 (包括學習新技術) 240 300
· Design Spec · 生成設計文檔 240 200
· Design Review · 設計複審 20 30
· Coding Standard · 代碼規範 (爲目前的開發制定合適的規範) 10 30
· Design · 具體設計 70 50
· Coding · 具體編碼 0 0
· Code Review · 代碼複審 0 0
· Test · 測試(自我測試,修改代碼,提交修改) 0 0
Reporting 報告 40 100
· Test Repor · 測試報告 50 20
· Size Measurement · 計算工做量 15 10
· Postmortem & Process Improvement Plan · 過後總結, 並提出過程改進計劃 60 80
  合計 1355 1830
  • 解題思路描述與設計實現說明

 拿到題目的第一時間就是想到上一次我的做業的單詞統計,此次結對做業的代碼便是對上次做業的一點拓展,首先是輸入是爬取的論文標題和摘要,數據量比較大,所以在思考問題的解決方案時首先應該考慮時間和空間的優化算法,其次是本次時詞組頻率統計而不是單詞頻率,所以上次使用map來記錄的方式就將修改,而如何快速得到詞組和權重累計就成爲關鍵點。github

至於字符、單詞數和行數的統計比較簡單,與上次無差別就再也不作介紹,所以接下來主要介紹詞組頻率統計部分的代碼:web

       由於詞組將被標題和摘要隔開,且遇到’\n’也將被阻隔,所以在考慮時就能夠採用分行處理,提取詞組,與現有統計詞組比較,若出現過相同詞組,則權重累加,若無出現過,則新增詞組存入,最後排序輸出前十便可。而在分行處理時,考慮採用結構體存儲單個詞組,對每行單詞進行預處理,逆序dp,處理每個單詞的連續詞組的最後一個單詞下標(即若是出現多個單詞,中間只含分隔符,不含不合法單詞,則稱爲連續詞組,若只有該單詞自己則記錄本身下標),不然碰見非法單詞,記爲-1,如此進行正序搜索,如若某合法單詞記錄的連續詞組最後一個單詞下標-自身下標+1>=詞組要求長度,則說明以此單詞爲起點存在合法詞組,則記入,按上述方法累加權重或新增詞組,若碰見-1或是長度不知足須要,則說明是不合法詞組,無需操做,最後自定義排序函數cmp進行排序輸出便可。算法

 

python:數據結構

複製代碼
#-*- coding: utf-8 -*-
import time
import re
import random
import requests

# url = 'http://openaccess.thecvf.com/CVPR2018.py 

'

#這個headers信息必須包含,不然該網站會將你的請求重定向到其它頁面
headers = {
    'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'Accept-Encoding':'gzip, deflate, sdch',
    'Accept-Language':'zh-CN,fr-FR,zh,en-us;q=0.8',
    'Connection':'keep-alive',
    'Host':'www.openaccess.thecvf.com 

',
    'Referer':'http://openaccess.thecvf.com/CVPR2018.py 

',
    'Upgrade-Insecure-Requests':'1',
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
}

if __name__ == '__main__':
    #將爬取結果存儲到results.txt文件中
    with open('results.txt','a+') as res:
        #經過url_results.txt讀取連接進行訪問
        with open('url_results.txt') as f:

            for reurl in f:
                print("正在讀取:"+reurl)
                response = requests.get(reurl.replace('\n',''), headers=headers)
                all_content = response.text.replace('\r\n', '').replace('\t', '').replace('\n', '').replace(' ', '')
                re_title = r'<divid="papertitle">(.*?)</div>'
                title = re.findall(re_title ,all_content, re.S | re.M)
                re_abstract = r'<divid="abstract">(.*?)</div>'
                abstract = re.findall(re_abstract, all_content, re.S | re.M)
                res.write("Title: "+title[0]+'\n')
                res.write("Abstract: " +abstract[0]+'\n')
                res.flush()
                res.write('\n')
                res.write('\n')
                time.sleep(random.randint(1, 3))
複製代碼

程序代碼:app

複製代碼
int lines_counts()    //計算非空行 
{
    ifstream rf("result(1).txt");
    freopen("output1.txt","w",stdout);
    if (!rf) {
        cout << "open file failed. trying open default file:input.txt" << endl;
    }    
        string Str;
    char c;
    int lines=0;
        while (getline(rf, Str)) 
    {
      if(Str!="\0" && ((Str[0] >= 32 && Str[0] <= 126) || Str[0] == 9 || Str[0] == 10)  && !(Str[0] >= 48 && Str[0] <= 57) )
       {     
       //cout<<Str<<endl;  
           lines++;  
      //cout<<lines<<endl;
        }   
    }
        rf.close();    
     return  lines;

}
複製代碼

      在計算非空行的時候,逐行讀取,判斷是不是空行符、數字、以及非ASCII字符。python在爬取過程當中有遇到非ASCII字符,因此在這裏加以判斷。dom

 

複製代碼
sort(rr,rr+x,cmp);
    int mi = min(10, x);     
    int d;
    rep(i, 0, mi)    
    {
        fprintf(os,"<");
        printf("<");
        rep(j, 0, m)
        {
            char sq[50];
            int yy = rr[i].s[j].length();
            for(d = 0; d < yy; d++)
            sq[d] = rr[i].s[j][d];
            sq[d] = '\0';
            fprintf(os,"%s ",sq);
            printf("%s ",sq);
        }
        fprintf(os,">: %d\n",rr[i].val);
        printf(">: %d\n",rr[i].val);
    }
複製代碼

 

其中的mi=min(10, x)主要是對結果詞頻的判斷,若是詞頻小於10,則輸出全部詞頻,反之則輸出前10個詞頻。

 

複製代碼
    if(s == "Title:")
        {
            v1 = 10;
            h = 1; 
            continue;
        }
        
        else if(s == "Abstract:")
        {
            v1 = 1;
            //flf = false;
            continue;
        }
複製代碼

在賦予權值的時候,對權值的區分加以區別。

複製代碼
    len = s.length();
        //cout << "s = " << s << endl;
        if(len < 4)
        {
            ww[h++].flag = false;
            //cout << "ccc   " << " h = " << h-1 << "    flag = " << ww[h].flag << endl;
            continue; 
        }
        w(len >= 4)
        { 
            k = 0;
            w(len >= 4 && (s[k] == '(' || s[k] == ')' || s[k] == '*'))
            {
                k++;
                len--;
            }
            s = s.substr(k);
            i = 0;
            k = 0;
            
            flag = false;
            fflag = false;
            w(((s[i] >= 65 && s[i] <= 90) || (s[i] >= 97 && s[i] <= 122)) && i < len && !fflag)
            {
                k++;
                if(s[i] >= 65 && s[i] <= 90)
                s[i] = s[i] + 32;
                i++;
                if(k == 4)
                {
                    flag = true;
                    break;
                }
            }
            if(flag)
            {
                w((s[i] >= 48 && s[i] <= 57) || (s[i] >= 65 && s[i] <= 90) || (s[i] >= 97 && s[i] <= 122))
                {
                    if(s[i] >= 65 && s[i] <= 90)
                    s[i] += 32;
                    k++;
                    i++;
                }
                if(k == len)
                {
                    //cout << "aaa" << endl;
                    ww[h].s = s;
                    ww[h].flag = true;
                    //cout << "bbb   " << " h = " << h << "    flag = " << ww[h].flag << endl; 
                    ww[h].val = v1;
                    g = 0;
                    h++;
                    len -= k;
                    break;
                }
                
                else
                {
                    if(k >= 4)
                    {
                        s1 = s.substr(0, k);
                        //cout << "bbb" << endl;
                        ww[h].s = s1;
                        ww[h].flag = true;
                        //cout << "aaa   " << " h = " << h << endl; 
                        ww[h].val = v1;
                        h++;
                        //cout << "s1 = " << s1 << endl;
                    }
                    
                    s = s.substr(k);
                    //cout << "s2 = " << s << endl;
                    len = len - k; 
                }
            }
            else
            {
                len -= k;
                ww[h++].flag = false;
                //cout << "ddd   " << " h = " << h-1 << "    flag = " << ww[h].flag << endl; 
                s = s.substr(k);
                k = 0, i = 0;
                w((s[i] <= 65 || (s[i] >= 91 && s[i] <= 96) || s[i] >= 123) && i < len)
                {
                    k++;
                    i++;
                }
                if(s[i-1] < 48 || (s[i-1] > 57 && s[i-1] < 65) || (s[i-1] >= 91 && s[i-1] <= 96) || s[i-1] > 122)
                fflag = false;
                else fflag = true;
                if(fflag)
                {
                    w(((s[i] >= 65 && s[i] <= 90) || (s[i] >= 97 && s[i] <= 122) || (s[i] >= 48 && s[i] <= 57)) && i < len)
                    {
                        k++;
                        i++;
                    }
                }
                if(k)
                {
                    s = s.substr(k);
                    len -= k;
                }
            }
        }
複製代碼

這個代碼段是對單詞進行統計,採用結構體存儲單個詞組,對每行單詞進行預處理,逆序dp,獲得下標。而後遍歷單詞,若是是符合m的詞組,就記入,不然碰見非法單詞,記爲-1,如此進行正序搜索。

 

共計爬取:979篇,如下結果是取前21篇論文進行的測試結果:

 

  • VS的性能分析:

 

 

  • 遇到的代碼模塊異常或結對困難及解決方法:

               此次代碼的思路一開始就有,寫得還算是比較順利,可是由於代碼在Dev-c++上寫,因此後續要換到VS上測試的時候,就出現要改的東西不少,吸收下教訓,而後就開始學習怎麼在VS上面寫代碼,在百度上百度了很久沒發現,結果後來在博客中看到關於C++類的規範寫法,才一目瞭然。目前已經搞清楚怎麼使用VS寫C++的程序及其類。

               另外,有一點須要說起的是,因爲剛開始在Dev上寫的讀入文件形式是以字符讀入,而VS剛接觸,在裏面打開文件好像是採用getline比較合適,因此要改起來比較多,提交的時間快到了,後續再繼續改吧。

 

 

 

  • 隊友評價:

               隊友很能夠啊,志銘作的vs封裝,我一開始用的devc++的編譯器,而後確定無法提交,志銘各類查,而後弄得VS,有他我很放心。

    還有在省題的時候難點就只是詞組頻率統計那個,咱們在寫的時候呢,兩我的就想了不少設想,而後分開各類試,就算是有劃分分工,可是咱們也沒真的1認真,也仍是互相幫忙,因此這隊友特別靠譜,無論最後作的好很差,過程輕鬆,一個interesting的人。

     

  • 學習進度條
    第N周 新增代碼(行) 累計代碼(行) 本週學習耗時(小時) 累計學習耗時(小時) 重要成長
    1 256 256 20 20 學習git,而後就是c++一些數據結構的溫習
    2 82 338 10 30 優化代碼吧
    3  0 20  50  學習第三和第八章,再就是新工具的使用
    4 508 846 30 80 學習python,以及VS
相關文章
相關標籤/搜索