201671030128+词频统计软件项目报告
一.需求分析
根據實驗二 軟件工程個人項目的要求本次軟件項目的需求有以下幾點:
1.程序可讀入任意英文文本文件,該文件中英文詞數大于等于1個,程序需要很壯健,能讀取容納英文原版《哈利波特》10萬詞以上的文章。
2.指定單詞詞頻統計功能:用戶可輸入從該文本中想要查找詞頻的一個或任意多個英文單詞,運行程序的統計功能可顯示對應單詞在文本中出現的次數和柱狀圖。
3.高頻詞統計功能:用戶從鍵盤輸入高頻詞輸出的個數k,運行程序統計功能,可按文本中詞頻數降序顯示前k個單詞的詞頻及單詞。
4.統計該文本所有單詞數量及詞頻數,并能將單詞及詞頻數按字典順序輸出到文件result.txt。
二.功能設計
1.對于需求1、需求4需要有讀入文本數據、向文本輸出數據的功能。
2.對于需求3和需求4需要有排序的功能
3.整個項目要求有對詞頻進行統計的功能
三.設計實現
1.本次項目有兩個類:
(1)main.java主要實現文本讀入和功能選擇的功能,根據用戶輸入的選擇調用function.java中相應的功能函數。
(2)function.java實現排序(sort函數),查找單詞詞頻顯示柱狀圖(find函數),輸出前n個高頻詞(print函數),單詞及詞頻數按字典順序輸出到文件result.txt(Sort函數)四個主要功能。
2.數據結構:
本次項目采用TreeMap存儲從文本讀入的數據,用LinkedList進行詞頻排序。
3.流程圖:
本項目總的流程圖為:
四.測試運行
1.顯示單詞詞頻和柱狀圖
2.輸出前K個高頻詞
3.向result.txt寫入單詞和詞頻
五.主要代碼
1.文件讀入并統計詞頻
// 讀取要處理的文件BufferedReader b = new BufferedReader(new FileReader("src/HarryPotter.txt"));//<單詞:詞頻>Map<String, Integer> map = new TreeMap<String, Integer>();String value= b.readLine();while (value!= null) {//處理標點符號String[] words = value.split("[【】、.。,\"!--;:?\'\\] ]"); for (int i = 0; i < words.length; i++) {//將大寫字母轉換為小寫字母String key = words[i].toLowerCase();if (key.length() > 0) {if (!map.containsKey(key)) {map.put(key, 1);} else { int k = map.get(key)+1;// 如果不是第一次出現,就把k值++map.put(key, k);}}} value = b.readLine();}2.按詞頻或字母排序
Set<Entry<String,Integer>> m= map.entrySet(); LinkedList<Entry<String, Integer>> List = new LinkedList<Entry<String,Integer>>(m);//按值排序if(a==2) {Collections.sort(List, new Comparator<Entry<String,Integer>>() { public int compare(Entry<String, Integer> a, Entry<String, Integer> b) { return b.getValue().compareTo(a.getValue()); } }); //按鍵排序else if(a==3) {Collections.sort(List, new Comparator<Entry<String,Integer>>() { public int compare(Entry<String, Integer> a, Entry<String, Integer> b) { return a.getKey().compareTo(b.getKey()); } }); }//排序后存入Map中for(Entry<String,Integer> entry: List) { Map.put(entry.getKey(), entry.getValue()); } }3.向文件寫入單詞詞頻
//創建文件File file = new File("result.txt");//向文件寫入FileWriter f = new FileWriter(file.getAbsoluteFile());for(Entry<String,Integer> w: Map.entrySet()) {f.write(w.getKey() + "/" + w.getValue()+" ");}f.close();System.out.println("結束!");六.總結
1.本次項目中各功能在function類中,用函數實現各個功能,通過用戶輸值調用相應的功能,以此來實現模塊化。
2.在剛開始設計讀入文件數據的時候,打算采用二維數組存放單詞,相應的一維數組存放個數,但發現數組太大,而且在進行排序的時候不方便因此采用了<鍵:值>的映射存放數據。
3.在進行柱狀圖繪制時,由于除以500后的小數無法表示,只能表示出大概的趨勢。
七.PSP
| 計劃 | 5 | 3 |
| 規劃工作步驟 | 10 | 7 |
| 開發 | 173 | 202 |
| 需求分析 | 10 | 15 |
| 生成文檔 | 5 | 10 |
| 設計復審 | 3 | 2 |
| 代碼規范 | 20 | 15 |
| 具體編碼 | 100 | 120 |
| 代碼復審 | 10 | 5 |
| 測試 | 25 | 40 |
| 報告 | 15 | 12 |
| 測試報告 | 5 | 7 |
| 計算報告量 | 5 | 2 |
| 事后總結 | 5 | 3 |
從表中可以看出在編碼階段時間較多且和自己估計的時間差距較大,主要是在進行數據結構的選擇上錯誤,浪費大量時間進行修改,并且由于長時間沒有使用Java,所有有些生疏,在測試階段時間也比較長,自己開始的邏輯上有些混亂導致結果不正確顯示,一步步的調試最終實現了相應功能。
點擊源碼可查看項目源代碼
轉載于:https://www.cnblogs.com/zhoulin52/p/10535111.html
總結
以上是生活随笔為你收集整理的201671030128+词频统计软件项目报告的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 论手残党画交互原型的正确姿势
- 下一篇: ansible配置详解及基本示例