單詞詞頻統計(12組)
單詞詞頻統計
0.前言
該程序寫於2018年7月9日,在北京航空航天大學與南通大學鞠小林老師結對完成。在此期間通過結對編程完成整個項目的需求分析、設計、開發、測試等。現在回顧一下這個程序的編寫過程。與鞠老師的合作是很愉快的。總體信息如下:
+ 小組GitHub 地址:https://github.com/yuan574954352/WordCount
+ 博客園博客地址:
+ PSP
PSP2.1 |
Personal Software Process Stages |
預估耗時(分鐘) |
實際耗時(分鐘) |
Planning |
計劃 |
|
|
· Estimate |
· 估計這個任務需要多少時間 |
10 |
15 |
Development |
開發 |
0 |
0 |
· Analysis |
· 需求分析 (包括學習新技術) |
30 |
30 |
· Design Spec |
· 生成設計文檔 |
15 |
15 |
· Design Review |
· 設計復審 (和同事審核設計文檔) |
20 |
30 |
· Coding Standard |
· 代碼規範 (為目前的開發制定合適的規範) |
5 |
5 |
· Design |
· 具體設計 |
10 |
20 |
· Coding |
· 具體編碼 |
40 |
80 |
· Code Review |
· 代碼復審 |
20 |
30 |
· Test |
· 測試(自我測試,修改代碼,提交修改) |
40 |
50 |
Reporting |
報告 |
0 |
0 |
· Test Report |
· 測試報告 |
5 |
10 |
· Size Measurement |
· 計算工作量 |
5 |
5 |
· Postmortem & Process Improvement Plan |
· 事後總結, 並提出過程改進計劃 |
10 |
20 |
|
合計 |
210 |
310 |
- 設計思路
Java中的Map接口建立了 key 和 value 的映射。擬采用 key 存儲需要統計的字符(或單詞),value 則對應對應字符(或單詞)的頻率。
例如, 建立一個map,其中的key存儲的是字符(a,w,z等),value則存儲的對應的頻率。
2.系統框架
程序的整體開發流程如下:
(1)對文本中非英語的一切字符進行過濾,只留下英語和必要的空格,能夠區分不同單詞,同時對於英語中特別的字符要加以處理)
(2)過濾出單詞
(3)對單詞首先在數據表中“查找”操作,如果存在,則更新值,如果不存在,則插入值。
(4)尋找合適的呈現方法,將最終的數據呈現出來,表格、文件等
主要處理流程是:
main(String[] args) { |
|
|
lib test = new lib(); |
|
test.dealFile(args); |
|
orderList1 = test.sortMap(test.getMap1()); |
|
orderList2 = test.sortMap(test.getMap2()); |
|
test.out("output1.txt",orderList1); |
|
test.out("output2.txt",orderList2); |
|
} |
Step1: 函數dealFile(),逐行讀取文件; 調用函數 dealLine() 來處理每一行字符和字符串;統計好頻率放到對應的全局變量 map1、map2;
Step2: 函數sortMap()是對 map (map1 和 map2)的內容按 value 值降序排列;
Step3:函數out() 輸出 top_n 字符(串)到指定的文件。
這個過程中用到了信息隱蔽原則,將上述4個主要函數dealFile、dealLine、sortMap、out 獨立編寫在 lib.java文件中;其中 dealFile 循環調用 dealLine 函數以處理輸入文件的每一行;
此外,在 lib.java 中編寫了一些判斷字符類型的短小的函數,如isZ()、isNumber()、isSplit()。
上述設計不足之處是采用if… else… 結構處理分詞,效率比較低,而且容易遺漏一些特殊的單詞組合情況。如以下單詞:isn’t 、FFile3name 等
- 性能評估及改進
利用 JProfile 開展性能評估,處理大文件,gong_with_the_wind.txt第一次,運行時間大概2000+ms,分析發現系統打印輸出代碼耗費了大量的時間,因此移除了調試時插入的一些打印輸出代碼。程序執行時間大為縮短。大約339ms,主要時間耗費在 Map中元素的查找。
單詞詞頻統計(12組)