2022年11月7日 星期一

Use of Weka for sentiment analysis in traditional Chinese

網路上有關 Weka機器學習 軟體的文字分類範例大部份都是針對英文,以下示範針對繁體中文的作法。

由於繁體中文的標記語料很少,本範例將取自 SnowNLP 釋放的簡體中文標記語料。 SnowNLP 正負情感資料集 共計34,880筆(35k)日常聊天語料,包括負面情感(neg.txt) 18,576筆(19k),正面情感(pos.txt) 16,304筆(16k)。前處理利用 OpenCC 軟體轉換為繁體,再利用 jieba 軟體空格斷詞,存成.csv檔,其中3欄位為原始文字 text, 空格斷詞文字 token_text, 情感判定 sentiment,0表示負面,1表示正面。

用Weka分類軟體讀入.csv檔,利用StringToWordVector過濾器將 token_text 欄位由String型別轉為眾多nominal欄位,以sentiment欄位為預測目標,進行1次性訓練及測試。測試選項: Percent 66% 當訓練集(23k),34%當測集(12k)。

所有分類器都使用預設參數,準確率accuracy,訓練時間training time,測試時間testing time的結果如下,可發覺準確率表現最好為RandomForest分類器。

SnowNLP classifiers accuracy training time (s) testing time (s)
weka.classifiers.rules      
  ZeroR 52.80                  0.03             0.44
  OneR 62.10                12.23             0.38
         
weka.classifiers.trees      
  J48 85.00           2,694.75             0.37
  RandomForest 93.64              459.36             8.94
         
weka.classifiers.bayes      
  NavieBayesSimple 8.14                  5.43             7.35
  NaiveBayesMultinominalText 52.80                  0.14             0.28
  NaiveBayes 70.60                14.10             9.77
  NaiveBayesMultinominal 78.50                  0.14             0.94
         
weka.classifiers.functions      
  MLP 52.80       405,797.00           83.62
  SimpleLogistic 81.90           1,101.32             1.39
  Logistic 83.00              294.00             0.86
  SMO 83.20           5,231.83             1.94
         
weka.classifiers.lazy      
  IB1 86.20                  1.80    23,146.80
  IBk 86.70                  0.04           99.95
 

2022年11月2日 星期三

how to correct garbled code when printing Chinese in NetBeans Output Window?

因為 NetBeans 某些版本設定其 Output 結果視窗接收字碼為 UTF8,故用 Java 列印中文時若出現亂碼,請在列印指令前,加上修改輸出串流編碼為 UTF8 指令。寫法如下:

   import java.io.PrintStream;

   System.setOut(new PrintStream(System.out, true, "UTF8"));

   // 執行上述指令須處理 UnsupportedEncodingException 未支援編碼例外

   // 可用try-catch結構自己處理例外,或宣告執行該指令的方法丟出(throws)該例外給上一層處理

若想知道輸出串流目前編碼為何,可用如下指令診斷。

   System.out.println(System.out.charset());  // 常見為 x-windows-950 (繁中Big5碼) 或 UTF-8

: Windows 繁中版使用 Big5 編碼,故終端機下使用 javac.exe 編譯器若出現 unmappable character 無法映射字元錯誤,可利用如下選項,通知編譯器選用適當編碼,讀取中文:

      javac.exe -encoding big5 My.java    適用於My.java中文用Big5編碼

      javac.exe -encoding utf8 My.java    適用於My.java中文用UTF8編碼