1. 程式人生 > >詞頻統計------實訓一

詞頻統計------實訓一

詞頻統計

老五在寢室吹牛他熟讀過《魯濱遜漂流記》,在女生面前吹牛熱愛《呼嘯山莊》《簡愛》和《飄》,在你面前說通讀了《戰爭與和平》。但是,他的四級至今沒過。你們幾個私下商量,這幾本大作的單詞量怎麼可能低於四級,大家聽說你學習《構建之法》,一致推舉你寫個程式名字叫wf,統計英文作品的單詞量並給出每個單詞出現的次數,準備用於打臉老五。

1.結對成員:16012009徐小東,16012008李雪      碼雲地址:https://gitee.com/changchundehui/09-08/blob/master/Wf.java

2.程式設計過程照片:

 

3設計思路:這個題的要求是利用java語言統計英文作品的單詞量並給出每個單詞出現的次數,按照這個要求給出如下設計。

整個詞頻統計設計分三個部分,第一部分是讀取檔案並把所有單詞截出來。第二部分統計詞頻。第三部分把詞頻排序並輸出。

 

實現功能:1.第一部分:是主程式邏輯入口,這個程式有三種模式,1.單行語言處理,2.單個檔案處理,3.批量處理,0.退出程式\n請鍵入1 2 3選擇您需要的模式,模式2指定具體路徑為d盤根目錄。設計了三種模式:輸入1執行功能一,輸入2執行功能二,輸入3執行功能三。

public class Wf {

    public static void main(String[] args) {
        //主程式邏輯入口
        while (true) {
            System.out.println("本程式有三種模式:1.單行語言處理;2.單個檔案處理;3.批量處理;0.退出程式\n請鍵入1 2 3選擇您需要的模式,模式2指定具體路徑為d盤根目錄");
            Scanner readerScanner = new Scanner(System.in);
            int flag = readerScanner.nextInt();
            if (flag == 0) {
                break;
            

  設計了三種模式:輸入1執行功能一,輸入2執行功能二,輸入3執行功能三。

 

 功能一:讀取一行單詞

else if (flag == 1) {
                try {
                    System.out.println("當前為當行語言處理模式,請輸入您要評測的語句");
                    BufferedReader bf =new BufferedReader(new InputStreamReader(System.in)); //讀取命令列中一行
                    String s=bf.readLine();
                    LineCode(s);
                } catch (IOException ex) {
                    System.out.println("請按單行輸入句子");
                }

功能二:命令列輸入英文作品檔名稱

else if (flag == 2) {
                System.out.println("當前為單個檔案處理模式,請輸入您要輸入的檔名,格式:aaa.txt");
                String s = readerScanner.next();
                try {
                    TxtCode(s);
                } catch (Exception ex) {
                    System.out.println("請輸入正確的檔名稱,確定後文件存在以及檔案是否放在d:根目錄下");
                }

功能三.批量統計

else if(flag==3){
              System.out.println("當前為批量檔案處理模式,請輸入檔案具體路徑,格式:d:/ljr");
               String path=readerScanner.next();              
               File file =new File(path);
                if (file.isDirectory()) {
                    File[] filelist =file.listFiles();
                    for(File file1:filelist){
                        try {
                            String s=file1.getPath();//地址回溯
                            System.out.println(s);
                            FileCode(s);
                        } catch (Exception ex) {
                            System.out.println("請輸入正確的路徑,若程式無法結束請重新執行程式");
                        }

第二部分:統計單個檔案,統計單行

//統計單個檔案
    public static void TxtCode(String txtname) throws Exception {
        BufferedReader br = new BufferedReader(new FileReader("D:/word.txt" ));
        List<String> lists = new ArrayList<String>();  //儲存過濾後單詞的列表  
        String readLine = null;
        while ((readLine = br.readLine()) != null) {
            String[] wordsArr1 = readLine.split("[^a-zA-Z]");  //過濾出只含有字母的  
            for (String word : wordsArr1) {
                if (word.length() != 0) {  //去除長度為0的行  
                    lists.add(word);
                }
            }
        }
        br.close();
        StatisticalCode(lists);       
    }

    //統計單行
    public static void LineCode(String args) {
        List<String> lists = new ArrayList<String>();  //儲存過濾後單詞的列表 
        String[] wordsArr1 = args.split("[^a-zA-Z]");  //過濾出只含有字母的  
        for (String word : wordsArr1) {
            if (word.length() != 0) {  //去除長度為0的行  
                lists.add(word);
            }
        }
        StatisticalCode(lists);    
    }
    
    public static void FileCode(String args) throws FileNotFoundException, IOException {
        BufferedReader br = new BufferedReader(new FileReader(args));
        List<String> lists = new ArrayList<String>();  //儲存過濾後單詞的列表  
        String readLine = null;
        while ((readLine = br.readLine()) != null) {
            String[] wordsArr1 = readLine.split("[^a-zA-Z]");  //過濾出只含有字母的  
            for (String word : wordsArr1) {
                if (word.length() != 0) {  //去除長度為0的行  
                    lists.add(word);
                }
            }
        }
        br.close();
        StatisticalCode(lists);       
    }
    
    public static void StatisticalCode(List<String> lists) {
              //統計排序
          Map<String, Integer> wordsCount = new TreeMap<String, Integer>();  //儲存單詞計數資訊,key值為單詞,value為單詞數                
        //單詞的詞頻統計  
        for (String li : lists) {
            if (wordsCount.get(li) != null) {
                wordsCount.put(li, wordsCount.get(li) + 1);
            } else {
                wordsCount.put(li, 1);
            }
        }
        // System.out.println("wordcount.Wordcount.main()");
        SortMap(wordsCount);    //按值進行排序 
    }

  第三部分:按value 大小進行排序

public static void SortMap(Map<String, Integer> oldmap) {

        ArrayList<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(oldmap.entrySet());
        Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
            public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
                return o2.getValue() - o1.getValue();  //降序  
            }
        });
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i).getKey() + ": " + list.get(i).getValue());
        }
    }

4.功能執行結果

功能一:

功能二:

功能三:

  

5.小結感受:通過這次的結對程式設計,讓我體會到了一個團隊的合作力量是非常大的,雖然在程式設計的過程中也遇到過困難,但在兩個人的探討下問題迎刃而解。在程式設計的過程中遇到不懂得問題會查閱一些資料,在互幫互助的情況下兩個人又知道了很多知識,在學習java的過程中,有一些不懂得地方,在這次結對程式設計過程中,通過兩人的交流,也都弄懂了。所以我認為結對程式設計能夠帶來1+1>2的效果。

6.評價:在這次的結對程式設計中,我的小夥伴真的很用心,有一些我不太懂的問題能給我耐心講解。有一些需要完成的任務做的也很認真。在兩人的合作下成功的完成了這次的程式設計。我們倆打字都比較慢,所以程式設計的時間比較久,希望能夠提高打字的速度。期待下一次的合作。