1. 程式人生 > 實用技巧 >20200917-2 詞頻統計

20200917-2 詞頻統計

此作業的要求參見:https://edu.cnblogs.com/campus/nenu/2020Fall/homework/11206

詞頻統計 SPEC

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

希望實現以下效果。以下效果中數字純屬編造。

功能1小檔案輸入。 為表明程式能跑,結果真實而不是迫害老五,請他親自鍵
盤在控制檯下輸入命令。

>type test.txt
My English is very very pool.

>wf -s test.txt total 5 very 2 my 1 english 1 is 1 pool 1

為了評估老五的詞彙量而不是閱讀量,total一項中相同的單詞不重複計數數,出現2
次的very計數1次。

因為用過控制檯和命令列,你早就知道,上面的">"叫做命令提示符,是作業系統的一部分,而不是你的程式的一部分。

此功能完成後你的經驗值+10.

答:

功能2支援命令列輸入英文作品的檔名,請老五親自錄入。

>wf gone_with_the_wand
total  1234567 words

the    5023
a      
4783 love 4572 fire 4322 run 3822 cheat 3023 girls 2783 girl 2572 slave 1322 buy 822

此功能完成後你的經驗值+30. 輸入檔案最大不超過40MB. 如果你的程式中途崩
了,會被老五打臉,不增加經驗值。

答:

功能3支援命令列輸入儲存有英文作品檔案的目錄名,批量統計。
>dir folder
gone_with_the_wand
runbinson
janelove
>wf folder
gone_with_the_wand
total 1234567 words
the 5023

a 4783
love 4572
fire 4322
run 3822
cheat 3023
girls 2783
girl 2572
slave 1322
buy 822
----
runbinson
total 1234567 words

friday    5023
sea       4783
food      4572
dog       4322
run       3822
hot       3023
cood      2783
cool      2572
bible     1322
eat        822
----
janelove
total  1234567 words

love    5023
chat    4783
lie     4572
run     4322
money   3822
inheritance     3023
class   2783
attribute       2572
data    1322
method  822

因為單詞量巨大,只列出出現次數最多的10個單詞。
此功能完成後你的經驗值+8.

答:

功能4從控制檯讀入英文單篇作品,這不是為了打臉老五,而是為了向你女朋
友炫酷,表明你能提供更適合嵌入指令碼中的作品(或者如她所說,不過是更靈活
的介面)。如果讀不懂需求,請教師兄師姐,或者 bing: linux 重定向,儘管
這個功能在windows下也有,搜尋關鍵詞中加入linux有利於迅速找到。

>wf -s < the_show_of_the_ring

total 176
the  6
a    3
festival   2
dead 2
for 2
...

此功能完成後你的經驗值+10.

答:

功能5此功能為選做題,如果完成正確得30經驗值,如果不做得0經驗值,不會倒扣分數。

你完成了所有功能,後面的部落格、PSP等也都精心準備了,去食堂的路上心情大悅。坐下撓了撓手機訪問cnblogs上的班級,卻發現大家的作業也都非常優秀,自己並不突出,心下黯然。怎麼才能更加傑出呢?一抬頭,看到老楊老師和和鄒欣老師正坐桌對面吃飯,你說出了自己的困惑。

老楊說,“精益求精,一步步榨出自己的潛力來,正是走向傑出的開始啊。”

你說,“老師你具體點唄。”

鄒欣老師說,“這樣,我想知道5個字母的單詞中最頻繁出現的是哪10個單詞,top10,你怎麼辦呢?”

你一下就想到了,說了思路,應該blablabla。鄒欣老師又問,“6個字母的單詞中最頻繁出現的是哪10個單詞呢,top10?”

老楊追問,“6個字母的字母的單詞中最頻繁出現的是哪100個單詞呢,top100?”

你問,“演算法我想好了,效能估計也沒問題,命令列引數老師怎麼規定呢?”

老楊說,"你來規定,寫個簡單的文件,包括如何執行,給出執行例項的截圖。"

"可變的引數就是(1)幾個字母和(2)排行前多少是吧?沒有問題。"

此時,你想起自己一直做作業還沒有吃飯。肚子咕咕叫得聲音如此之大,把你吵醒了。是趕緊去吃飯呢,還是做完這題再說?

答:前面的數字代表單詞字母的個數,後面的數字代表顯示top多少,分別對應四個功能

功能一 功能二

功能三 功能四

功能實現

(以上每1經驗值對應 1分。)
要求在同一個可執行程式中實現全部功能,而不是每個功能單獨用一個可執行程式實現。

