# 對於pandas資料框df如果須要依據主鍵文字欄位sentiment,
# 次鍵文字欄位text的長度進行紀錄排序,可參考如下寫法。
def sort_by_two_columns(x): # x 表示某列資料的排序欄位值
# 對於pandas資料框df如果須要依據主鍵文字欄位sentiment,
# 次鍵文字欄位text的長度進行紀錄排序,可參考如下寫法。
def sort_by_two_columns(x): # x 表示某列資料的排序欄位值
傳統一台 Windows 主機若要同時跑 Linux 作業系統,不是要安裝 Cygwin 套件,就是要透過 VirtualBox 等虛擬機軟體安裝 Linux。現在 Windows 的 WSL (Windows Subsystem for Linux) 技術逐漸成熟,可以在 Windows 環境中,啟用 Linux 子系統,方便雙方資料共享,及執行 Linux 程式和指令。以下簡短摘要步驟,說明如何透過 Microsoft Store 微軟商店,安裝 Ubuntu 22.04.1 LTS 作業系統。
1.啟動 Windows 的 Linux 子系統 (WSL) 功能
控制台/程式集/程式和功能: 開啟或關閉 Windows 功能
勾選: Windows 子系統 Linux
2.安裝 Ubuntu 作業系統
Microsoft Store: 找尋安裝 Ubuntu 22.04.1 LTS,建立帳戶myuser
3.啟動 Ubuntu 作業系統終端機
建立桌面捷徑圖示:
目標: C:\Windows\System32\wsl.exe
開始位置: \\wsl$\Ubuntu-22.04\home\myuser
或使用 SearchBox: ubuntu2204
4.安裝 ssh 終端機登入服務,供遠方登入本機之用
4.1.安裝 ssh 服務
WSL終端機執行如下指令:
> sudo apt remove openssh-server
> sudo apt install openssh-server
> sudo service ssh start
4.2.設定 ssh 服務於 Windows 開機時自動啟動
4.2.1. 設定權限,允許不輸入密碼即可啟動服務
WSL終端機執行如下指令
> sudo vim /etc/sudoers
%sudo ALL=NOPASSWD: /usr/sbin/service ssh start
4.2.2. Windows 工作排程器設定如下開機任務
設定工作排程器 (Task Scheduler),開機時自動啟動
Basic Task
Trigger: When the computer starts
Program: C:\Windows\System32\wsl.exe
Argument: sudo /usr/sbin/service ssh start
參考: https://www.howtogeek.com/746532/how-to-launch-cron-automatically-in-wsl-on-windows-10-and-11/
4.3.設定金鑰目錄權限,拷貝遠方客戶的公鑰進來,供客戶登入本機時簽發訊息核對身份之用
WSL終端機執行如下指令
> mkdir ~/.ssh # 家目錄下建立金鑰目錄
> chmod 700 ~/.ssh # chmod 指令只對/根目錄 (wslfs) 有效,對/mnt/c (drvfs)掛載目錄無效
> scp -p user@host:.ssh/*pub . # 拷貝遠方既有.pub公鑰到本機個人金鑰目錄,供身份核對之用
> wsl --set-default-version 2
網路上有關 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 |
因為 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編碼