201671030108後新莉+《英文文本統計分析》結對項目報告

項目 內容
這個做業屬於哪一個課程 2016級軟件工程
這個做業的要求在哪裏 第四次做業要求
課程學習目標 熟悉軟件開發總體流程,提高自身能力
本次做業在哪一個具體方面幫助咱們實現目標 第一次體驗一個完整的工程

任務一:

點評的博客:201671030103仇素龍實驗二詞頻統計軟件項目報告html

點評博客的代碼的github連接地址:實驗二代碼git

點評內容:1.本篇博客寫的很認真,排版也比較清晰,老師所要求的基本功能也都基本實現了。可是仍是存在一些問題。首先是實驗結果的截圖result.txt文件不該該在Java界面直接給出,而是應該寫在單獨的文本文件中。再一個「結果發現此次程序設計包含的模塊其實很清楚」,由此句話能夠看出來博主在編寫程序的時候沒有作好充分的準備就寫代碼,這是不對的,然後面博主在進行了需求分析等一系列工做以後對本身要編寫的代碼也有了清楚的瞭解這點很好。最後,在PSP部分,博主在「估計這個任務須要多少時間,並規劃大體工做步驟」的時候預估會花費20分鐘,這顯然是不合適的,還但願博主之後可以進行合理的PSP規劃。2.在運行對方的代碼的時候,學到了不少知識。我在第二個實驗的時候沒有實現柱狀圖的統計這一個功能,可是對方卻用了一個簡單的方法用「X」的多少來表明其柱的長短,這也是一種方法。這讓我知道了有時候在咱們遇到不會解決或者沒辦法解決的問題的時候咱們能夠試着去換一個思路,說不定效果就比咱們預期的要好不少。

點評心得:經過閱讀對方的博客和查看代碼,能夠學到不少本身沒有注意到或欠缺的東西,好比進行一個項目以前如何很好的進行需求分析,需求分析和任務分配對後續的代碼實現部分有多大的影響。在實現的時候遇到本身沒有辦法實現的功能要求的時候能夠轉換本身的想法,用簡單易懂的方法來代替沒有辦法完整描述的功能。上一次的實驗咱們兩個都沒有實現人機交互界面,因此在此次的實驗中咱們兩個在這一方面下了很大的功夫來進行學習和改善,進咱們最大的努力實現了人機交互界面。

任務二:

1、項目要求

  • 項目相關要求
    (1)結對合做開發進度計劃的要求:在項目正式開發以前,預估本次合做開發任務的PSP環節的消耗時間,並在PSP過程當中統計實際耗時,填寫PSP表格。
    (2)嘗試採用漢堡包法實施項目結對中兩我的的溝通。
    (3)理解領航員和駕駛員兩種角色關係:兩人都必須參與程序的編碼工做,在結對編程中兩我的輪流作對方的角色。
    (4)github倉庫中的代碼提交要體現兩人合做過程,不能只看到最終的代碼,至少有三次以上的代碼簽入記錄, 能顯示代碼從最初的基本框架, 基本功能,到所有功能實現的構建過程 。
    (5)編撰兩人合做開發遵照共同承認的編碼規範,並提交編碼規範文檔到github項目倉庫根目錄下。
    (6)將包含任務2的源碼以增量方式提交到指定同窗註冊Github帳號下的項目倉庫中,要求項目倉庫中要能看到項目屢次commit的記錄,同時必須有兩我的各自的commit記錄。

2、實現過程

需求分析:

  • (1)實驗2要求的功能;
    (2)單詞頻數可視化柱狀圖要求是如下樣式:

    (3)統計該文本行數及字符數;
    (4)各類統計功能均提供計時功能,顯示程序統計所消耗時間(單位:ms);
    (5)可處理任意用戶導入的任意英文文本;
    (6)人機交互界面要求GUI界面(WEB頁面、APP頁面均可);
    (7)附加分功能:統計文本中除冠詞、代詞、介詞以外的高頻詞;
    (8)附加分功能:統計前10個兩個單詞組成的詞組頻率。

軟件設計:使用類圖

  • 類圖的關係以下:

核心功能代碼展現:展現核心功能代碼

(1)單詞頻數利用可視化柱狀圖實現github

