201671010460朱藝璇 詞頻統計軟件項目報告

  • 實驗二 軟件工程我的項目.

  • 實驗做業要求連接實驗二做業要求
  • 源碼在Github的倉庫主頁連接地址https://github.com/jessiyx/jessiyxhtml

  • 需求分析.
    按照《構建之法》第2章中2.3所述PSP流程,使用JAVA編程語言,獨立完成一個英文文本詞頻統計的軟件開發。
    1.程序可讀入任意英文文本文件,該文件中英文詞數大於等於1個。
    2.程序須要很壯健,能讀取容納英文原版《哈利波特》10萬詞以上的文章。
    3.指定單詞詞頻統計功能:用戶可輸入從該文本中想要查找詞頻的一個或任意多個英文單詞,運行程序的統計功能可顯示對應單詞在文本中出現的次數和柱狀圖。
    4.高頻詞統計功能:用戶從鍵盤輸入高頻詞輸出的個數k,運行程序統計功能,可按文本中詞頻數降序顯示前k個單詞的詞頻及單詞。
    5.統計該文本全部單詞數量及詞頻數,並能將單詞及詞頻數按字典順序輸出到文件result.txt。
    總結來講,該項目需求分析爲程序可讀入任意10萬詞之內的英文文本文件,可查找文件並可統計對應單詞在文本中出現的次數和柱狀圖,能夠根據頻率出現前K個單詞的詞頻,最後還能夠將統計結果輸出到result.txtjava


  • 功能設計.
    1.讀入的英文文件放在src下,根據第二點需求以合理波特爲例,講哈利波特英文版放入src下
    2.用戶輸入想要查找的一個或者人一個英文單詞,可出現該詞在文中出現的頻數和柱狀圖
    3.程序具備統計功能,能夠按照文本中詞頻數降序顯示詞頻以及單詞
    4.程序能夠統計整個文本字符流中的單詞數並將結果輸出到result.txt中,一樣也放在src下

  • 設計實現.
    在設計過程當中,有好幾個難點,我查閱不少網上的資料和相關項目,有以下理解
    1.是讀取一個文檔並將其分割成單詞。通過查閱資料,我選擇使用BufferedReader讀取文件,用列表List存儲過濾後單詞, 用readLine()讀取流讀數據,以字符串形式返回一行數據,再用split 方法 將一個字符串分割爲子字符串,講一句話中的英文單詞分割出來並將其存放在Strig數組中。key值爲單詞,value爲單詞數並對單詞的詞頻統計,用<單詞:詞頻>這樣的映射關係,Map中存放的類型key和value一個是String類型一個是int類型的,其餘形式的放入Map中會提示錯誤。
    2.在設計排序的時候,用Map按鍵排序(sort by key)按鍵排序,將字母從a排到z對所分割的單詞進行總體排序整理,若是題目要求是按照根據頻數排序,便可以採用按值排序(sort by value),對總體單詞根據單詞頻數進行排序。
    3.在講排序結構進行輸出時,能夠採用getAbsoluteFile()講結果輸出到絕對路徑,也就是工做路徑上,也能夠用getCanonicalFile()輸出到當前路徑,根據題目要求選擇後一種輸出方式,輸出結果的result.txt會出如今src下。
    4.在讀取文件以後,對整個文本直接進行分割成單詞並計算詞頻,將結果輸出到result.txt上。統計結果一併輸出到工做臺並統計完的單詞總數用file.length()輸出到工做臺。
    5.須要手動輸入的兩個題目要求即某個或某幾個單詞的詞頻和前N個單詞的詞頻用switch語句進行判斷和方法調用,只列出兩個問題選項,若是選擇的問題不在可選範圍即提示錯誤並從新進行選擇,一個問題輸出結果以後也繼續進行從新選擇問題。

  • 測試運行.git

    • 程序開始運行.
      github

    • result.txt中的輸出結果.
      編程

    • 選擇問題1.
      數組

    • 選擇問題錯誤時.
      編程語言

    • 選擇問題2.
      編輯器


  • 比較獨特的或滿意的代碼片斷.學習

  • 讀取文件
