201671010407 實驗二 詞頻統計軟件項目報告

一.需求分析
根據實驗二軟件工程我的項目所提要求進行分析後可知用戶的需求主要有html

1.程序可讀入任意英文文本文件,該文件中英文詞數大於等於1個,程序須要很壯健,能讀取容納英文原版《哈利波特》10萬詞以上的文章。
2.指定單詞詞頻統計功能:用戶可輸入從該文本中想要查找詞頻的一個或任意多個英文單詞,運行程序的統計功能可顯示對應單詞在文本中出現的次數和柱狀圖。
3.高頻詞統計功能:用戶從鍵盤輸入高頻詞輸出的個數k,運行程序統計功能,可按文本中詞頻數降序顯示前k個單詞的詞頻及單詞。
4.統計該文本全部單詞數量及詞頻數,並能將單詞及詞頻數按字典順序輸出到文件result.txt。git

2、功能實現


基本功能
github

1.用戶輸入任意英文文本,顯示對應單詞在文本中出現的次數和對應的單詞。
2.用戶從鍵盤輸入高頻詞輸出的個數n,按文本中詞頻數降序顯示前n個單詞的詞頻及單詞,用戶也可輸入文本查詢其出現次數。
3.統計該文本全部單詞數量及詞頻數,並能將單詞及詞頻數按字典順序輸出到文件result.txt。
擴展功能
讀入讀出文件功能(將文件進行讀取,存放),輸入一個文件的文件路徑及文件名能夠找到該文件並對該文件中的文本進行單詞分解和單詞詞頻統計。數據庫

3、設計實現


流程圖以下

編程

部分代碼以下數組

任意英文文本文件的導入:
利用FileDialog類直接打開本地文件資源管理器,經過選擇的方式導入任意英文文本文件。並將其保存在File中,經過BufferedReader讀入到StringBuilder類的一個對象中。
實現代碼以下:app

open.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
FileDialog jf = new FileDialog(frame, "打開文件", FileDialog.LOAD);
            jf.setVisible(true);
            String dirName = jf.getDirectory();
            String fileName = jf.getFile();
            File f = new File(dirName, fileName);
            textFile = new StringBuilder();
            String b = null;
            BufferedReader br;
            try {
                br = new BufferedReader(new FileReader(f));
                while ((b = br.readLine()) != null) {
                    textFile.append(b);
                }
            } catch (FileNotFoundException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }

        }

    });

統計該英文文件中單詞數
經過字符串的切割使文本變成單詞,其中在字符串的切割中遇到了一系列問題,好比文本中的標點符號多樣,還有空格,咱們須要按照標點符號切割後,在按照空格切換,在這個過程當中,有字符串數組到字符串的轉換時會自動添加逗號。爲了解決這個問題,我使用了字符串的替換。將全部的標點符號用空格替換,而後按照空格切割。
實現代碼以下:ide

public String[] Dell(StringBuilder b){
     String s=String.valueOf(b);//轉換爲字符串
     String s1=s.replace(',', ' ');//將逗號用空格替換
     String s2=s1.replace('.', ' ');//將句號用空格替換
     String s3=s2.replace(';',' ');//將分好用空格替換
     String textArry[]=s3.split(" ");//按照空格切割字符串,獲得存儲着文本中全部英文單詞的字符數組
for(int i=0;i<textArry.length;i++){
      if( textArry[i].length()==0){//將字符串數組中爲空的字符串刪除
          textArry[i]=textArry[i+1];
      }
     }
    //統計英文單詞的數量
    String a=String.valueOf(textArry.length);
    num.setText("文本中英文單詞數量爲:"+a);//設置標籤的值,顯示單詞數量
    return textArry;
    
}

將單詞按字典順序輸出:模塊化

使用冒泡排序將獲得的字符數組進行排序輸入便可,輸出的顯示採用了textArea
代碼實現以下:
order.addActionListener(new ActionListener(){
        @Override
            public void actionPerformed(ActionEvent e) {
            JFrame f=new JFrame("排序結果");//新窗體的建立
            f.setBounds(800,400,500,600);
            JTextArea ta=new JTextArea(10,5);//顯示多行文本
            ta.setLineWrap(true);
            f.add(ta);
String textArry[]=Dell(textFile);
            for(int i=0;i<textArry.length;i++){ //冒泡排序
                for(int j=0;j<textArry.length-i-1;j++){
                    if((textArry[j].compareTo(textArry[j+1]))>0){
                        String temp=textArry[j];
                        textArry[j]=textArry[j+1];
                        textArry[j+1]=temp;
                    }
                }
            }
            StringBuilder sb=new StringBuilder();
            for(int i=0;i<textArry.length;i++){     
                sb.append(textArry[i]);
                sb.append(" \n");//每一個單詞之間添加一個換行
            }
            
            ta.setText(String.valueOf(sb));
        f.setVisible(true);
        }   
    });

單詞頻率的統計代碼以下:函數

check.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String[] textArry=Dell(textFile);
                CountDao cd=new CountDao();
                int tenpCount=0;//單詞頻率
                for(int i=0;i<textArry.length;i++){
                    for(int j=0;j<textArry.length;j++){
                        if(textArry[i].equals(textArry[j])){
                            tenpCount++;
                        }   
                    }
                    cd.save( textArry[i],tenpCount);//將單詞和出現的頻率保存在數據庫中      
                }
            }

        });

最終運行結果以下

打開文本

4、總結

在此次的詞頻統計軟件開發過程當中,主要將該軟件分紅三大模塊:
1.文本的單詞提取和詞頻統計、單詞匹配後輸出
2.根據單詞詞頻排序後輸出用戶須要查看
3.根據單詞字母表順序排序後保存在文件中。
第一個模塊在主函數中實現,然後面三個模塊分別經過三個子函數來實現,以後在主函數中被調用,以此來達到軟件設計的「模塊化」設計。

PSP展現

PSP2.1 任務內容 計劃共完成須要的時間(min) 實際完成須要的時間(min)
Planning 計劃 10 15
Estimate 估計這個任務須要多少時間,並規劃大體工做步驟 10 8
Development 開發 150 140
Analysis 需求分析 (包括學習新技術) 30 50
Design Spec 生成設計文檔 10 15
Design Review 設計複審 (和同事審覈設計文檔) 6 5
Coding Standard 代碼規範 (爲目前的開發制定合適的規範) 5 5
Design 具體設計 15 13
Coding 具體編碼 120 100
Code Review 代碼複審 15 12
Test 測試(自我測試,修改代碼,提交修改) 20 15
Reporting 報告 9 7
Test Report 測試報告 5 5
Size Measurement 計算工做量 1 2
Postmortem & Process Improvement Plan 過後總結 ,並提出過程改進計劃 5 4

從PSP表中能夠看出在開發、需求分析和具體編程這些環節耗時最多並且計劃時間和實際時間之間的差距比較大,讓我深入認識到軟件開發的不易,單人操做很是困難,須要有幾我的合做甚至一個團隊來合做完成;
軟件開發過程當中計劃每每趕不上變化,過程當中浪費了不少的時間,若是在實際項目中可能浪費財力物力;
我也認識到基礎知識的嚴重不足,須要在網上和教材上搜集相關知識點並重溫,耗時較多。所以在後面的學習中,還須要勤加練習,更加熟練的掌握知識點。
該詞頻統計軟件源碼可在此處查看

相關文章
相關標籤/搜索