public JFreeChart ShowCountHistogram(BufferedReader bufferedReader) throws IOException {                
    CategoryDataset dataset = getDataSet(bufferedReader);
    JFreeChart chart = ChartFactory.createBarChart3D(
                         "英文文本詞頻統計圖",           // 圖表標題
                        "單詞名稱",                     // 目錄軸的顯示標籤
                        "次數",                       // 數值軸的顯示標籤
                        dataset,                    // 數據集
                        PlotOrientation.VERTICAL,   // 圖表方向:水平、垂直
                        true,                       // 是否顯示圖例(對於簡單的柱狀圖必須是false)
                        false,                      // 是否生成工具
                        false                       // 是否生成URL連接
                        );                                                  
    CategoryPlot plot=chart.getCategoryPlot();      //獲取圖表區域對象
    CategoryAxis domainAxis=plot.getDomainAxis();   //水平底部列表
     domainAxis.setLabelFont(new Font("黑體",Font.BOLD,14));       //水平底部標題
     domainAxis.setTickLabelFont(new Font("宋體",Font.BOLD,12));   //垂直標題
     ValueAxis rangeAxis=plot.getRangeAxis();//獲取柱狀
     rangeAxis.setLabelFont(new Font("黑體",Font.BOLD,15));
      chart.getLegend().setItemFont(new Font("黑體", Font.BOLD, 15));
      chart.getTitle().setFont(new Font("宋體",Font.BOLD,20));     //設置標題字體
    return chart;
}

(2)統計文本中除冠詞、代詞、介詞以外的高頻詞的實現算法

public Map<String, Integer> selectExceptFunctionWord(BufferedReader bufferedReader) throws IOException {
    Map<String, Integer> map = this.selectWordCountByDOrder(bufferedReader);
    Map<String, Integer> exceptFunction = new LinkedHashMap<String, Integer>();
    for (Map.Entry<String, Integer> w :map.entrySet())  {
        if(!w.getKey().equals("the")&&!w.getKey().equals("is")&&!w.getKey().equals("you")&&!w.getKey().equals("yourself")&&!w.getKey().equals("your")&&!w.getKey().equals("them")&&!w.getKey().equals("their")&&!w.getKey().equals("to")&&!w.getKey().equals("by")&&!w.getKey().equals("is")&&!w.getKey().equals("a")&&!w.getKey().equals("and")&&!w.getKey().equals("was")&&!w.getKey().equals("has")&&!w.getKey().equals("had")&&!w.getKey().equals("I")&&!w.getKey().equals("for")&&!w.getKey().equals("my")&&!w.getKey().equals("me")&&!w.getKey().equals("with")&&!w.getKey().equals("of")&&!w.getKey().equals("in")&&!w.getKey().equals("on")&&!w.getKey().equals("that")&&!w.getKey().equals("it")&&!w.getKey().equals("The")&&!w.getKey().equals("at")&&!w.getKey().equals("which")&&!w.getKey().equals("he")&&!w.getKey().equals("as")
                 &&!w.getKey().equals("but")&&!w.getKey().equals("his")&&!w.getKey().equals("from")&&!w.getKey().equals("some")&&!w.getKey().equals("be")&&!w.getKey().equals("were")&&!w.getKey().equals("not") &&!w.getKey().equals("they")&&!w.getKey().equals("this")&&!w.getKey().equals("an")&&!w.getKey().equals("no")&&!w.getKey().equals("into")&&!w.getKey().equals("It")&&!w.getKey().equals("there")&&!w.getKey().equals("But")&&!w.getKey().equals("him")&&!w.getKey().equals("could")&&!w.getKey().equals("been")&&!w.getKey().equals("would")&&!w.getKey().equals("she")&&!w.getKey().equals("then")&&!w.getKey().equals("Then")&&!w.getKey().equals("have"))
                {
            
            exceptFunction.put(w.getKey(), w.getValue());
        }}
    

    return exceptFunction;
}

(3)降序排列數據庫

public Map<String, Integer> selectWordCountByDOrder(BufferedReader bufferedReader) throws IOException {
    Map<String, Integer> map = this.AllWordCount(bufferedReader);
    List<Map.Entry<String, Integer>> nlist = new LinkedList<Map.Entry<String, Integer>>(map.entrySet());
    Collections.sort(nlist, new Comparator<Map.Entry<String, Integer>>()
    {
        @Override
        public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2)
        {
            int compare = (o1.getValue()).compareTo(o2.getValue());
            return -compare;
        }
    });

    Map<String, Integer> result = new LinkedHashMap<String, Integer>();
    for (Map.Entry<String, Integer> entry : nlist) {
        result.put(entry.getKey(), entry.getValue());
    }
    
    return result;
}

程序運行:程序運行時每一個功能界面截圖

  • 主界面:
    編程

  • 獲取文本行數的結果:
    數據結構

  • 獲取文本字符數:
    框架

  • 獲取詞頻按照字典順序排序:
    dom

  • 讀取文本詞頻獲取柱狀圖:
    數據結構和算法

  • 讀取指定單詞出現次數:

  • 讀取文本得到前K個高頻詞

  • 獲取文本降序排列

  • 讀取冠詞、介詞、代詞之外的高頻詞

