2018軟工實踐做業五之結對做業2

博客連接

劉浩:http://www.javashuo.com/article/p-wheluewc-bw.html
後敬甲:http://www.javashuo.com/article/p-vggafcmt-ds.htmlhtml

具體分工

後敬甲:對爬取文本的字符統計、有效行統計、單詞統計;
劉浩:文章的爬取、附加題、詞頻統計、博客主要撰寫;python

Github項目地址

https://github.com/tsf2016/pair-projectc++

PSP表格

解題思路描述與設計實現說明

爬蟲使用

使用python語言實現,其中使用到了requests庫和beautifulsoup庫,主要使用bs的.select函數選擇html中所須要的標籤的id,class屬性,以找到並獲取對應的信息git

代碼組織與內部實現設計(類圖)

主要流程圖以下
github

說明算法的關鍵與關鍵實現部分流程圖

處理自定義輸入

簡單使用條件語句逐個判斷輸入的參數,分析其對應的功能,並給出可能發生的錯誤分析算法

while (argv[p] != NULL) {
        if (argv[p][0]!= '-') {
            printf("錯誤輸入格式\n");
            return -1;
        }
        else if(argv[p][1]=='i'){
            if (argv[p + 1] == NULL) {
                printf("缺乏輸入路徑\n");
                return -1;
            }
            ipath = argv[p + 1];//輸入.txt文件的路徑
            p=p+2;
            continue;
        }
        else if (argv[p][1] == 'o') {
            if (argv[p + 1] == NULL) {
                printf("缺乏輸出路徑\n");
                return -1;
            }
            opath = argv[p + 1];//輸出.txt文件的路徑
            p = p + 2;
            continue;
        }
        else if (argv[p][1] == 'n') {
            if (argv[p + 1] == NULL) {
                break;
            }
            if (isdigit(argv[p + 1][0]) == NULL) {
                p++;
            }
            else {
                diy = atoi(argv[p + 1]);//詞頻輸出個數
                p = p + 2;
            }
            continue;
        }
        else if (argv[p][1] == 'm') {
            if (argv[p + 1]== NULL) {
                break;
            }
            if (isdigit(argv[p + 1][0]) == NULL) {
                p++;
            }
            else {
                if (atoi(argv[p + 1]) < 2 || atoi(argv[p + 1]) > 10){
                    printf("錯誤詞組長度");
                    return -1;
                }
                cizulen = atoi(argv[p + 1]);//詞組長度
                p = p + 2;
            }
            continue;
        }
        else if (argv[p][1] == 'w') {
            if (argv[p + 1] == NULL || (atoi(argv[p + 1])!=1 && atoi(argv[p + 1])!=0)) {
                printf("錯誤權重\n");
                return -1;
            }
            weight = atoi(argv[p + 1]);//詞頻權重
            p = p + 2;
            continue;
        }
        else {
            printf("錯誤參數\n");
            return -1;
        }
    }

統計字符數

int character(char* path) {
    /*
    ifstream 讀取文件路徑
    逐個讀取字符數,統計讀入的全部字符
    將全部字符鏈接後按分割符進行分割,將一個個子字符串放入vector中
    /*
    for (vector<string>::size_type i = 0; i != split.size(); ++i) {
    //逐個讀入子字符串,計算子字符串爲「Title「的次數,
        string key = split[i];
        if (i+2<=split.size()&&split[i + 1] == "Title"&&key.size() <= 3) {
            //字符數還要減去Title前的文章編號
            count = count - key.size()-1;
            //cout << count << endl;
        }   
        if (m1.count(key) == 0)
        {
            m1.insert(pair <string, int>(key, 1));
        }
        else
        {
            m1[key]++;
        }
    }
    /*
    由於Title不會在正文(須要統計的範圍)中出現,
    而每個Title對應着一個一樣不須要統計的Abstract,按照題意每一篇文章要減去17個字符
    */
    count = count - m1["title"] * 17;
    return count;
}

統計單詞數

