Weka試跑文本評分 / Text Rating Test With Weka
最近我在準備教授用Weka作文本分類的時候,就順帶的一直想試試理論上可以作、但一直沒資料的「文本評分」功能。文本分類主要的分類目標(class)是「類別資料」,而文本評分的分類目標就是「連續資料」,也就是分數。於是我就順手把「Reuters-21578 Text Categorization Collection」的新聞分類轉換成數字的評分,並整合StringToWordVector篩選器跟SMOreg分類器以迴歸的方式計算評分。其中StringToWordVector需要經過調整才能讓分類器順利運作,這邊我記錄一下大致上的做法。
資料準備 / Data
Reuters-21578 Text Categorization Collection這個資料是從Selim Mimaroglu博士的網站上下載而來,網址如下:
我取其中的8個主題分類的R8資料集中的所有詞彙:r8-train-all-terms跟r8-test-all-terms,並將新聞分類轉換成任意的等級數字。轉換規則跟資料分佈如下表所示:
Rating | Class | # train docs | # test docs | Total # docs |
---|---|---|---|---|
2 | acq | 1596 | 696 | 2292 |
3 | crude | 253 | 121 | 374 |
6 | earn | 2840 | 1083 | 3923 |
8 | grain | 41 | 10 | 51 |
7 | interest | 190 | 81 | 271 |
5 | money-fx | 206 | 87 | 293 |
1 | ship | 108 | 36 | 144 |
4 | trade | 251 | 75 | 326 |
Total | 5485 | 2189 | 767 |
轉換後的試算表資料如下:
將兩個資料儲存成CSV試算表,然後經過「試算表檔案轉成ARFF」處理,最後整理成兩個ARFF檔案:
- r8-train-all-terms.arff
- r8-test-all-terms.arff
我把它們壓縮之後提供給大家下載練習用:
開啟Weka Explorer,載入r8-train-all-terms.arff,然後就可以來分類了。
文本評分的分類器設定 / Text Rating Classifier Configuration
文本分類的分類器通常使用「NaiveBayesMultinomialText」,這個分類器裡面整合了文字向量化過濾器「StringToWordVector」,但文本評分就沒有這種整合式的分類器可以直接用了。所以這裡我們要用整合過濾器的分類器「weka.classifiers.meta.FilteredClassifier」來整合「StringToWordVector」跟迴歸分類法「SMOreg」(這是SVM支持向量機的迴歸版本)。
在classifier選擇「weka.classifiers.functions.SMOreg」,這邊也可以選擇其他迴歸分類器來用。
在filter選擇「weka.filters.unsupervised.attribute.StringToWordVector」。
然後我們還要進入「StringToWordVector」來作進一步設定,這個設定有點長,我先講上半部:
- IDFTransform: True,使用TF-IDF反文件頻的權重調整。
- TFTransform: True,使用TF-IDF詞頻的權重調整。
- attributeNamePrefix: 設「wv_」,任意文字皆可。切割文字成為向量特徵後,特徵命名前面所加上的前綴字串。這可避免跟分類目標特徵「class」字詞相衝突。
「StringToWordVector」下半部設定如下:
- lowerCaseTokens: True,先將文字轉換成小寫再來計算詞頻。
- normalizeDocLength: Normalize all data,將文件的長度正規化。
- outputWordCounts: 輸出詞頻而非有無出現(0=沒出現;1=有出現)。
- wordsToKeep: 200,只計算200個字。因為字太多會造成迴歸計算太久。
Test options選擇Supplied test set,Set中選擇「r8-test-all-terms.arff」測試集。接著分類目標選擇「class」。
More options裡面的Output predictions選擇CSV。
設定完成,然後就按下「Start」開始計算。
結果 / Result
建模大概花了5分鐘的時間。結果出來Mean absolute error為0.5515。
接下來看「Predictions on user test set」,就可以看到每一個文件他的實際評分跟建模預測的分數。例如第一個文件實際上是4,預測評分給它4.271,還算準。但是第9個文件實際是6,評分卻給它3.911,差異頗大。
不論如何,這總是能跑出一個很有趣的數值。如果文本中出現的字詞跟分類目標數值很有關係的話,那也許這會是一個很有效的方法。改天有時間我再用其他資料來跑跑看吧。
關於這篇評分的正式做法,請參考:Weka的中文自動評分:預測詩籤的等第
回覆刪除http://blog.pulipuli.info/2017/09/ai1weka-automatic-chinese-text-scoring.html