結隊同窗連接html
本做業博客的連接
python
Github地址c++
蔣熊:負責WordCount的升級以及python學習,添加新的命令行參數的重要支持(權重詞頻統計,詞組統計等新功能設計)、
黃志銘:負責python的學習,自定義輸入輸出文件,VS上詞頻、行數等設計,性能測試。git
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篇論文進行的測試結果:
此次代碼的思路一開始就有,寫得還算是比較順利,可是由於代碼在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 | 0 | 20 | 50 | 學習第三和第八章,再就是新工具的使用 |
4 | 508 | 846 | 30 | 80 | 學習python,以及VS |