與統計字符數原理類似,也是算出總的單詞數而後再減去出現的Title和Abstract的次數,還有兩論文之間的換行網絡

統計詞頻輸出

附加題設計與展現

  • 設計的創意獨到之處
    • 分析論文列表中各位做者之間的關係,論文A的第一做者可能同時是論文B的第二做者,不一樣論文多位做者之間可能存在着聯繫
    • 對數據的圖形可視化作出一些努力,好比對上一條功能能夠造成關係圖譜
  • 實現思路-
    利用爬蟲獲取每篇文章的做者信息,存入.txt文件中,再利用excel讀取.txt信息,按照文章次序和第一做者,第二做者這樣的排序來整理,以後再利用gephi工具讀取要處理的excel文件,利用該工具自帶的功能實現做者之間的關係網絡力向圖
  • 實現成果展現
    做者權重

    效果局部圖

關鍵代碼解釋

int character(char* path) {
    /*
    ifstream 讀取文件路徑
    逐個讀取字符數,統計讀入的全部字符
    將全部字符鏈接後按分割符進行分割,將一個個子字符串放入vector中
    /*
    for (vector<string>::size_type i = 0; i != split.size(); ++i) {
    //逐個讀入子字符串,計算子字符串爲「Title「的次數,
        string key = split[i];
        if (i+2<=split.size()&&split[i + 1] == "Title"&&key.size() <= 3) {
            //字符數還要減去Title前的文章編號
            count = count - key.size()-1;
            //cout << count << endl;
        }   
        if (m1.count(key) == 0)
        {
            m1.insert(pair <string, int>(key, 1));
        }
        else
        {
            m1[key]++;
        }
    }
    /*
    由於Title不會在正文(須要統計的範圍)中出現,
    而每個Title對應着一個一樣不須要統計的Abstract,按照題意每一篇文章要減去17個字符
    */
    count = count - m1["title"] * 17;
    return count;
}

性能分析與改進

減小不一樣功能對讀入字符後的操做,如只記錄字符數的話就不須要將字符串統一轉小寫,若只記錄單詞數的話就不須要放入map中等等
* 性能分析圖

* 調用最大資源的函數
函數

單元測試

* TestMethod1:空文本
* TestMethod2:單字符文本
* TestMethod3:全空格文本
* TestMethod4:非字母與數字文本
* TestMethod5:單詞所有大寫文本
* TestMethod6:單詞數字開頭文本
* TestMethod7:最後一行有換行
* TestMethod8:單詞長度小於4
* TestMethod9:漢字文本名
* TestMethod10:無輸入

貼出Github的代碼簽入記錄

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

  • 困難:
    一開始負責所有的文本處理模塊,遇到許多算法的困難,最後也獨立實現了所有的功能,可是詞頻統計使用告終構體結點優先隊列來對詞組排序,算法時間複雜度太大,致使存在數據量過大就會超時的問題。
  • 解決方案:
    採用了劉浩同窗的版本,使用了c++的stl容器,解決了超時的問題。
  • 有何收穫
    在整個算法實現過程當中,使用了switch語句實現了有窮自動機、哈希算法存儲詞組、優先隊列對結構體結點排序,對之前的知識有了個回顧;對於存在問題的詞頻統計功能,經驗上應該更仔細地閱讀需求、估計時間複雜度,算法上學習了c++的map容器和vector容器。
  • 評價你的隊友
    有很強的快速學習能力,專業能力強,學習的態度和方法都是我學習的榜樣。

學習進度條

第N周 新增代碼(行) 累計代碼(行) 本週學習耗時(小時) 累計學習耗時(小時) 重要成長
4 0 340 5 25 Leangoo工具的學習
5 300 640 15 40 哈希算法、優先隊列、結構體等c++算法複習

    

參考

[關係圖譜] 一.Gephi經過共線矩陣構建知網做者關係圖譜
https://blog.csdn.net/eastmount/article/details/81746650工具

相關文章
相關標籤/搜索