「星期三的 meeting 延到今天。」這件事我在兩天內忘記而又被提醒了好幾次,連並非同 Lab 的同學都記得,我卻忘記了,真是慚愧 XD
雖然已經隔了兩天,但大家似乎都有其他事情要忙,因此今天還是沒有人有東西可以報告,不過剛好堅哥有新的 idea ,所以今天的 meeting 主要是堅哥在談他的 idea 。咪完之後,我因為報告終於都告一段落了,所以到 Lab 去查點論文的相關資料。
我繼續研究了一陣子 multiple pattern matching 演算法,然後覺悟到我實在沒必要把時間浪費在提昇邊際效益上,於是開始認識決策樹。我看了學弟妹的畢專論文對於決策樹的介紹後,實在無法瞭解他們選擇 ID3 的原因,如果要以最適用而論,我覺得 CART 的二分法相當適合他們,而如果要以最準確而論,改良自 ID3 的 C4.5 顯然更好。之後又看了一些其他的決策樹演算法簡介,我想 C4.5 是個不錯的研究目標。
接下來查到 Weka 這個軟體,雖然某人的 blog 上曾經提過,但我一直沒有興趣研究,因為我不會改 Java ,如果有需要對演算法作修改的話,還是用我熟悉的語言比較好。不過今天發現微軟竟然提供了 Java 轉 C# 的工具 ,所以我想或許可以參考一下用 Java 寫成的 Weka… XD
試用後才發現滿好用的,它實作了好多演算法任君選擇,效率也非常好,真是讓我心動。 ARFF 格式的資料也不難產生,只要稍微修改一下 Herbivora 便能使用,現在只差還沒有足夠的 Data 可以讓我玩——只有一種類型的 Data 是沒有辦法跑決策樹的 XD
昨天用 Aho-Corasick 比較慢果然是因為我使用錯誤,而今天重寫後成功了,執行時間幾乎沒有差異1,甚至在郵件量小時, Aho-Corasick 還會輸在它必須先為 Keywords 建立 tree 而花費更多時間,然而我還是很開心地改用 Aho-Corasick——因為我發現我本來使用的 for-loop + String.Contains 就是吃掉記憶體的最大兇手。之前我用 CLR Profiler 檢查時有發現在 Herbivora 中吃記憶體最嚴重的是 System.String 物件,但是我在建立字串時都有記得使用 StringBuilder ,所以一直搞不懂這是為什麼,沒想到今天拿掉 String.Contains ,改用 Aho-Corasick 後,記憶體用量馬上從 300 MB 掉到 60 MB2,所以就算 Aho-Corasick 慢一點點,我還是會用它的啦! XD
雖然根據我的需求, Aho-Corasick 跟 String.Contains 幾乎沒差,但理論上 Aho-Corasick 還是會比 String.Contains 快。今天在我將它套進 Herbivora 前先作了 benchmark ,發現速度是 Aho-Corasick ≈ String.Contains > String.IndexOf ≫ Regex , String.Contains 的速度大約比 Aho-Corasick 慢三倍3, String.IndexOf 由於還需回傳在哪裡找到,當然會比 String.Contains 慢一點, Regex 則又慢更多。
接下來聽說 Dictionary 通常會比 Hashtable 快,所以我想改用 Dictionary 。我本來就偏好使用 type-safe 的 Generic Collections ,這樣要取資料時也可以省下 type cast 的花費 :)
雖然 Dictionary 和 Hashtable 的 Method 都一樣,但行為有些不同,當我要用一個不存在的 key 來取 value 時, Hashtable 會回傳 null ,而 Dictionary 會給我 KeyNotFoundException ,我上次是用 try-catch 來處理這個 Exception ,但我沒想到 try-catch 這麼貴,昨天 Aho-Corasick 的速度會大輸,我想這也是其中一個原因…
下一步想測測看加入 q-Gram 會不會有更好的效果(用記憶體換速度 XD)
今天是我第一次參與投票,平常我雖然對政治沒什麼興趣,但難得的總統大選,感覺好像還是該回家投個票。由於最近作息時間的異動,我昨晚十一點便就寢1,於是今天早上六點半就醒來,上網打發時間到八點十分,父親就叫我可以去投票了。我本來還想再等一下,因為聽母親說剛開始時會有一大堆老人在排隊…… 不過在父親的勸誘之下,我還是提早出門。抵達投票所後,發現根本就沒人嘛~ 我想可能因為這裡是鄉下地方,所以就算有老人排隊,隊伍也不長。我一臉無辜地走到投票所入口,依照門口警察的指示進入領票,領完票後我回頭一看,有三個圈選區耶~ 不知道該進去哪一個,於是我無辜了一下,旁邊的選務工作人員便指示我都可以。
進入圈選區突然喚醒我小學時的記憶——當時的主題是票選某運動會的吉祥物,可能是順便想教導我們公民教育,弄了一個相當正式的投票活動,圈選區、圈選章及投票箱都跟實際的一樣。
投完總統票後,我再到隔壁桌拿公投票,公投票的部份有計算領票人數,我是第 20 個,投票也才開始 10 分鐘而已,這應該算滿踴躍的吧?公投票有兩張,票箱也有兩個,但是上面並沒有標示分別應該投到那一箱,所以我在票箱前又無辜了一下,旁邊的選務工作人員便主動告訴我都可以投。在選務工作人員們的幫助之下,雖然我無辜了好幾下,但還是很快地完成了投票流程 XD
投完票後我便直接回學校,今天試著改用 Aho-Corasick 和 Regex 兩種方法進行 multiple pattern matching ,但測試執行時間是 Aho-Corasick > Regex > for-loop + String.Contains ,所以最後還是繼續使用最簡單的 for-loop + String.Contains ,我猜可能是我的字典仍然不夠大吧!2絕望啊~ 我對於這些浪廢掉的時間感到徹底絕望啦! :p 不過在這之後我又查到一個好像更厲害的演算法—— Wu-Manber ,如果我看得懂的話再來實作看看 XD
Snort 的 source 中寫說 Wu-Manber 並沒有比 Aho-Corasick 好,另外從另一篇文章上看見對 Wu-Manber 的介紹是它融合了 Aho-Corasick 和 Boyer-Moore 的優點,後者優點是會跳過不可能符合的比對,所以 Aho-Corasick 和 Wu-Manber 之間並沒有絕對好的選擇,要視 pattern 和 subject 而定(不知道 Snort 平常用的 pattern 和 subject 長怎樣…?)
在 survey multiple pattern matching 時發現,芬蘭好像對這個議題特別有興趣… 真是令人好奇是為什麼 XD
晚上看了《きみにしか聞こえない》,我是在學姐的 blog 看見觀後感,才知道原來 DVD 已經出了。電影劇情改了好多設定,不過我覺得改得滿不錯的,增添了許多額外的色彩,原作描寫得比較平淡,太忠於原作可能會讓觀眾覺得無聊 XD
這週雖然有報告,但實在是低潮得一點都不想看 paper…… (滾來滾去)