201671030116宋菲菲 詞頻統計軟件項目報告

項目要求
源碼地址 html

1、需求分析

嘗試按照《構建之法》第2章中2.3所述PSP流程,使用JAVA編程語言,獨立完成一個英文文本詞頻統計的軟件開發。軟件基本功能要求以下:

  • 程序可讀入任意英文文本文件,該文件中英文詞數大於等於1個。
  • 程序須要很壯健,能讀取容納英文原版《哈利波特》10萬詞以上的文章。
  • 指定單詞詞頻統計功能:用戶可輸入從該文本中想要查找詞頻的一個或任意多個英文單詞,運行程序的統計功能可顯示對應單詞在文本中出現的次數和柱狀圖。
  • 高頻詞統計功能:用戶從鍵盤輸入高頻詞輸出的個數k,運行程序統計功能,可按文本中詞頻數降序顯示前k個單詞的詞頻及單詞。
  • 統計該文本全部單詞數量及詞頻數,並能將單詞及詞頻數按字典順序輸出到文件result.txt。

2、功能設計

  • 讀取文件text.txt,能容納10萬單詞以上。
  • 統計詞頻,能夠分解輸入字符串並統計輸入一個或多個單詞的詞頻。
  • 統計高頻詞,用戶輸入高頻詞個數n,程序返回n個高頻詞以及每一個單詞的詞頻。
  • 將text.txt文本中的單詞及其詞頻按照字典順序輸出到文件result.txt文件中。

3、設計實現

項目主要包含兩個類,一個是主函數Main,一個是統計單詞的類SortResult。

  • 主函數Main中實現圖形用戶界面,實現各個功能。輸入框3個,分別是原文本文件的文件名(採用相對路徑),想要查找的一個或多個單詞,想要查找的N高頻詞及其詞頻數。兩個按鈕,分別是「肯定」和「取消」。因爲兩個查找在同一個面板,防止出現衝突,若兩個輸入框均有輸入,則實現第一個輸入框的功能。點擊肯定後,直接將字典順序輸出到result.txt文本中,而且實現相應功能。
  • SortResult中將文本中的每一個單詞按照字典順序將單詞及詞頻數輸出到result.txt文本文件中。

4、測試運行

讀入text.txt文件,輸入要查找的一個或多個詞語,以空格爲分割符,返回各個單詞的詞頻及柱狀圖:

輸入想要查找的高頻單詞個數n,輸出前n個高頻詞及其頻數:

若同時輸入了查找單詞和查找高頻單詞個數,只執行查找單詞功能:

result.txt

5、部分代碼


輸出柱狀圖:

int i;
                String print = "";//記錄輸入單詞及詞頻
                String print2 = "\n";//記錄柱狀圖
                for(i=0; i<input.length; i++) 
                {
                    for(Entry<String, Integer> entry : wordsStatistics.entrySet()) 
                    { 
                        if(input[i].equals(entry.getKey()))
                        {
                            map.put(entry.getKey(), entry.getValue());

                            print2+=entry.getKey()+":\n";
                            for(int j=0;j<entry.getValue()/100;j++)
                                print2+="*";//柱狀圖以「*」顯示
                            print2+="\n";
                            print += entry.getKey() + ":" + entry.getValue()+"    "; 
                            break;
                        }
                     } 
                 }
                JOptionPane.showConfirmDialog(null, print+print2,"結果",JOptionPane.DEFAULT_OPTION);

輸出高頻詞:

if(admin.isEmpty() && !num.isEmpty()) //若輸入單詞欄爲空且輸入高頻詞個數不爲空
            {
                int n=Integer.parseInt(num);//將讀到的字符串轉化爲整型
                String print = "";
                ArrayList<Map.Entry<String,Integer>> resultlist = new ArrayList<Map.Entry<String,Integer>>(wordsStatistics.entrySet());//結果存入 resultlist
                
                Collections.sort(resultlist,new Comparator<Map.Entry<String,Integer>>(){  
                    @Override  
                    public int compare(Entry<String, Integer> w1, Entry<String, Integer> w2) {  
                        return w2.getValue() - w1.getValue();    //以降序的形式存入
                    }  
                }); 
                
                for(int i = 0; i<n; i++){  
                    print += resultlist.get(i).getKey()+ ": " +resultlist.get(i).getValue()+"    ";
                }
                JOptionPane.showConfirmDialog(null, print,"結果",JOptionPane.DEFAULT_OPTION);
                
            }

6、總結

  • 本次項目爲單人項目,經過實踐,大體瞭解了軟件項目我的開發流程。從需求分析到設計實現再到測試運行,這次項目實驗讓我體驗了每個步驟的具體實現。
  • 學會了在Github上發佈軟件項目的操做方法。
  • 項目完成後還有許多地方不足,好比柱狀圖沒有用圖形的樣式表現出來。
  • 本次項目完成時的模塊劃分能力有所欠缺,只有兩個模塊,功能實現Main和字典輸出到文本,多數功能都在Main中直接編碼調用。

7、PSP

實際完成時間(min) 計劃完成時間(min) 任務內容 PSP2.1
28 20 計劃 Planning
28 20 估計這個任務須要多少時間,並規劃大體工做步驟 Estimate
1020 674 開發 Development
30 20 需求分析(包括學習新技術) Analysis
35 20 設計 Design
22 10 設計複審 Design Review
5 4 代碼規範 Coding Standard
58 60 具體設計 Design
720 480 具體編碼 Coding
120 60 代碼複審 Code Review
30 20 測試 test
65 60 報告 Reporting
30 30 測試報告 Test Report
20 20 計算工做量 Size Measurement
15 10 過後總結,病提出過程改進計劃 Postmortem & Process Improvement Plan

經過總結,發現本次項目的計劃時間與實際完成時間出入比較大,尤爲在具體編碼方面,體現了個人動手編寫代碼能力不足,須要增強,也是由於設計的時候沒有細化,不夠完善,致使編寫代碼時不順利。在從此的學習中,但願能夠增強個人項目具體設計能力及編程能力。java

相關文章
相關標籤/搜索