// 讀取文件
        String filename = "src/harrypotter.txt";
        FileReader fk = new FileReader(filename);
        BufferedReader br = new BufferedReader(fk);
        // 用列表存儲過濾後單詞
        List<String> ls = new ArrayList<String>();
        String readLine = null;
        while ((readLine = br.readLine()) != null) {
            // 過濾出只含有字母的
            String[] correctword = readLine.split("[^a-zA-Z]");
            for (String word : correctword) {
                // 去除長度爲0的行
                if (word.length() != 0) {
                    ls.add(word);
                }
            }
  • 用<key,value>映射,採用Map按鍵排序(sort by key),
// 存儲單詞計數信息,key值爲單詞,value爲單詞數並對單詞的詞頻統計
        Map<String, Integer> wordsCount = new TreeMap<String, Integer>();
        for (String li : ls) {
            if (wordsCount.get(li) != null) {
                wordsCount.put(li, wordsCount.get(li) + 1);
            } else {
                wordsCount.put(li, 1);
            }
        }
        // Map按鍵排序(sort by key)
        Map<String, Integer> resMap = sortMapByKey(wordsCount);
        for (Map.Entry<String, Integer> entry : resMap.entrySet()) {
            System.out.println(entry.getKey() + " " + entry.getValue());
        }
        // 格式
        // for (Map.Entry<String, String> entry : resultMap.entrySet()) {
        // System.out.println(entry.getKey() + " " + entry.getValue()); }
        //
        //
  • 將結果輸出到result.txt
File file = new File("result.txt");
        try {
            if (file.exists()) {
                file.createNewFile();
            }
            // 講結果輸出到絕對路徑下
            // FileWriter ff = new FileWriter(file.getAbsoluteFile());
            // 講結果輸出到src下
            FileWriter ff = new FileWriter(file.getCanonicalFile());
            for (Entry<String, Integer> entry : resMap.entrySet()) {
                ff.write(entry.getKey() + "/" + entry.getValue() + "    " + "\n");
            }
            ff.close();
            System.out.println("統計完成");
            // System.out.println(file.getAbsoluteFile());
            // System.out.println(file.getCanonicalPath());
        } catch (IOException e) {
            e.printStackTrace();
        }

  • 總結.測試

    • 按照字典樣式排序從a到z所用方法

      Map按鍵排序(sort by key), 按值排序(sort by value)。
      -- 引用自CSDN

    • 總結:
      在最後的項目結果中,我一共分紅了三個java文件,一個main文件和一個Find文件和一個Valuesort文件,在main文件中實現了讀取文件和按照字典順序排序功能,在find文件中實現了查找文件並查找改詞的詞頻和柱狀圖功能,在Valuesort文件中實現了查找前N個單詞的詞頻排序。
      這個項目可能在不少人眼裏都是很基礎很簡單的,但是我從開始到結束差很少花了五天左右,參考了不少網上的資料和別人的代碼及其所用的方法。我在編程上的知識欠缺和代碼基礎薄弱成了作實驗二的一個關鍵問題。
      我以爲這門課程也是真正讓我意識到本身不該該無所事事,就算是從0開始仍是從1開始,只要我有學習就能進步。之前的我對代碼並無熱愛的感受,致使我學了三年也只是門外漢,我自身的問題很是大。包括這個實驗的代碼,包括Markdown編輯器的學習,我都在努力。雖然如今不少代碼和方法我暫時只能跟着別人的思路敲一遍,再去理解,可是我相信之後我會一點點慢慢變好,從如今開始真正的打基礎。 可能不少人輕鬆就能完成的實驗,我花了不少的時間,在慢慢學習java和慢慢學習Markdown編輯器的寫做規範,這是用時間來提升本身的過程,我相信以後我會愈來愈熟練。
      作這個實驗的時候,參考了不少網頁,可是中間有一次電腦自動關機致使我沒有保存到,因此只能列出我參考的兩個網頁連接。

      參考:(https://blog.csdn.net/awewong/article/details/52914804)
      (https://blog.csdn.net/qq_15807167/article/details/51902002)


  • 展現PSP.
PSP2.1 任務內容 計劃共完成須要的時間(min) 實際完成須要的時間(min)
Planning 計劃 10 9
Estimate 估計這個任務須要多少時間,並規劃大體工做步驟 三天 五天
Development 開發 120 130
Analysis 需求分析(包括學習新技術) 30 60
Design Spec 生成設計文檔 10 9
Design Review 設計複審(和同窗審覈設計文檔) 5 6
Coding Standard 代碼規範(爲目前的開發制定合適的規範) 10 15
Design 具體設計 10 10
Coding 具體編碼 150 240
Test 測試(自我修改,修改代碼,提交修改) 30 50
Reporting 報告 20 180
Rostmortem & Process Improvement Plan 過後總結,提出過程改進計劃 3 5

GitHub上傳方式: (http://www.javashuo.com/article/p-rfviqlmf-ma.html)

GitHub地址點擊☞此處

相關文章
相關標籤/搜索