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

博客連接

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

具體分工

後敬甲負責.txt文件處理中的總行數統計和總字符串的統計,博客一部分撰寫python

Github項目地址

https://github.com/TragedyN/pair-projectgit

PSP表格

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

爬蟲使用

使用python語言實現,其中使用到了requests庫和beautifulsoup庫,主要使用bs的.select函數選擇html中所須要的標籤的id,class屬性,以找到並獲取對應的信息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的代碼簽入記錄

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

  • 困難:
    處理輸入文檔時由於要按照題目要求不能算上每篇文章的title和abstract還有編號的部分,因此和上一回的我的項目仍是有挺多的區別,須要改寫各類統計功能
  • 解決方案:
    經過分析爬蟲下來的結果,獲得了須要統計的部分中不會出現「title」這個信息,利用這個信息能夠快速找出有多少篇論文,而後再根據題意減去對應的字符總數和單詞數
  • 有何收穫
    學習到了分析需求,和利用現有條件,更加簡便和快速的完成需求

評價你的隊友

認真負責,積極跟進做業,雖然如今專業知識還略有不足,可是也有很大進步的空間

學習進度條

第N周 新增代碼(行) 累計代碼(行) 本週學習耗時(小時) 累計學習耗時(小時) 重要成長
4 240 686 10 60 LeetCode代碼練習,爬蟲學習,學習小程序開發文檔
5 320 1006 40 100 學習小程序開發文檔,LeetCode代碼練習

    

參考

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

相關文章
相關標籤/搜索