201671010407 實驗二 詞頻統計軟件項目報告
一.需求分析
根據實驗二軟件工程個人項目所提要求進行分析後可知用戶的需求主要有
1.程序可讀入任意英文文本文件,該文件中英文詞數大於等於1個,程序需要很壯健,能讀取容納英文原版《哈利波特》10萬詞以上的文章。
2.指定單詞詞頻統計功能:用戶可輸入從該文本中想要查找詞頻的一個或任意多個英文單詞,運行程序的統計功能可顯示對應單詞在文本中出現的次數和柱狀圖。
3.高頻詞統計功能:用戶從鍵盤輸入高頻詞輸出的個數k,運行程序統計功能,可按文本中詞頻數降序顯示前k個單詞的詞頻及單詞。
4.統計該文本所有單詞數量及詞頻數,並能將單詞及詞頻數按字典順序輸出到文件result.txt。
二、功能實現
基本功能
1.用戶輸入任意英文文本,顯示對應單詞在文本中出現的次數和對應的單詞。
3.統計該文本所有單詞數量及詞頻數,並能將單詞及詞頻數按字典順序輸出到文件result.txt。
擴展功能
讀入讀出文件功能(將文件進行讀取,存放),輸入一個文件的文件路徑及文件名可以找到該文件並對該文件中的文本進行單詞分解和單詞詞頻統計。
三、設計實現
流程圖如下
部分代碼如下
任意英文文本文件的導入:
利用FileDialog類直接打開本地文件資源管理器,通過選擇的方式導入任意英文文本文件。並將其保存在File中,通過BufferedReader讀入到StringBuilder類的一個對象中。
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(); } } });
統計該英文文件中單詞數
通過字符串的切割使文本變成單詞,其中在字符串的切割中遇到了一系列問題,比如文本中的標點符號多樣,還有空格,我們需要按照標點符號切割後,在按照空格切換,在這個過程中,有字符串數組到字符串的轉換時會自動添加逗號。為了解決這個問題,我使用了字符串的替換。將所有的標點符號用空格替換,然後按照空格切割。
實現代碼如下:
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);//將單詞和出現的頻率保存在數據庫中
}
}
});
最終運行結果如下
四、總結
在這次的詞頻統計軟件開發過程中,主要將該軟件分成三大模塊:
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表中可以看出在開發、需求分析和具體編程這些環節耗時最多而且計劃時間和實際時間之間的差距比較大,讓我深刻認識到軟件開發的不易,單人操作非常困難,需要有幾個人合作甚至一個團隊來合作完成;
軟件開發過程中計劃往往趕不上變化,過程中浪費了很多的時間,如果在實際項目中可能浪費財力物力;
我也認識到基礎知識的嚴重不足,需要在網上和教材上搜集相關知識點並重溫,耗時較多。因此在後面的學習中,還需要勤加練習,更加熟練的掌握知識點。
該詞頻統計軟件源碼可在此處查看
201671010407 實驗二 詞頻統計軟件項目報告