描述結對的過程,提供兩人在討論、細化和編程時的結對照片(非擺拍)

  • 一、咱們兩個在編程中的照片

二、對對方的評價

(1)是一個友善的人,願意合做與交流,在與個人合做學習和探究活動中,能選擇本身擅長的方式(語言、文字、圖表等)表述研究過程和結果;主動提供本身的資料和想法,與我分享本身智慧,思路,體驗合做的愉快。能傾聽和尊重我提出的不一樣觀點和評議,能對研究過程和結果進行評議,並與我交換意見,充分體現結對編程的價值。

(2)是個謙遜的人,在與個人合做交流中,咱們作到相互尊重,相互信賴,認真傾聽對方意見,敢於認可本身的不足,有虛心向對方學習請教的良好風尚,能在合做交流中正確地評價本身和他人,學會分享他人成功的喜悅。可以在合做交流中明確本身的責任,並履行本身承擔的職責。具備與他人進行合做交流的態度與能力。

(3)有集體責任感,善於合做。在合做學習中充分發揮本身的特長,爲實現集體目標做出了貢獻。積極搜索資料,善於彼此分享交流,有無私的精神。尊重並理解他人,具備創新精神和動手操做能力,養成了合做交流的習慣。

(4)在結對合做學習過程當中,能創造和諧的氣氛,促進小組成員之間和諧的共同的完成各自任務,爲養成健全人格奠基了基礎。能爲研究活動準備、計劃,全面統籌的能力獲得了鍛鍊;能總結「‘共同解決了什麼問題、小組還有什麼問題沒有解決?」「咱們小組作得最好的是哪些人?還有哪方面他們可以作得更好?」具備必定的領導才能。

三、對方編程習慣總結
個人搭檔仇素龍同窗編程很是規範,有着必定的編程水準,代碼完整規範。並且具備必定的數據結構和算法功底,在此次項目的編寫過程當中數據庫的基礎都獲得充分的體現。雖然編寫代碼速度不快,可是程序執行起來效率高,審覈代碼得時候也比較快,和她搭檔很是舒服,是我學習的榜樣。

提供這次結對做業的PSP

PSP2.1 任務內容 計劃共完成須要的時間(h) 實際完成須要的時間(h)
Planning 計劃 0.4 0.4
Estimate 估計這個任務須要多少時間,並規劃大體工做步驟 15 20
Development 開發 2 3
Analysis 需求分析 (包括學習新技術) 5 6
Design Spec 生成設計文檔 2 1.5
Design Review 設計複審 (和同事審覈設計文檔) 1 1
Coding Standard 代碼規範 (爲目前的開發制定合適的規範) 0.5 0.5
Design 具體設計 5 5
Coding 具體編碼 15 18
Code Review 代碼複審 0.5 0.5
Test 測試(自我測試,修改代碼,提交修改) 0.5 0.5
Reporting 報告 1 2
Test Report 測試報告 0.5 0.5
Size Measurement 計算工做量 0 0
Postmortem & Process Improvement Plan 過後總結 ,並提出過程改進計劃 0.5 0.5
  • 本次項目總結和反思:
    首先經過這篇博文咱們對結對編程有了進一步的認識,實際操做的時候,分工跟預想的並不徹底同樣,咱們首先討論出了具體的編程想法,因爲咱們兩個的編程能力都不太好,其中一些代碼的實現花費了不少時間,可是兩我的學習總比一我的的學習效率高。最後仍是完整的寫出了此次項目。談下結對編程的優缺點吧,首先說優勢。第1、能夠發散思惟,兩我的一個小時能討論出來的東西,或許一我的一個星期都無法想出來。第2、能夠減小代碼複審率,當一我的寫出一段代碼的時候,另外一我的做爲旁觀者每每更容易發現其中的問題。第3、在技術互補的狀況下,能夠很大程度的提升效率。其次是缺點,最大的問題就是數據結構的問題,雖然在面向對象的框架下,均可以寫各自的類和方法,可是核心代碼對其餘函數的調用仍是不少的,因爲互相不熟悉變量名稱和效果,傳值時還須要本身來寫,這個很麻煩。好比仇素龍設計核心代碼時,用到我寫的外部函數,就得詢問我,或者直接讓我來寫調用了。另外一個問題就是效率問題,有時候因爲工做的重複性以及討論的不恰當性,會致使達不到1+1>2的效果。總的說來,我從軟件工程這門課程裏獲得的收穫是很是大的,雖然須要不少的時間,可是經過完成項目,不只能夠學到技術知識,並且更得到了許多寶貴的合做經驗,更收穫了深厚的友誼。
  • 本次項目源碼在此處查看
相關文章
相關標籤/搜索