2022年12月13日 星期二

how to sort a pandas dataframe by two keys?

# 對於pandas資料框df如果須要依據主鍵文字欄位sentiment,

# 次鍵文字欄位text的長度進行紀錄排序,可參考如下寫法。 

def sort_by_two_columns(x): # x 表示某列資料的排序欄位值

    if x.name == 'sentiment': # 若詢問排序欄位為sentiment,回傳欄位值供排序
        return x
    elif x.name == 'text': # 若詢問排序欄位為text,回傳欄位長度值供排序
        return x.str.len()

# 先依據主鍵文字欄位sentiment由小到大,
# 再依據次鍵文字欄位text的長度由小到大,
# 排序結果重新回傳一個新資料框

sort_df = df.sort_values(by=['sentiment''text'], 
key=sort_by_two_columns, ascending=[TrueTrue], inplace=False)

pd.set_option('min_rows'100) # 資料框至少顯示100列

sorted_df = sort_df.drop_duplicates() # 去除重複記錄

2022年12月9日 星期五

how to install Ubuntu as subsystem of Windows with a ssh server?

 傳統一台 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公鑰到本機個人金鑰目錄,供身份核對之用


註: 
1. 若想要知道或切換目前 WSL 版本,可使用如下指令。
> wsl -l
Windows 子系統 Linux 版發佈:
Ubuntu-22.04 (預設值)

> wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-22.04    Running         1

> wsl --set-default-version 2

2. 不從微軟商店,直接從CMD命令列也可查詢及安裝Linux,指令如下:
> wsl --list --online
以下是可安裝之有效發佈的清單。
使用 'wsl --install -d <Distro>' 安裝。

NAME                                   FRIENDLY NAME
Ubuntu                                 Ubuntu
Debian                                 Debian GNU/Linux
kali-linux                             Kali Linux Rolling
Ubuntu-18.04                           Ubuntu 18.04 LTS
Ubuntu-20.04                           Ubuntu 20.04 LTS
Ubuntu-22.04                           Ubuntu 22.04 LTS
OracleLinux_7_9                        Oracle Linux 7.9
OracleLinux_8_7                        Oracle Linux 8.7
OracleLinux_9_1                        Oracle Linux 9.1
openSUSE-Leap-15.5                     openSUSE Leap 15.5
SUSE-Linux-Enterprise-Server-15-SP4    SUSE Linux Enterprise Server 15 SP4
SUSE-Linux-Enterprise-15-SP5           SUSE Linux Enterprise 15 SP5
openSUSE-Tumbleweed                    openSUSE Tumbleweed

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編碼