部落格
(10分)
發表部落格,介紹上述“專案”中每個功能的重點/難點,展示重要程式碼片斷,給出執行效果截圖,展示你感覺得意、突破、困難的地方。

答:(1)我是把每個功能看成一個整體,每個功能都必須將檔案裡的單詞處理好,

處理單詞的重點,要考慮不是所有單詞都由空格分開,有可能是逗號,句號等等。

所以需要除了字母以外都要分開。

 1 Map<String,Integer> map = new HashMap<String,Integer>();
 2 String data = null;
 3 //讀取文字一行
 4 while((data=br.readLine())!=null) {
 5     String[] word = data.split("[^a-zA-Z]"); 
 6     for (int i = 0; i < word.length; i++) {
 7         if(!word[i].equals("")) {       
 8             if(map.containsKey(word[i])) {
 9                 Integer word_num = map.get(word[i]);
10                 map.put(word[i],++word_num);
11             }else {
12                 map.put(word[i],1);
13             }
14         }    
15     }
16 }

(2)下一個難點是資料夾,檔案處理這塊,比較複雜,功能三資料夾處理利用遞迴的方式

public static void fileName(String str) throws IOException  {
    File file = new File(System.getProperty("user.dir")+"/"+str);
    //功能三,處理目錄
    if(file.isDirectory()){
        File[] tempList = file.listFiles();
        for (int i = 0; i < tempList.length; i++) {
            System.out.println(tempList[i].getName());
            fileName(str+"/"+tempList[i].getName());
            System.out.println("------------");
        }    
    }else {
        if(str.contains(".txt")) {
            minFile(str);
        }else {
            englishFile(str);
        }
    }    
}    

(3)下一個難點是引數處理,要考慮在控制檯輸入的引數的位置,要考慮這五種功能的情況

if(args.length != 0) {
    if(args[0].equals("-s")) {
        if(args.length == 2) {
            fileName(args[1]);
        }else {
            if(args.length == 4) {
                wordNum = Integer.parseInt(args[2]);
                wordTop    = Integer.parseInt(args[3]);
                fileName(args[1]);
            }else if(args.length == 3){
                wordNum = Integer.parseInt(args[1]);
                wordTop    = Integer.parseInt(args[2]);
                redir();
            }else {
                redir();
            }
        }    
    }else {
        if(args.length == 3) {
            wordNum = Integer.parseInt(args[1]);
            wordTop = Integer.parseInt(args[2]);
        }
        fileName(args[0]);
    }
}

程式碼片斷要求1 凡不縮排的,此題目拒絕接收。不知道什麼是“縮排”的同學,請自行補課,不接受以“不知道”作為理由。
程式碼片斷要求2 要求使用cnblogs程式碼控制元件,參見往屆同學黃興、宮成榮的作業。凡貼上IDE中的程式碼截圖,或者貼文字而沒有關鍵字高亮或彩色的,0分。
[http://www.cnblogs.com/huangxman/p/5871201.html]
[http://www.cnblogs.com/gongcr/p/5873493.html]

圖表過小、字跡不清、錯別字、句子不通順的,教師會因為讀不懂而對此題扣分。

PSP
(8分)

在同一篇部落格中,參照教材第35頁表2-2和表2-3,為上述“專案”製作PSP階段表格。
PSP階段表格第1列分類,如功能1、功能2、測試功能1等。

要求1估算你對每個功能 (或/和子功能)的預計花費時間,填入PSP階段表格,時間顆粒度為分鐘。
要求2記錄詞頻統計專案實際花費時間,填入PSP階段表格,時間顆粒度要求分鐘。
要求3對比要求1和要求2中每項時間花費的差距,分析原因。

程式碼及版本控制
(5分。雖然只有5分,但此題如果做錯,因為教師得不到你的程式碼,所以會導致“功能實現”為負分。)
程式碼要求在 coding.net 做版本控制。要求push&pull時使用git客戶端,不允許使用web頁面。
要求頻繁checkin。要求在PSP中記錄的每次離開鍵盤5分鐘以上,需要checkin。如果你持續長達4小時不離開鍵盤,教師要求展示此項能力。
推薦git客戶端tortoisegit。
推薦先pull [https://github.com/weijunying2019102969/novelsfortest.git],裡面有測試用例。

答:Github:https://github.com/zhaoyw456/wf.git

coding.net:https://e.coding.net/zhaoyingwei/zyw/wf.git