201671010447楊露露 實驗二詞頻統計軟件項目報告

一:詞頻統計我的小型項目

1.需求分析

爲了練習軟件的我的開發流程,設計一個關於詞頻統計的小程序,在詞頻統計的小程序中須要實現的功能具體有:git

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

2.功能詳細設計

2.1文件讀入功能的設計

將已經存在的.txt文件讀入到程序中,將文件讀入時存放在緩衝池中,而且在文件讀入的時候過濾掉文件中的一些標點符號和一些數字,只讀入一些單詞,

在文件讀入過程當中必定注意文件讀入流的使用,文件路徑也選取相對路徑,提升文件讀入的健壯性,在不一樣的環境中也可以成功的讀入文件。經過使用集合的方式將文件的內容讀進以後存放在集合中,這次程序使用的是Map集合,這樣能夠在後面查找單詞的時候能夠經過鍵值對的方式來查找,而且在存放過程當中經過<key,value>的方式存放單詞方便遍歷的時候取值。在存放的時候,將相同的單詞計數,單詞做爲key值,單詞的數量做爲value值存放在集合中。github

2.2單個單詞的個數查找

在這個功能的設計中須要前面的存放在TreeMap集合裏面的單詞,在用戶在控制檯輸入想要查找的單詞後其實在後臺看到的是一串的字符串,經過指定的標點符號截取,將用戶輸入的字符串存放在String類型的數組裏面,經過equal與以前存放在集合中的單詞比較,在查找到相同的單詞的同時,經過key找到相應的value,而且返回一個單詞的個數給控制檯。算法

2.3單詞頻數存入文件

將集合中的單詞存放在文件中,此時須要的是文件的寫入功能,經過FileWriter類中的write方法將集合中的數據寫入到文件中,首先須要的是將集合中的數據遍歷出來,經過迭代器的方式遍歷,存放以後回滾。小程序

2.4柱狀圖的顯示

在用戶查找完單詞以後控制檯顯示的是查找出來的個數,經過繼承JFrame類建立可視化圖像界面,在建立的界面中設計柱狀圖,在柱狀圖的方法中首先要拿到用戶查找的單詞與查找到單詞的個數,在經過Graphics2D方法建立二維的柱狀圖。數組

3.重點代碼

3.1文件存放集合中:經過集合的方式存放。

String line = "src/yll/com/test1/word.txt";
            File file = new File(line);
            InputStreamReader isr = new InputStreamReader(new FileInputStream(file), "utf-8");
            BufferedReader reader = new BufferedReader(isr);
            
            //將文本中的英文詞語放在集合裏面
             tm = new TreeMap<String,Integer>();
            
            while((line=reader.readLine())!=null){
                line = line.toLowerCase();//忽略大小寫
                
                String[] str = line.split("[^a-zA-Z]");//過濾出只含有字母的  
                  
                for(int i = 0; i<str.length; i++){
                    String word = str[i].trim();
                    if(tm.containsKey(word) &&  word.length() != 0){
                        tm.put(word, tm.get(word)+1);
                    }else{
                        tm.put(word, 1);
                    }
                }
            }

3.2 單個詞的顯示

//查找單詞以後進行與詞羣裏面查找單詞的個數
            public String[]  bijiao(TreeMap<String, Integer> tm,String s) {//在這個方法中,須要傳入的是以前存入單詞的集合,用戶輸入的字符串
                TreeMap<String,Integer> map1 = new TreeMap<String, Integer>();  
                String[] word= s.split(";");//經過分號來截取用戶傳入的字符串
                int i;
                for(i=0; i<word.length; i++) {
                    for(Entry<String,Integer> entry : tm.entrySet()) { 
                        if(word[i].equals(entry.getKey()))//與集合中的單詞比較
                        {
                            map1.put(entry.getKey(), entry.getValue());
                            System.out.println(entry.getKey() + "的個數是" + entry.getValue()); 
                            break;
                        }
                    } 
                }
                return word;
                
            }

4.測試

4.1單個單詞個數的查找與柱狀圖的顯示

柱狀圖:
網絡

4.2文件的寫入

存入成功的顯示
學習

4.3高頻詞的顯示

5.展現PSP,這個環節重要的是讓本身看到本身的估計和實際消耗時間,哪一個環節耗時最多,哪一個環節估計和實踐相差巨大?爲何?

PSP階段 任務內容 計劃共完成須要的時間(min) 實際完成須要的時間(min)
Planning 計劃 6 9
Estimate 估計這個任務須要多少時間,並規劃大體工做步驟 8 12
Development 開發 200 340
Analysis 需求分析 (包括學習新技術) 10 30
Design Spec 生成設計文檔 20 30
Design Review 設計複審 (和同窗審覈設計文檔) 3 5
Coding Standard 代碼規範 (爲目前的開發制定合適的規範) 10 9
Design 具體設計 20 25
Coding 具體編碼 200 260
Code Review 代碼複審 30 40
Test 測試(自我測試,修改代碼,提交修改) 18 40
Reporting 報告 18 25
Test Report 測試報告 5 6
Size Measurement 計算工做量 2 3
Postmortem & Process Improvement Plan 過後總結 ,並提出過程改進計劃 10 30

在這個項目的實現中,主要時間花費在代碼的實現中,開始的時候整個沒有思路,讀了好幾遍老師的要求,理清項目以後思考這個代碼實現所要用到的算法具體會有那些,因爲以前沒有怎麼寫過AWT相關的代碼,本身查找書和網絡瞭解和實現了一下AWT,在柱狀圖的實現中縱座標數值的設置那塊出了不少的錯,主要是縱座標的公式的不理解。
在文件寫入功能中,一直獲取不到集合中的數據,也不報錯,經過Debug 方式一步一步查找問題的所在。測試

查看源代碼:https://github.com/yanglulu-yang/WordCount編碼

相關文章
相關標籤/搜索