結對同窗的博客連接
本做業博客的連接
Github項目地址
附加功能代碼
代碼規範連接html
莊卉:爬蟲、詞頻權重計算+自定義統計輸出、附加功能、博客撰寫
胡緒佩:詞組詞頻統計功能+字符及有效行數目、單元測試、性能分析、博客撰寫java
PSP2.1 | Personal Software Process Stages | 預估耗時(分鐘) | 實際耗時(分鐘) |
---|---|---|---|
Planning | 計劃 | 30 | 30 |
· Estimate | · 估計這個任務須要多少時間 | 30 | 30 |
Development | 開發 | 1770 | 1740 |
· Analysis | · 需求分析 (包括學習新技術) | 120 | 150 |
· Design Spec | · 生成設計文檔 | 30 | 30 |
· Design Review | · 設計複審 | 30 | 30 |
· Coding Standard | · 代碼規範 (爲目前的開發制定合適的規範) | 30 | 60 |
· Design | · 具體設計 | 120 | 90 |
· Coding | · 具體編碼 | 900 | 720 |
· Code Review | · 代碼複審 | 180 | 180 |
· Test | · 測試(自我測試,修改代碼,提交修改) | 360 | 480 |
Reporting | 報告 | 120 | 120 |
· Test Repor | · 測試報告 | 60 | 30 |
· Size Measurement | · 計算工做量 | 30 | 20 |
· Postmortem & Process Improvement Plan | · 過後總結, 並提出過程改進計劃 | 30 | 70 |
合計 | 1920 | 1890 |
f = open("result.txt", 'a', encoding='utf-8') html1 = urllib.request.urlopen("http://openaccess.thecvf.com/CVPR2018.py").read() bf1 = BeautifulSoup(html1) texts1 = bf1.select('.ptitle') a_bf = BeautifulSoup(str(texts1)) a = a_bf.find_all('a') urls = [] for each in a: urls.append("http://openaccess.thecvf.com/" + each.get('href')) for i in range(len(urls)): f.write(str(i)) f.write("\n") html2 = urllib.request.urlopen(urls[i]).read() bf = BeautifulSoup(html2) texts2 = bf.find_all('div', id='papertitle') f.write("Title: " + texts2[0].text.lstrip('\n') + "\n") texts3 = bf.find_all('div', id='abstract') f.write("Abstract: " + texts3[0].text.lstrip('\n') + "\n\n\n")
031602114&031602444 |- src |- WordCount.sln |- WordCount |- CharCount.cpp |- CharCount.h |- LineCount.cpp |- LineCount.h |- WeightTypeNE.cpp |- WeightTypeNE.h |- SortTopN.cpp |- SortTopN.h |- Word_Group_Cnt.cpp |- Word_Group_Cnt.h |- WordCount.cpp |- WordCount.h |- pch.cpp |- pch.h |- main.cpp |- WordCount.vcxproj |- cvpr |- Crawler.py |- result.txt
單詞權重計算python
根據我的項目判斷有效單詞的算法進行改進,講按字符串讀取改爲按行讀取,判斷該行是title仍是absract,經過存儲分割符的位置進行切割讀取有效詞並計算權重。
詞組切割
根據用戶輸入決定詞組切割長度,切割過程當中借用隊列輔助存儲每個合法單詞的長度,遇到不合法單詞則能夠將隊列que清空便可,不然就根據詞組單詞組成長度以及隊列存儲的單詞長度進行進隊出隊操做,達到更新string後進行截取(使用substr庫函數)獲得新的詞組存入map容器。c++
爬蟲能力有限orz,只從網站綜合爬取論文的除題目、摘要外其餘信息。爬蟲語言使用python。額外爬取信息有:做者、PDF連接、SUPPPDF連接、ARXIV連接。
txt文件如圖:
git
想象力有限orz,咱們分析了論文列表中各位做者之間的關係,論文A的第一做者可能同時是論文B的第二做者,不一樣論文多位做者之間可能存在着聯繫,並將關係可視化。
咱們從附加功能1的txt文件提取了發表在2018cvpr頂會上的全部論文的第一做者和第二做者,使用分析工具NodeXL作出了關係圖譜。
圖譜全貌以下:
逐漸剔除較少聯繫點的圖譜以下:
github
(沒有第二做者時在第二做者處填empty)算法
能夠看出發表論文最多的做者是Ming-Hsuan Yang,在2018cvpr上一共發表了17篇論文。flask
具體解釋: 使用輔助隊列存儲每一個合法單詞的長度,經過入隊和出隊操做更新string進行截取不斷得到新的詞組;函數詳情在如下.h文件中均有描述;app
/*統計指定長度的合法單詞量造成的詞組詞頻*/ void Word_Group_Cnt(int word_Group_Len, string str, map <string, int > &group_Map,int ttl_Abs) { string word_Now = ""; string word_Group = ""; int lenth = str.length(); queue <int> que; for (int i = 0; i < lenth; i++) { if (Is_Num(str[i]) || Is_Engch(str[i]) && i != lenth - 1) //字符是字母或數字就將其鏈接到word_Now { word_Now += str[i]; continue; } else if (Is_Num(str[i]) || Is_Engch(str[i]) && i == lenth - 1) //字符是字母或數字且爲字段末位鏈接後就須要對末尾的單詞判斷是否爲合法單詞,不然會跳出循環漏掉末尾一個單詞; { word_Now += str[i]; word_Now = Is_Word(word_Now); int word_Len = word_Now.length(); if (word_Len >= 4) { word_Group += word_Now; if (que.size() == word_Group_Len - 1) { group_Map[word_Group] += ttl_Abs; } else if (que.size() > word_Group_Len - 1) { word_Group = word_Group.substr(que.front()); group_Map[word_Group] += ttl_Abs; } } else if (word_Len >= 0 && word_Len < 4) { continue; } } else { word_Now = Is_Word(word_Now); int word_Len = word_Now.length(); if (word_Len >= 4) { word_Group += word_Now; if (que.size() < word_Group_Len - 1) //隊列大小比所需合法單詞數word_Group_Len-1小狀況 { word_Group += str[i]; word_Len += 1; while (!Is_Num(str[i + 1]) && !Is_Engch(str[i + 1]) && i + 1 < lenth) { word_Group += str[i + 1]; word_Len += 1; i += 1; } que.push(word_Len); word_Now = ""; } else if (que.size() == word_Group_Len - 1) //隊列大小=所需合法單詞數word_Group_Len-1狀況 { group_Map[word_Group] += ttl_Abs; word_Group += str[i]; word_Len += 1; while (!Is_Num(str[i + 1]) && !Is_Engch(str[i + 1]) && i + 1 < lenth) { word_Group += str[i + 1]; word_Len += 1; i += 1; } que.push(word_Len); word_Now = ""; } else if (que.size() > word_Group_Len - 1) //隊列大小等於詞組所需合法單詞數量,則對隊列進行進隊和出隊操做更新string並進行截取 { word_Group = word_Group.substr(que.front()); group_Map[word_Group] += ttl_Abs; que.pop(); word_Group += str[i]; word_Len += 1; while (!Is_Num(str[i + 1]) && !Is_Engch(str[i + 1]) && i + 1 < lenth) { word_Group += str[i + 1]; word_Len += 1; i += 1; } que.push(word_Len); word_Now = ""; } } else if (word_Len > 0 && word_Len < 4) //遇到不合法單詞且不是分隔符或空串的,則返回爲no,將隊列清空 { while (que.empty() != 1) { que.pop(); } word_Now = ""; word_Group = ""; } else if (word_Len == 0) { continue; } //是否要判斷在輸入到函數中 } } }
測試的函數及其測試數據構造思路:框架
對於其餘一些函數,由於在計算行數、計算單詞數、計算字符數、詞組切割統計以及詞頻排序中都有調用,而這些函數測試均正確,所以那些簡易的函數的沒有作出測試,經過複雜函數的正確測試間接反應其正確性。
部分代碼展現:
namespace IsWord //判斷是不是單詞 { TEST_CLASS(UnitTest1) { public: TEST_METHOD(TestMethod1) { string word = "123ajlk"; word = Is_Word(word); Assert::IsTrue(word == "no"); } TEST_METHOD(TestMethod2) { string word = "Ajlk"; word = Is_Word(word); Assert::IsTrue(word == "ajlk"); } TEST_METHOD(TestMethod3) { string word = "Ajl"; word = Is_Word(word); Assert::IsTrue(word == "no"); } TEST_METHOD(TestMethod4) { string word = "Ajlk123"; word = Is_Word(word); Assert::IsTrue(word == "ajlk123"); } TEST_METHOD(TestMethod5) { string word = "jl12k23"; word = Is_Word(word); Assert::IsTrue(word == "no"); } }; } namespace Word_Group_Count //詞組切割統計 { TEST_CLASS(UnitTest1) { public: TEST_METHOD(TestMethod1) { map<string, int> m; Word_Group_Cnt(3, "aaaa bbbb cccc cccc bbbb cccc aaaa dddd cccc bbbb aaaa bbbb cccc dddd", m, 10); Assert::IsTrue(m["aaaa bbbb cccc"] == 20 && m["bbbb cccc cccc"] == 10); } TEST_METHOD(TestMethod2) { map<string, int> m; Word_Group_Cnt(4, "aaaa bbbb cccc dddd bbbb cccc aaaa dddd cccc bbbb aaaa bbbb cccc dddd", m, 10); Assert::IsTrue(m["aaaa bbbb cccc dddd"] == 20 && m["bbbb cccc dddd bbbb"] == 10); } TEST_METHOD(TestMethod3) { map<string, int> m; Word_Group_Cnt(2, "aaaa bbbb cccc cccc bbbb cccc aaaa dddd cccc bbbb aaaa bbbb cccc dddd", m, 10); Assert::IsTrue(m["bbbb cccc"] == 30 && m["aaaa bbbb"] == 20); } TEST_METHOD(TestMethod4) { map<string, int> m; Word_Group_Cnt(5, "aaaa (bbbb) cccc cccc bbbb cccc aaaa dddd cccc bbbb aaaa bbbb cccc dddd", m, 10); Assert::IsTrue(m["aaaa (bbbb) cccc cccc bbbb"] == 10 && m["bbbb aaaa bbbb cccc dddd"] == 10); } TEST_METHOD(TestMethod5) { map<string, int> m; Word_Group_Cnt(6, "aaaa (bbbb)-cccc cccc bbbb cccc aaaa dddd cccc bbbb aaaa bbbb cccc dddd", m, 10); Assert::IsTrue(m["aaaa (bbbb)-cccc cccc bbbb cccc"] == 10 && m["aaaa dddd cccc bbbb aaaa bbbb"] == 10); } }; }
代碼覆蓋率:
(兩人提交記錄)
① 佩佩
問題描述:
作過哪些嘗試:
②沸沸
有何收穫:
爬蟲能力提高,搜索能力提高
胡緒佩
佩佩,有太多值得我學習的地方了……好比遇到bug不放棄堅持持續打碼n小時解決,好比遇到問題鑽研求知的精神,好比知難而進的性格,好比在我睡覺的時候把博客發了……好隊友!!!
基本上沒有,除了讓我不要偷偷揹着他打代碼hhhhhhh
莊卉
沸沸,有太多值得我學習的地方了+1......好比看到項目便知道體諒隊友把難點(附加功能)攬下力肝(卉:表示並無完成得很好),好比寫代碼速度老是莫名其妙超快的不知道有何祕訣!好比善於和隊友溝通交流的團隊精神,解決未知困難的能力plusplus,完美解決了本次做業第一第二做者圖譜的這個難點,好比溫柔美麗的氣質......棒隊友!!!
基本上沒有,再有機會緊抱大腿我定牢牢不放xixixixixi
第N周 | 新增代碼(行) | 累計代碼(行) | 本週學習耗時(小時) | 累計學習耗時(小時) | 重要成長 |
---|---|---|---|---|---|
1 | 666 | 666 | 15 | 15 | 複習c++,學習單元測試和代碼覆蓋率,學習git |
2 | 97 | 763 | 4 | 19 | 沒什麼成長,就是在優化代碼 |
3 | 0 | 0 | 10 | 29 | 閱讀《構建之法》第三章和第八章,學習使用Axure RP8,瞭解原型設計的方法 |
4 | 197 | 960 | 20 | 49 | 進一步學習爬蟲(瞭解beautifulsoup使用、學會使用正則),學習使用git進行團隊協做,學習使用NodeXL,瞭解flask |