第一次個人作業之詞頻統計
阿新 • • 發佈:2018-03-29
前期準備 設計文檔 估計 splay 行處理 字符流 report -- 傳遞
實驗要求
- 對源文件(*.txt,*.cpp,*.h,*.cs,*.html,*.js,*.java,*.py,*.php等,文件夾內的所有文件)統計字符數、單詞數、行數、詞頻,統計結果以指定格式輸出到默認文件中,以及其他擴展功能,並能夠快速地處理多個文件。
- 使用性能測試工具進行分析,找到性能的瓶頸並改進
- 對代碼進行質量分析,消除所有警告
- 設計10個測試樣例用於測試,確保程序正常運行(例如:空文件,只包含一個詞的文件,只有一行的文件,典型文件等等)
- 使用Github進行代碼管理
- 撰寫博客
前期準備
需求分析
本次作業要求對任意文件或者特定目錄下所有文件中的字符、單詞、詞組做相應的統計分析,並將統計結果輸出到result文件中。其中主要有以下需要特別註意的:
- 質量要求高,要求使用VS分析熱行,提高程序性能,並且要做到沒有“警告”;
- 要求跨平臺;
- 甲方的要求很“反人類”,不容易理解;
- 博客的撰寫、作業進程的記錄與分析等。
代碼規範
VS會自動換行,加空格之類的,在此基礎上根據我個人的習慣,結合之前看的一些書,制定了以下規範:
- 變量的定義,如果涉及到2個單詞,第一個單詞首字母大寫,第二個單詞首字母小寫;
- 對於每個代碼塊,使用 4 空格或等長的 Tab 縮進;
-
定義變量不同行;
花括號獨占一行; -
不應該有兩個連續的空行;
-
main
函數的返回值類型必須是int
,可以省略return 0;
傳參時,應該根據實際需要使用「引用」、「
const
-
應該盡量少使用全局變量。
PSP表格----隨著進度會隨時更新
PSP2.1 |
任務內容 |
計劃完成需要的時間(min) |
實際完成需要的時間(min) |
Planning |
計劃 |
30 |
30 |
Estimate |
估計這個任務需要多少時間,並規劃大致工作步驟 |
30 |
30 |
Development |
開發 |
650 |
- |
Analysis |
需求分析 (包括學習新技術) |
0 |
0 |
Design Spec |
生成設計文檔 |
30 |
- |
Design Review |
設計復審 (和同事審核設計文檔) |
10 |
- |
Coding Standard |
代碼規範 (為目前的開發制定合適的規範) |
20 |
20 |
Design |
具體設計 |
40 |
40 |
Coding |
具體編碼 |
400 |
- |
Code Review |
代碼復審 |
100 |
- |
est |
測試(自我測試,修改代碼,提交修改) |
50 |
- |
Reporting |
報告 |
240 |
- |
Test Report |
測試報告 |
60 |
- |
Size Measurement |
計算工作量 |
30 |
- |
Postmortem & Process Improvement Plan |
事後總結 ,並提出過程改進計劃 |
150 |
- |
Summary |
合計 |
920 |
- |
設計思路
- 根據輸入的目錄或文件名將所有的文件路徑以及文件夾保存在vector<string>,對每個文件依次進行統計。
- 將每個文件的字符流讀入一個string,從頭到尾進行處理。
- 單詞、詞組信息利用C++中的unordered map實現。定義結構體strint,存儲字典序最小的str以及對應的頻率。對於單詞來說,采用unordered_map<string, strint> Wordfre,其中第一個str是去除了單詞後綴數字並且全部轉化為小寫字母的串,便於hash。對於詞組來說,采用數據結構unordered_map<string, int> Phrasefre來存儲,其中string是2個單詞的連接,其中用 _來劃分。詞組在輸出時,拆分,利用Wordfre中的信息更新字母的大小寫信息。
- 判斷統計單詞的實現如下:依次讀取string的字符,結合已經輸入的字符的信息,判斷能否成詞。細節見代碼。一旦成詞,清空之前已經輸入的信息。
- 判斷統計詞組的實現如下:結合當前的單詞,和上一次的單詞Lastword結合成為詞組
- 關於Top10單詞的獲得, 這裏采用C++的優先隊列,隊列維持出現最頻繁的10個元素,時間復雜度O(nlogk).
第一次個人作業之詞頻統計