weka 文本分類(1)


一、初始化設置

1 jvm out of memory 解決方案:

在weka SimpleCLI窗口依次輸入
java -Xmx 1024m

 

2 修改配置文件,使其支持中文:

配置文件是在Weka安裝后的目錄下,比如我的是在C:\Program Files\Weka-3-7\RunWeka.ini,打開這個文件,找到fileEncoding=Cp1252這一行,改成fileEncoding=utf-8即可。如下:

# The file encoding; use "utf-8" instead of "Cp1252" to display UTF-8 characters in the # GUI, e.g., the Explorer fileEncoding=utf-8

如果是在C盤,可能會提示沒有權限保存,這時可以把這個配置文件復制到桌面,修改完了再替換回去。

有些同學,改完配置文件,中文依然亂碼,可能因為源文件不是utf8編碼格式的,可以用notepad++把arff文件打開,然后選擇格式->轉為UTF-8編碼格式,保存。

 

二、數據格式:

Weka使用的數據格式是它自己規定的,arff格式,大概就是這個樣子:

@relation F__zle_study_ccf_code_Archive_text3

@attribute text string
@attribute @@class@@ {text006,text010,text013,text014,text015,text016,text020,text023,text024,text026,text100,text103,text104,text105,text106,text110,text113,text114,text115,text116,text120,text121,text122,text123,text124,text125,text126,text200,text203,text204,text205,text206,text210,text211,text212,text213,text214,text215,text216,text220,text222,text223,text224,text225,text226,text300,text302,text303,text304,text305,text306,text310,text311,text312,text313,text314,text315,text316,text320,text321,text322,text323,text324,text325,text326,text400,text403,text404,text405,text406,text410,text411,text412,text413,text414,text415,text416,text420,text421,text422,text423,text424,text425,text426,text500,text510,text511,text512,text513,text514,text515,text520,text521,text522,text523,text524,text525,text526,text600,text610,text612,text613,text614,text616,text620,text623,text624}

@data
'地圖 中國 完整版 電影 秘密 官網 喬丹 2016 超載 超限 規定 最高 現在 中國 電影 超輕型',text006

'貨運 遠洋 秘密 版大圖 世界地圖 高清 順德 版大圖 高清 唐朝',text014

 

1 將文件轉換成ARFF文件:

TextDirectoryLoader

java weka.core.converters.TextDirectoryLoader -dir text_example > text_example.arff

該方法只能通過命令行實現。如果是在windows下,要首先在環境變量里加入weka.jar的位置,再在cmd里敲入命令行。

該類的作用是把輸入目錄轉化成ARFF文件,但是轉化之后的ARFF文件里的屬性是string型的,依然是大多數分類器不能處理的,需要做進一步處理。該類的作用相當於把每個文本表示一行的string格式。

輸入的文件目錄的格式應為圖1所示:

 

  圖1 文件目錄格式

 

一個生成圖1格式的代碼

import os
re_base='F:\zle\study\ccf\code\Archive\dict_keywords.txt'#文件讀取目錄
wr_base="F:/zle/study/ccf/code/Archive/text3/text" #文件生成目錄
with open(re_base,'r') as f:
    line=f.readlines()


for x in range(107):#一共有107類
    catalog=line.pop(0).split(':')[0] 
    file_name=wr_base+str(catalog)
    if not os.path.exists(file_name):
        os.path.join(wr_base,str(catalog))
        os.mkdir(file_name)
    else:
        pass
    with open(file_name+'/'+str(catalog)+'.txt','w') as f:
        f.write(line.pop(0).replace(',',' '))

 

2.StringToWordVector

由TextDirectoryLoader轉化成的arff還不能直接用來分類,還需StringToWordVector類的進一步處理。這步在命令行和GUI上都能操作,但建議直接轉到GUI上來操作更清楚、方便。

在打開的WEKA界面中選擇打開已經上一步處理過的文件,然后選擇StringToWordVector,該類位於weka.filters.unsupervised.attribute.StringToWordVector中,然后點擊可以配置參數。這也是GUI的好處之一,可以配置更加詳細的參數。

GUI步驟:

    1. 進入Weka的Explorer頁面,Open file..選中這個e:/data.arff文件
    2. 在Filter中點擊Choose 
      選擇 weka->filters->unsupervised->attribute->StringToWordVector 
      點擊Apply之后,Weka將自動統計詞頻,將詞轉成特征。

      在StringToWordVector中可以配置是否使用TFIDF特征,詞頻是否只使用0,1統計(outputWordCounts=false)

 

 

參數介紹

這里簡要介紹一下StringToWordVector可能需要自己做調整的參數:

-W 需要保留的單詞個數,默認為1000。這不是最終的特征維數,但是維數跟此參數是正相關的

             -stopwords <file> 輸入停詞文件,文件格式為每一個詞一行。在讀文件到轉化特征時會自動去掉這些常用詞,系統自帶有一套停用詞。

-tokenizer <spec> 自定義所要去除的符號,一般為標點符號。默認有常用的標點符號,但往往是不夠的,所以需自己添加

其他參數只需默認值即可。在GUI當中,還有一些參數設置需要介紹:

lowerCaseTokens 是否區分大小寫,默認為false不區分,這里一般要設置為ture,因為同一個詞就會有大小寫的區別

三.特征選擇與訓練

提取完ARFF文件之后,可以按上方的按鈕保存文件。在Attribute一欄中也會顯示所有的特征,此時也可以自己觀察一下所提取的單詞是否合理,然后再在去停詞、符號等等方面做改進,當然若至於少部分的有問題,也可以手動剔除。

此步進行完之后,可以使用降維方法(例如PCA)對特征進行降維,當然這不是必須的。

接下來就可以按照一般ARFF文件進行訓練了。

 

進入Classify面板,在Start按鈕上面的下拉框中,選中(Nom)@@class@@ 這個表示分類的標簽屬性列

點Choose按鈕選擇trees中的J48,然后點擊Start,Weka便開始進行訓練。只要數據格式正確了,可以使用這里面的各個分類器進行訓練,比如RandomForest,NaiveBayes,比較分類效果。

四 Weka輸出結果的簡單說明

=== Summary ===(總結)

Correctly Classified Instances(正確分類的實例)          45               90      %
Incorrectly Classified Instances (錯誤分類的實例)        5               10      %
Kappa statistic(Kappa統計量)                               0.792 
Mean absolute error(均值絕對誤差)                           0.1   
Root mean squared error(均方根誤差)                   0.3162
Relative absolute error(相對絕對誤差)                    20.7954 %
Root relative squared error(相對均方根誤差)             62.4666 %
Coverage of cases (0.95 level)          90      %
Mean rel. region size (0.95 level)      50      %
Total Number of Instances(實驗的實例總數)               50     

=== Detailed Accuracy By Class ===

                    TP Rate(真陽性率) FP Rate(假陽性率) Precision(查准率)   Recall(查全率)  F-Measure  MCC(Matthews相關系數)    ROC Area  PRC Area  Class(類別)
                     0.773           0                1               0.773       0.872         0.81            0.886      0.873     true
                      1               0.227           0.848            1          0.918         0.81            0.886      0.848     false
Weighted Avg.       0.9            0.127           0.915            0.9       0.898         0.81            0.886      0.859

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM