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
 

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

Java 中文列印亂碼補救法

因為 NetBeans 某些版本設定其 Output 結果視窗接收字碼為 UTF8,故用 Java 列印中文時若出現亂碼,有兩種強迫輸出UTF8的補救法:

A. 專案層級修改 (推薦作法)

從 NetBeans 左側 Files 頁籤,找到 專案名/nbproject/project.properties 檔案,修改如下欄位值。改專案組態,所有其中程式都適用,較簡便。。

    run.jvmargs=-Dstdout.encoding=UTF-8

B. 程式層級修改

請在程式首次執行列印指令之前,修改輸出串流編碼為 UTF8 。指令如下。須每支程式都作修正較麻煩。

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

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


一般而言,Java 處理編碼分成 3 階段,只有原始碼編譯及執行階段會出現亂碼,狀況如下表所示。

階段 (Timing) 格式 / 載體 目的 常見問題
1. 原始碼編譯階段 (Source Compile) .java 檔案 供開發者撰寫與閱讀 編譯時出現
unmappable character 錯誤
2. 類別檔階段 (Class File) .class 檔案 JVM 執行指令 (Unicode) 無 (由 Java 內部處理,具備跨平台通用性)
3. 執行階段 (Execution) Console / Output 視窗 供使用者查看執行結果 終端機出現
中文亂碼 (Garbled text)

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

  • javac.exe -encoding big5 My.java    (適用於My.java中文用Big5編碼)
  • javac.exe -encoding utf8 My.java    (適用於My.java中文用UTF8編碼)

執行階段,若想知道輸出串流目前編碼為何,可用如下指令診斷:

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

參考: https://stackoverflow.com/questions/53257763/netbeans-9-print-unicode-characters

When to use Java String, StringBuffer, or StringBuilder?

在 Java 開發中,處理文字字串是最常見的操作之一。然而,許多初學者仍容易混淆 String 、 StringBuffer 與 StringBuilder 的使用時機。 選擇錯誤的工具不僅會影響程式的執行效率(Performance),在多執行...

總網頁瀏覽量