:::

Weka試跑文本評分 / Text Rating Test With Weka

image

最近我在準備教授用Weka作文本分類的時候,就順帶的一直想試試理論上可以作、但一直沒資料的「文本評分」功能。文本分類主要的分類目標(class)是「類別資料」,而文本評分的分類目標就是「連續資料」,也就是分數。於是我就順手把「Reuters-21578 Text Categorization Collection」的新聞分類轉換成數字的評分,並整合StringToWordVector篩選器跟SMOreg分類器以迴歸的方式計算評分。其中StringToWordVector需要經過調整才能讓分類器順利運作,這邊我記錄一下大致上的做法。


資料準備 / Data

Reuters-21578 Text Categorization Collection這個資料是從Selim Mimaroglu博士的網站上下載而來,網址如下:

我取其中的8個主題分類的R8資料集中的所有詞彙:r8-train-all-termsr8-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檔案:

image

  • r8-train-all-terms.arff
  • r8-test-all-terms.arff

我把它們壓縮之後提供給大家下載練習用:

2017-06-09_005634

開啟Weka Explorer,載入r8-train-all-terms.arff,然後就可以來分類了。


文本評分的分類器設定 / Text Rating Classifier Configuration

image

文本分類的分類器通常使用「NaiveBayesMultinomialText」,這個分類器裡面整合了文字向量化過濾器「StringToWordVector」,但文本評分就沒有這種整合式的分類器可以直接用了。所以這裡我們要用整合過濾器的分類器「weka.classifiers.meta.FilteredClassifier」來整合「StringToWordVector」跟迴歸分類法「SMOreg」(這是SVM支持向量機的迴歸版本)。

image

在classifier選擇「weka.classifiers.functions.SMOreg」,這邊也可以選擇其他迴歸分類器來用。

在filter選擇「weka.filters.unsupervised.attribute.StringToWordVector」。

image

然後我們還要進入「StringToWordVector」來作進一步設定,這個設定有點長,我先講上半部:

  • IDFTransform: True,使用TF-IDF反文件頻的權重調整。
  • TFTransform: True,使用TF-IDF詞頻的權重調整。
  • attributeNamePrefix: 設「wv_」,任意文字皆可。切割文字成為向量特徵後,特徵命名前面所加上的前綴字串。這可避免跟分類目標特徵「class」字詞相衝突。

image

「StringToWordVector」下半部設定如下:

  • lowerCaseTokens: True,先將文字轉換成小寫再來計算詞頻。
  • normalizeDocLength: Normalize all data,將文件的長度正規化。
  • outputWordCounts: 輸出詞頻而非有無出現(0=沒出現;1=有出現)。
  • wordsToKeep: 200,只計算200個字。因為字太多會造成迴歸計算太久。

image

Test options選擇Supplied test set,Set中選擇「r8-test-all-terms.arff」測試集。接著分類目標選擇「class」。

image

More options裡面的Output predictions選擇CSV。

設定完成,然後就按下「Start」開始計算。


結果 / Result

image

建模大概花了5分鐘的時間。結果出來Mean absolute error為0.5515。

image

接下來看「Predictions on user test set」,就可以看到每一個文件他的實際評分跟建模預測的分數。例如第一個文件實際上是4,預測評分給它4.271,還算準。但是第9個文件實際是6,評分卻給它3.911,差異頗大。

不論如何,這總是能跑出一個很有趣的數值。如果文本中出現的字詞跟分類目標數值很有關係的話,那也許這會是一個很有效的方法。改天有時間我再用其他資料來跑跑看吧。

總共1 則留言 ( 我要發問 , 隱藏留言 顯示留言 )

  1. 關於這篇評分的正式做法,請參考:Weka的中文自動評分:預測詩籤的等第
    http://blog.pulipuli.info/2017/09/ai1weka-automatic-chinese-text-scoring.html

    回覆刪除