2011-05-30 106 views
4

我想用SVM編寫一個垃圾郵件過濾器程序,我選擇libsvm作爲工具。
我得到了1000個良好的郵件和1000個垃圾郵件,然後我把它們歸類爲:
700 good_train郵件700個spam_train郵件
300 good_test郵件300個spam_test郵件
後來我寫了一個程序來計算髮生在每一個詞的時間每一個文件,得到了類似結果:如何使用libsvm進行文本分類?

good_train_1.txt: 
today 3 
hello 7 
help 5 
...  

我瞭解到,LIBSVM需要像格式:

1 1:3 2:1 3:0
2 1:3 2:3 3:1
1 1:7 3:9

作爲其輸入。我知道1,2,1是標籤,但1:3是什麼意思?
我怎樣才能將我得到的格式轉換成這種格式?

回答

4

有可能的,格式爲

classLabel attribute1:count1 ... attributeN:countN 

N是在你的文本語料庫不同字的總數。你將不得不通過不包括具有計數0

1
How could I transfer what I've got to this format? 

這是我會怎麼做這個屬性來檢查您正在使用(或它的來源),看工具的文檔,如果你可以用一個稀疏的格式。我將使用您需要的腳本來計算訓練集中每封郵件的字數。然後,使用另一個腳本並將該數據轉換爲您之前顯示的LIBSVM格式。 (這可以通過多種方式完成,但使用像Python這樣簡單的輸入/輸出語言編寫應該是合理的)我會將所有「好郵件」數據批量加入到一個文件中,並將該類標記爲「1」 。然後,我會對「垃圾郵件」數據進行相同的處理,並標記該類爲「-1」。正如nologin所說,LIBSVM要求類別標籤在特徵之前,但是特徵本身可以是任何數字,例如,只要它們以升序(例如, 2:5 3:6 5:9被允許,但不是3:23 1:3 7:343。

如果您擔心您的數據是不正確的格式,用自己的腳本

checkdata.py 

訓練之前,它應該報告任何可能的錯誤。

一旦你有了正確的格式數據的兩個獨立的文件,你可以叫

cat file_good file_spam > file_training 

,並生成一個包含上好的和垃圾郵件數據的培訓檔案。然後,使用測試集執行相同的過程。以這種方式形成數據的一個心理優勢是,您知道培訓(或測試)集中的前700(或300)個郵件是好郵件,其餘是垃圾郵件。這樣可以更輕鬆地創建其他可能需要處理數據的腳本,例如精度/回調代碼。

如果您還有其他問題,http://www.csie.ntu.edu.tw/~cjlin/libsvm/faq.html的常見問題應該能夠回答幾個問題,以及安裝時隨附的各種自述文件。(我親自在「工具」和「Python」目錄中找到自述文件,這是一個很大的好處。)不幸的是,常見問題解答並沒有涉及nologin所說的關於數據稀疏格式的內容。

最後一點,我懷疑你需要保留郵件中可能出現的每個可能單詞的計數。我建議只計算你會懷疑在垃圾郵件中出現的最常見的詞。其他潛在功能包括總字數,平均字長,平均句長以及其他可能有用的數據。