近幾天在看一個文本分類的程式,寫一下具體的實現過程。有的時候看了演算法,感覺很明白了,但是自己實現的時候卻又無從下手。這次從一個實際程式出發,或許能夠更好的理解。
首先是訓練資料集和測試資料集。每個文檔一行, 主要包括 <class>1</class><title>asdfgh</title><content>asdfghjkl</content>等項目。屆時程式會按行讀取,每行讀一個文檔。
特徵選取分以下幾個步驟:
1.設定特徵向量的維數:一般以3000為佳;
2.對訓練資料做處理;
3.載入停用詞;
4.針對不同特徵選取演算法的處理;
4.是否檢查某些詞語(。啥);
5.輸出選擇的特徵項;
主要是第二步的預先處理:
1.首先按行讀取檔案,每行是一個文檔,doc;注意,以下幾項都是對一個文檔的處理;然後迴圈處理每個文檔,直至檔案結束;
2.對每個文檔做處理,提取出其中的各個item,包括label,即class標籤內的。title和content等;
3.若是中文資料集,調用分詞模組做分詞,英文資料集直接用字元流處理。分詞結果儲存在一個vector中;
4.接下來這一步是至關重要的,產生全域詞典:
(1)將分詞結果儲存在一個map變數中,map<string, uint> wordsMap;第一項為詞語,第二項為該詞出現的次數;同時,定義變數wordsNum,記錄該文檔中出現的總詞數;
(2)儲存每個類別中的總文檔數目和總詞數;定義一個結構體,包含三個變數,一個類標,一個是總文檔數;一個是總詞數;放入一個全域的vector;
(3)這一步處理的資訊很重要,產生全域詞典:這個map的第一項為相應的term,第二項是一個結構體的vector,這個結構體包括類標名、文檔數、該詞出現的次數;因為一個term可能在多個類中出現,所以用vector來儲存。vector的長度就是該term屬於哪個類。
4(3)中產生的這個全域詞典非常重要,後面各個演算法都是用的這裡面的資訊。待續……