1. 程式人生 > >第一次個人作業之詞頻統計

第一次個人作業之詞頻統計

前期準備 設計文檔 估計 splay 行處理 字符流 report -- 傳遞

實驗要求

  1. 對源文件(*.txt,*.cpp,*.h,*.cs,*.html,*.js,*.java,*.py,*.php等,文件夾內的所有文件)統計字符數、單詞數、行數、詞頻,統計結果以指定格式輸出到默認文件中,以及其他擴展功能,並能夠快速地處理多個文件。
  2. 使用性能測試工具進行分析,找到性能的瓶頸並改進
  3. 對代碼進行質量分析,消除所有警告
  4. 設計10個測試樣例用於測試,確保程序正常運行(例如:空文件,只包含一個詞的文件,只有一行的文件,典型文件等等)
  5. 使用Github進行代碼管理
  6. 撰寫博客

前期準備

需求分析

本次作業要求對任意文件或者特定目錄下所有文件中的字符、單詞、詞組做相應的統計分析,並將統計結果輸出到result文件中。其中主要有以下需要特別註意的:

  1. 質量要求高,要求使用VS分析熱行,提高程序性能,並且要做到沒有“警告”;
  2. 要求跨平臺;
  3. 甲方的要求很“反人類”,不容易理解;
  4. 博客的撰寫、作業進程的記錄與分析等。

代碼規範

VS會自動換行,加空格之類的,在此基礎上根據我個人的習慣,結合之前看的一些書,制定了以下規範:

  • 變量的定義,如果涉及到2個單詞,第一個單詞首字母大寫,第二個單詞首字母小寫;
  • 對於每個代碼塊,使用 4 空格或等長的 Tab 縮進;
  • 定義變量不同行;

    花括號獨占一行;
  • 不應該有兩個連續的空行;

  • main 函數的返回值類型必須是 int可以省略 return 0;
  • 傳參時,應該根據實際需要使用「引用」、「const
    引用」和「值傳遞」,比如定義bool cmp的時候一定要使用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).

第一次個人作業之詞頻統計