2023-10-01

IBus 自訂聯想字列表

最近有一位朋友向在下查詢, Linux 有否提供聯想字列表的中文輸入法
由於在下通常都是每個中文字都是直接輸入,因此沒有考慮這些問題
因此嘗試了解有否相關技術
在下在 Linux 上主要是使用 IBus ,但 IBus 並 沒有提供聯想字列表
幸好 IBus 容許使用者自行定義文字輸入的方法,因此可以按自己需要修改資料及製作輸入法

見下文
例如在下通常使用 倉頡輸入法 輸入中文字,輸入中文字後沒有聯想字提供

使用 SQlite

見下文
在下使用 倉頡3 並作為例子,Linux Mint 安裝 倉頡3 後,其檔案位置在 /usr/share/ibus-table/tables/cangjie3.db

IBus 使用 SQLite資料庫 作為資料及設定檔案
雖然 SQLite格式 並非純文字格式,但 SQLite 是一種開源資料庫管理系統,只需要使用 SQL指令 便可以存取內容

在 Terminal 輸入
sudo apt install sqlite3

IBus 資料庫

安裝 SQLite3 後,便可以了解資料庫的內容,輸入:
echo '.tables' | sqlite3 '/usr/share/ibus-table/tables/cangjie3.db'
會列出資料庫中所有資料表:
  • goucima 為 文字的構詞碼
  • ime 為 輸入法的設定值
  • phrases 為 輸出的文字
  • pinyin 為 中文輸入法的拼音內容

Phrases 資料表

見下文
要自訂聯想字列表主要是在 phrases 資料表中加入需要文字內容
而變動 phrases 資料表 的內容前,需要了解資料表的結構,輸入:
echo '.schema phrases' | sqlite3 '/usr/share/ibus-table/tables/cangjie3.db'
會顯示 phrases 資料表 的結構
CREATE TABLE phrases (
	id INTEGER PRIMARY KEY,
	tabkeys TEXT,
	phrase TEXT,
	freq INTEGER,
	user_freq INTEGER
);
  • id 為 主鍵,任意不重覆整數
  • tabkeys 為 以鍵盤輸入的字符
  • phrase 為 輸出的文字內容
  • freq 為 不使用動態排列的次序,大至小排列;如果相同則按 id 小至大排列
  • user_freq 為 使用動態排列的次序,大至小排列;如果相同則按 id 小至大排列;輸出對應的文字內容後,數值自動加1

見下文
例如在下替「驚」字加上聯想字列表,先尋找「驚」字的資料,輸入:
echo 'SELECT * FROM phrases WHERE phrase LIKE "驚";' | sqlite '/usr/share/ibus-table/tables/cangjie3.db'
顯示「驚」字的資料為:
10732|tksqf|驚|500|0

見下文
在下為了方便尋找原文字及配詞內容,因此聯想字列表的 id 的為原文字加上 00 至 99

由於需要將資料寫入到 /usr/share/ibus-table/tables/cangjie3.db ,因此執行時,需要以 root 或 sudo 執行 sqlite3
輸入:
echo 'INSERT INTO phrases VALUES(1073200, "tksqf", "驚慌", 500, 0);' | sudo sqlite3 '/usr/share/ibus-table/tables/cangjie3.db'
echo 'INSERT INTO phrases VALUES(1073201, "tksqf", "驚恐", 500, 0);' | sudo sqlite3 '/usr/share/ibus-table/tables/cangjie3.db'
echo 'INSERT INTO phrases VALUES(1073202, "tksqf", "驚慄", 500, 0);' | sudo sqlite3 '/usr/share/ibus-table/tables/cangjie3.db'
(閣下不一定使用相同的聯想字列表)

見下文
完成後,輸入相同的字碼時,會顯示聯想字列表

使用 phpLiteAdmin

使用指令操作雖然方便,但互動性則比較低
可以使用 phpLiteAdmin , phpLiteAdmin 是一種借助 PHP 在網頁方式操作 SQLite資料庫 的工具
可以在 https://www.phpliteadmin.org/phpliteadmin-dev.zip 下載

見下文
見下文
將 phpliteadmin-dev.zip 解壓縮

見下文
見下文
phpliteadmin.php 修改為 index.php ,方便瀏覽時不需要輸入檔案名

見下文
見下文
見下文
要使用 phpLiteAdmin 操作 SQLite 需要安裝 php, php-mbstring, php-sqlite3
sudo apt install php php-mbstring php-sqlite3

見下文
將 SQLite資料庫 的連結存放到 phpLiteAdmin 的目錄,輸入:
ln -s '/usr/share/ibus-table/tables/cangjie3.db' .
由於 SQLite資料庫只是連結,來源的檔案仍然屬於 root ,因此需要 root 或 sudo 才能寫入資料,輸入:
sudo php -S 0.0.0.0:8080
以 sudo 方式起動臨時網頁伺服器,便可以具備具寫入權限

見下文
起動臨時伺服器後,以網頁瀏覽器瀏覽 http://127.0.0.1:8080/
載入到 phpLiteAdmin 登入頁面,預設登入密碼為 admin
(8080 是對應起動臨時伺服器時的設定值,不一定使用 8080)

見下文
登入後,顯示資料庫中的資料表基本資料

見下文
載入 phrases 資料表,按 Search分頁

見下文
在 phrase 的文字欄輸入需要搜尋的文字
(與剛才的 SELECT 搜尋文字相同)

見下文
搜尋結果與之前指令方式相同

見下文
見下文
見下文
見下文
確定需要自訂配詞的文字後,按 Insert 分頁
然後按需要在 phrase 輸入配詞文字,其他欄目則可以以在下之前建議的方式填入資料

見下文
修改完成後,在輸入文字時,便會顯示聯想字列表

見下文
見下文
但每次提交一個配詞的方式輸入資料太花時間,亦容易出錯
可以使用 SQL指令 的方式,同時執行大量操作

見下文
見下文
見下文
同樣做到相同結果

見下文
自訂聯想字列表並不限制輸入的文字在詞語中的位置
即是不一定是詞語的第一個字

見下文
自訂聯想字列表亦不限制詞語的長度
能夠只需要輸入一個字便可以將整篇文章輸出

見下文
其實聯想字列表並沒有限制任何內容,嚴格來說根本沒有聯想字列表
IBus 輸入法的資料表只是定義輸入法的規則及與鍵碼配對的內容
因此可以製作任意鍵碼配對、與原本輸入法的邏輯無關的結果
但製作的內容如果太過雜亂無章,都會影響使用輸入法時體驗,因此在下不建議太過胡亂的配對結果

見下文
由於 IBus 避免經常存取系統資料增加資源負擔,會將輸入法的內容暫存到使用者目錄
因此即使將自訂聯想字列表的內容修改或刪除,輸入時仍然會顯示原本的資料
需要整個 /home/mra/.local/share/ibus-table 目錄刪除,然後重新啟動 IBus 才能完全更新的聯想字列表
(新增的內容則會立即生效)

總結

由於在下小時候已經懂得使用倉頡輸入法,因此即使 IBus 沒有提供聯想字對在下沒有太多影響
但聯想字列表的確可以方便輸出文字,所以在下亦嘗試加入一些常用詞語到 IBus資料表

參考資料

沒有留言 :

張貼留言