词频统计工程相关
(the format of this article is from SkYjoKEr)
?
//=======================開始干之前=======================
模塊
1、WordClass 一個(gè)存放單詞以及實(shí)現(xiàn)相關(guān)操作的類,其中單詞以二元組<word, freq>的形式存儲(chǔ)。 (20min)
2、WordCounter 完成單詞統(tǒng)計(jì),用一個(gè)List保存所有有效的單詞。
3、在WordCounter里實(shí)現(xiàn)方法AddFile,對(duì)每添加的一個(gè)文件,提取出所有的單詞,按規(guī)則加入到List中。(同2一起實(shí)現(xiàn),3h)
4、quicksort實(shí)現(xiàn)一個(gè)雙關(guān)鍵字的排序 (10min)
5、判斷路徑合法以及合法之后的文件名抽取,這部分不單獨(dú)寫成一個(gè)類(20min)
6、打印 (10min)
算上一些調(diào)試時(shí)間,預(yù)計(jì)花費(fèi)5個(gè)小時(shí)完成這個(gè)小項(xiàng)目。
?
//=======================開始干之后=======================
寫的時(shí)候模塊順序同設(shè)計(jì)時(shí)略有不同。
1、main函數(shù)。包括一個(gè)簡(jiǎn)單粗暴的命令行、有效路徑判斷及文件名抽取。實(shí)際使用了1hour,超出預(yù)計(jì)很多。問(wèn)題出在抽取文件名,我一開始想使用GetFiles直接提取要求的四種格式的文件名,過(guò)濾掉其他格式。但是GetFiles方法里的參數(shù)好像不像正則表達(dá)式那么強(qiáng)大,它不能實(shí)現(xiàn)幾種格式做或運(yùn)算。后來(lái)上網(wǎng)一查,大家也說(shuō)這個(gè)方法要么提取全部文件,要么提取一種格式的文件。最后我只能先把所有格式的文件都提出來(lái),在調(diào)用addFile時(shí)做個(gè)判斷。想通了這一點(diǎn),實(shí)現(xiàn)起來(lái)倒是也不難。本來(lái)覺得還要寫個(gè)文件夾里套文件夾的遞歸,GetFiles里有個(gè)searchoption.alldirectories參數(shù),直接實(shí)現(xiàn)了,我只想說(shuō)牛逼。?
2、WordClass,正常時(shí)間完成。相關(guān)的操作包括構(gòu)造函數(shù),詞頻加1,get和set。
3、WordCounter和addFile。項(xiàng)目的核心和難點(diǎn),需要實(shí)現(xiàn)寫文件、分詞、統(tǒng)計(jì)三大功能,寫這個(gè)雖然用了4個(gè)小時(shí),但我覺得自己的效率還算過(guò)得去。受到淡定大神的影響,我一開始打算用正則表達(dá)式實(shí)現(xiàn)分詞,但是看了一會(huì)覺得這個(gè)難度不大適合我,最后老實(shí)的用StreamReader讀一行,然后split分詞。這兩個(gè)工具在以前寫C++大作業(yè)時(shí)用過(guò),現(xiàn)在寫起來(lái)算熟門熟路。為了輔助這三大功能,還寫了兩個(gè)小方法,legalWord判斷單詞是否合法,wordCompareEqual判斷有沒有相同的詞出現(xiàn)(包括-e模式)。
4、雙關(guān)鍵字快排,正常時(shí)間完成。
5、打印。先把所有內(nèi)用緩沖到一個(gè)StreamBuilder里面,最后寫到一個(gè)文件里。正常時(shí)間完成。
寫完后調(diào)試也將近花了1個(gè)小時(shí)。寫的時(shí)候不小心把legalWord的return都寫成了false,運(yùn)行的時(shí)候一個(gè)合法單詞都沒有,這個(gè)錯(cuò)誤看了幾遍都沒看出來(lái),最后還是調(diào)試調(diào)出來(lái)的。
?最后用的總時(shí)間大概是7個(gè)小時(shí)。
?
//=======================提高性能=======================
感覺別的地方?jīng)]什么可以優(yōu)化的,要優(yōu)化的話就是在判斷是否出現(xiàn)重復(fù)的地方。因?yàn)槲覍懙呐袛嗍荗(n)的,借用樹結(jié)構(gòu)或者二分查找可以實(shí)現(xiàn)O(log n),Hash也能優(yōu)化不少性能。可是我都沒實(shí)現(xiàn)。
以I盤下的所有文件做測(cè)試。
優(yōu)化前:
?
優(yōu)化后:
可以看到,用了HASH后,運(yùn)行時(shí)間減少到1/3左右。
?
//=======================感想與總結(jié)=======================
C#的屬性,真的很方便。
類的屬性變量命名,用下劃線打頭,譬如詞頻用_freq,忽然感覺到自己可憐的詞匯量夠用了不少。
Split其實(shí)還是可以用用的,因?yàn)榉指舴抢锟梢詡鬟M(jìn)去一個(gè)分隔符數(shù)組。
文件操作相關(guān)的Directory和GetFiles,大愛。
VS2012按下F1就進(jìn)去msdn了,這樣比上網(wǎng)搜有效率多,久違的幸福感嗎?……
轉(zhuǎn)載于:https://www.cnblogs.com/hurj/archive/2012/09/24/2699474.html
總結(jié)
- 上一篇: WPF中使用流文档灵活地显示内容
- 下一篇: GIS开源程序收集(转载)