討論「請教 ezgo13 的 fcitx-chewing 輸入法之自建字庫問題」 [論壇 - Ubuntu 與中文]


正在瀏覽:   1 名遊客


 到底部   前一個主題   下一個主題  [無發表權] 請登錄或者註冊



討論「請教 ezgo13 的 fcitx-chewing 輸入法之自建字庫問題」
會員五級
註冊日期:
2012/4/22 10:50
所屬群組:
已註冊使用者
等級: 31
HP : 152 / 761
MP : 442 / 11493
EXP: 45
離線
## 緣起

回覆「ezgo 軍師團」/ 請教 ezgo13 的 fcitx-chewing 輸入法之自建字庫問題」。

之前有研究出心得,本來就想寫這部份,但一忙就擱著了,趁這個機會,先簡易的紀錄一下。

================================================================================

後記 (2017-03-10): 下方「回覆#2」,有討論到「快速自訂詞庫」的方式。


================================================================================


以下測試環境「Xubuntu 16.04 amd64 英文界面」

================================================================================


執行下面指令,安裝「chewing-editor」這個套件。


$ sudo apt-get install chewing-editor



執行


$ dpkg -L chewing-editor




顯示


/.
/usr
/usr/bin
/usr/bin/chewing-editor
/usr/share
/usr/share/chewing-editor
/usr/share/chewing-editor/translations
/usr/share/chewing-editor/translations/chewing-editor_zh_TW.qm
/usr/share/chewing-editor/translations/chewing-editor_en_US.qm
/usr/share/doc
/usr/share/doc/chewing-editor
/usr/share/doc/chewing-editor/copyright
/usr/share/doc/chewing-editor/changelog.Debian.gz
/usr/share/icons
/usr/share/icons/hicolor
/usr/share/icons/hicolor/scalable
/usr/share/icons/hicolor/scalable/apps
/usr/share/icons/hicolor/scalable/apps/chewing-editor.svg
/usr/share/application
/usr/share/application/chewing-editor.desktop
/usr/share/man
/usr/share/man/man1
/usr/share/man/man1/chewing-editor.1.gz




執行


$ chewing-editor



按下「Add」按鈕,會跳出一個對話框


phrase: 內稽
bopomofo: ㄋㄟˋ ㄐㄧ



分別
在欄位「phrase」輸入「內稽」
在欄位「bopomofo」輸入「ㄋㄟˋ ㄐㄧ」
然後按下按鈕「OK」,關閉對話框。


可以看到畫面上有三個按鈕「Add」「Remove」「Refresh」,

在來就是一個文字輸入框,這裡可以輸入關鍵字查詢。

可以查詢「ㄋㄟˋ ㄐㄧ」,也可以查詢「內稽」,就會查到剛剛新增的那筆紀錄。

其他的操作,就不多介紹了,請自行摸索,應該很容易上手。


輸入完後,您可以測試「fcitx-chewing」。

可以輸入「ㄋㄟˋ ㄐㄧ」

下拉(按下方向鍵「下」)就可以看到


1.內積 2.內稽



================================================================================

## 透過指令來觀看「~/.chewing/chewing.sqlite3」

剛剛輸入的資料,是會紀錄到「~/.chewing/chewing.sqlite3」這個檔案

執行


$ file ~/.chewing/chewing.sqlite3



顯示


/home/user/.chewing/chewing.sqlite3: SQLite 3.x database




執行下面指令,安裝「sqlite3」這個套件


$ sudo apt-get install sqlite3




執行


$ sqlite3 ~/.chewing/chewing.sqlite3



執行下面指令,觀看help


sqlite> .help




執行


sqlite> .tables




顯示


config_v1 userphrase_v1




執行


sqlite> .schema userphrase_v1



顯示


CREATE TABLE userphrase_v1 (time INTEGER,user_freq INTEGER,max_freq INTEGER,orig_freq INTEGER,length INTEGER,phone_0 INTEGER,phone_1 INTEGER,phone_2 INTEGER,phone_3 INTEGER,phone_4 INTEGER,phone_5 INTEGER,phone_6 INTEGER,phone_7 INTEGER,phone_8 INTEGER,phone_9 INTEGER,phone_10 INTEGER,phrase TEXT,PRIMARY KEY (phone_0,phone_1,phone_2,phone_3,phone_4,phone_5,phone_6,phone_7,phone_8,phone_9,phone_10,phrase));



執行


sqlite> select * from userphrase_v1 limit 1;




顯示


67|0|1|0|1|4867|0|0|0|0|0|0|0|0|0|0|股



執行


sqlite> select * from userphrase_v1 where phrase='內稽';



顯示


56228|21|21|1|2|3636|6272|0|0|0|0|0|0|0|0|0|內稽



執行


sqlite> .quit



================================================================================

## 透過圖形界面工具來觀看「~/.chewing/chewing.sqlite3」

執行下面指令,安裝「sqlitebrowser」這個套件


$ sudo apt-get install sqlitebrowser



執行


$ sqlitebrowser ~/.chewing/chewing.sqlite3




就會開起圖形界面工具

可以在第四個「頁籤」「Execute SQL」。

一樣可以輸入上面提到的SQL,

例如


select * from userphrase_v1 where phrase='內稽';



就可以找剛剛輸入的那筆資料。

其他的就不多介紹了,就請自行把玩了,對「RDBMS」有基礎的概念,應該很容易上手。
不過我目前會的也只有上面介紹的,以後有需要用到其他的功能,才會再去深究 :p

## sqlitebrowser 相關網址

* http://sqlitebrowser.org/
* https://github.com/sqlitebrowser/sqlitebrowser

================================================================================

關於「sqlite3」和「sqlitebrowser」這兩個工具,

我之前在「這篇」有介紹過,跟「ibus」有關。

================================================================================

## 相關網址

* GitHub / chewing / chewing-editor
* GitHub / chewing / libchewing

關於「chewing-editor」是QT寫的,然後是使用「libchewing3」,開發則是「libchewing3-dev」。

執行下面指令,安裝「libchewing3-dev」這個套件


$ sudo apt-get install libchewing3-dev



執行


$ dpkg -L libchewing3-dev



顯示


/.
/usr
/usr/lib
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/pkgconfig
/usr/lib/x86_64-linux-gnu/pkgconfig/chewing.pc
/usr/share
/usr/share/info
/usr/share/info/libchewing.info.gz
/usr/share/doc
/usr/share/doc/libchewing3-dev
/usr/share/doc/libchewing3-dev/copyright
/usr/share/doc/libchewing3-dev/README.Debian
/usr/include
/usr/include/x86_64-linux-gnu
/usr/include/x86_64-linux-gnu/chewing
/usr/include/x86_64-linux-gnu/chewing/global.h
/usr/include/x86_64-linux-gnu/chewing/chewing.h
/usr/include/x86_64-linux-gnu/chewing/chewingio.h
/usr/include/x86_64-linux-gnu/chewing/mod_aux.h
/usr/include/x86_64-linux-gnu/chewing/chewing-compat.h
/usr/lib/x86_64-linux-gnu/libchewing.so
/usr/share/doc/libchewing3-dev/changelog.Debian.gz



執行下面指令,觀看文件「/usr/share/info/libchewing.info.gz」


$ info libchewing



執行下面指令,觀看文件節點「Setup」


$ info libchewing -n 'Setup'



執行下面指令,觀看文件節點「Userphrase Handling」


$ info libchewing -n 'Userphrase Handling'




如何編譯,請參考

* https://developer.gnome.org/glib/stable/
* https://developer.gnome.org/glib/stable/glib-compiling.html
* https://developer.gnome.org/gtk3/stable/
* https://developer.gnome.org/gtk3/stable/gtk-compiling.html
* GNOME Developer Platform Demos / Platform Demos in C
* GCC and Make - Compiling, Linking and Building C/C++ Applications

執行


$ pkg-config --cflags --libs chewing



顯示


-I/usr/include/x86_64-linux-gnu/chewing -lchewing




執行下面指令編譯 (下面指令,有使用到「Command Substitution」,請參考「這篇」的說明,或閱讀 $ man bash)


$ gcc -o app main.c $(pkg-config --cflags --libs chewing)




以下是「main.c」的內容。


#include <stdlib.h>
#include <stdio.h>
#include <chewing.h>

int main(int argc, char *argv[])
{

	ChewingContext *ctx = chewing_new();

	/* do something */

	printf("hello, chewing\n");


	chewing_delete( ctx );

	return EXIT_SUCCESS;
}





## Source Code 參考網址

* https://github.com/chewing/libchewing/blob/master/test/test-userphrase.c
* https://github.com/chewing/chewing-editor/blob/master/src/model/UserphraseModel.cpp#L203
* https://github.com/fcitx/fcitx-chewing/blob/master/src/eim.c

================================================================================

## 暫記


* https://gist.github.com/mitya57/1e49b079a91942782f62 (1)
* https://docs.python.org/3/library/ctypes.html
* https://docs.python.org/2/library/ctypes.html

原始碼連結


#!/usr/bin/env python3

import ctypes
import ctypes.util

libchewing_name = ctypes.util.find_library('chewing')
libchewing = ctypes.CDLL(libchewing_name)

phrase = '內稽'
bopomofo = 'ㄋㄟˋ ㄐㄧ'

ctx = libchewing.chewing_new()

## https://github.com/chewing/libchewing/blob/v0.4.0/include/chewingio.h#L531
rtn = libchewing.chewing_userphrase_add(ctx, phrase.encode(), bopomofo.encode())

print(rtn)

ctx = libchewing.chewing_delete(ctx)



更多範例放在「GitHub」上。


* https://wiki.gnome.org/Projects/PyGObject
* http://helgo.net/simon/introspection-tutorial/stepfour.xhtml
* https://dubstepdish.com/blog/2014/02/12/gobject-introspection-build-system-example/
* http://cheesehead-techblog.blogspot.tw/2013/03/creating-libraries-and-linking-to.html
* http://lucumr.pocoo.org/2013/8/18/beautiful-native-libraries/


================================================================================

## Wikipedia

* Wikipedia / Chewing (Input Method)
* 維基百科 / 新酷音輸入法


## Forum

* Chewing IM Users
* Chewing IM Development

================================================================================

後記 (2017-03-10):

剛用「~/.chewing/chewing.sqlite3」查詢,

可以找到一篇「Chewing: 跨平台詞庫編輯器」。


然後在用「Chewing: 跨平台詞庫編輯器」查詢,

可以找到「Chewing IM Development / 跨平台詞庫編輯器」。


================================================================================


以上提供參考

報告完畢


3/8 20:20:52
應用擴展 工具箱
回覆: 討論「請教 ezgo13 的 fcitx-chewing 輸入法之自建字庫問題」
會員五級
註冊日期:
2012/4/22 10:50
所屬群組:
已註冊使用者
等級: 31
HP : 152 / 761
MP : 442 / 11493
EXP: 45
離線
參考後來的「回覆」,

可以看到一個參考網址

http://chewing.im/features.html

不過那個「Ctrl + 2 ~ 9」快速自訂詞庫的方式,
在「fcitx-chewing」,一開始我還沒試出來,若是使用「gcin」則有試出來。
後來發現,在「fcitx-chewing」,輸入「內稽」
然後把游標移到「內」前方,類似「|內稽」這樣。
這時候再按下「Ctrl+2」,就會「快速自訂詞庫」了。


下面的探索,發現到,也可以閱讀「libchewing / README.md / Editing mode」。

================================================================================

可以去了解「fcitx-chewing」的「原始碼」是否有實做這一段。

以下簡易的探索,提供探索的起點。

執行下面指令,下載「fcitx-chewing」的「Source Package」,也就是「fcitx-chewing」。


$ apt-get source fcitx-chewing



執行


$ grep Ctrl fcitx-chewing-0.2.2/* -R -n



顯示


fcitx-chewing-0.2.2/src/eim.c:218: } else if (state == FcitxKeyState_Ctrl && FcitxHotkeyIsHotKeyDigit(sym, FcitxKeyState_None)) {
fcitx-chewing-0.2.2/src/eim.c:219: chewing_handle_CtrlNum(ctx, sym);




================================================================================

執行下面指令,下載「libchewing3」的「Source Package」,也就是「libchewing」。


$ apt-get source libchewing




執行


$ grep 'chewing_handle_CtrlNum' libchewing-0.4.0/* -R -n



顯示


libchewing-0.4.0/ChangeLog:95: * src/chewingio.c (chewing_handle_Default) (chewing_handle_CtrlNum):
libchewing-0.4.0/ChangeLog:997: (chewing_handle_Default) (chewing_handle_CtrlNum):
libchewing-0.4.0/ChangeLog:1102: * src/chewingio.c (chewing_handle_CtrlNum): Return while selecting.
libchewing-0.4.0/ChangeLog:1195: (chewing_handle_CtrlNum): Since we are using key '`' for open symbol
libchewing-0.4.0/debian/libchewing3.symbols:63: chewing_handle_CtrlNum@Base 0.3.4
libchewing-0.4.0/doc/libchewing.info:281: -- Function: int chewing_handle_CtrlNum (ChewingContext *CTX, int KEY)
Binary file libchewing-0.4.0/doc/libchewing.info matches
libchewing-0.4.0/doc/libchewing.texi:322:@deftypefun int chewing_handle_CtrlNum (ChewingContext *@var{ctx}, int @var{key})
libchewing-0.4.0/include/chewingio.h:151:CHEWING_API int chewing_handle_CtrlNum(ChewingContext *ctx, int key);
libchewing-0.4.0/README.md:315: Ctrl-1 chewing_handle_CtrlNum Open symbol selection dialog
libchewing-0.4.0/README.md:316: Ctrl-2 chewing_handle_CtrlNum Remember 2-word phrase.
libchewing-0.4.0/README.md:317: Ctrl-3 chewing_handle_CtrlNum Remember 3-word phrase.
libchewing-0.4.0/README.md:318: Ctrl-4 chewing_handle_CtrlNum Remember 4-word phrase.
libchewing-0.4.0/src/chewingio.c:895: chewing_handle_CtrlNum(ctx, key);
libchewing-0.4.0/src/chewingio.c:901: chewing_handle_CtrlNum(ctx, key);
libchewing-0.4.0/src/chewingio.c:1633:CHEWING_API int chewing_handle_CtrlNum(ChewingContext *ctx, int key)
libchewing-0.4.0/test/test-error-handling.c:152: ret = chewing_handle_CtrlNum(NULL, 0);
libchewing-0.4.0/test/test-error-handling.c:153: ok(ret == -1, "chewing_handle_CtrlNum() returns `%d' shall be `%d'", ret, -1);
libchewing-0.4.0/test/testhelper.c:226: chewing_handle_CtrlNum(ctx, ch - KEY_CTRL_BASE);
libchewing-0.4.0/test/genkeystroke.c:409: chewing_handle_CtrlNum(ctx, add_phrase_length);



執行下面指令,觀看「README.md」。


$ libchewing-0.4.0/README.md



執行下面指令,然後找尋「chewing_handle_CtrlNum」


$ info libchewing -n 'Input Handling'



================================================================================

以上新發現,提供參考

報告完畢


3/10 16:43:18
應用擴展 工具箱
回覆: 討論「請教 ezgo13 的 fcitx-chewing 輸入法之自建字庫問題」
會員五級
註冊日期:
2012/4/22 10:50
所屬群組:
已註冊使用者
等級: 31
HP : 152 / 761
MP : 442 / 11493
EXP: 45
離線
寫了一些範例,放在「GitHub」上。

展示透過「Python / ctypes — A foreign function library for Python
來呼叫「libchewing」。


主要是實做「userphrase」的部份,
可以參考下面四個「雛型」,

* chewing_userphrase_add (c) (chewingio.h) (chewingio.c)
* chewing_userphrase_enumerate (c) (chewingio.h) (chewingio.c)
* chewing_userphrase_lookup (c) (chewingio.h) (chewingio.c)
* chewing_userphrase_remove (c) (chewingio.h) (chewingio.c)

預估就可以依據這樣基礎,自行設計一個Python的「lib」,

進一步就可以設計「GUI(圖形界面)程式」,例如:可以採用「Python GTK+ 3」。
或是「CLI(指令)程式」,例如:可以設計「批次匯出」和「批次匯入」的功能。
而「chewing-editor」目前也有提供「匯出匯入」這樣的功能,檔案格式是採用「json」。
所以透過上面的,也可以自行設計不同「匯出匯入」的檔案格式。

以上參考,給有興趣練習的人,可以有一個起點。
上面「回覆#1」,也有列一些參考連結可以參考。

報告完畢


3/26 1:15:38
應用擴展 工具箱
回覆: 討論「請教 ezgo13 的 fcitx-chewing 輸入法之自建字庫問題」
會員五級
註冊日期:
2012/4/22 10:50
所屬群組:
已註冊使用者
等級: 31
HP : 152 / 761
MP : 442 / 11493
EXP: 45
離線
剛在「libchewing」的原始碼,發現到原來已經有使用「ctypes」來實做了,
檔案是放在「libchewing/contrib/python/chewing.py」。

看起來是根據「python2」這個版本寫的。

我上面「回覆#3」的範例,則是根據「python3」寫的。

================================================================================

我的環境是「Xubuntu 16.04 amd64 英文界面」


執行


$ dpkg -L libchewing3



顯示


/.
/usr
/usr/lib
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/libchewing.so.3.2.0
/usr/share
/usr/share/doc
/usr/share/doc/libchewing3
/usr/share/doc/libchewing3/copyright
/usr/share/doc/libchewing3/changelog.Debian.gz
/usr/share/pyshared
/usr/share/pyshared/chewing.py
/usr/lib/x86_64-linux-gnu/libchewing.so.3



可以看到「/usr/share/pyshared/chewing.py」這個檔案。
也就是原始碼的「libchewing/contrib/python/chewing.py」這個檔案。

一開始進到「python」,


$ python



使用「import chewing」會找不到。


>>> import chewing
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named chewing




然後在另一個Terminal執行


$ ls /usr/share/pyshared



會看到


...略...
chewing.py
...略...
lsb_release.py
...略...



然後我再執行「import lsb_release」卻是正常的


>>> import lsb_release



然後執行


>>> lsb_release



顯示


<module 'lsb_release' from '/usr/lib/python2.7/dist-packages/lsb_release.py'>



然後執行


$ ls /usr/lib/python2.7/dist-packages/lsb_release.py -l



顯示


lrwxrwxrwx 1 root root 38 Jul 7 2016 /usr/lib/python2.7/dist-packages/lsb_release.py -> ../../../share/pyshared/lsb_release.py



所以只要執行下面的指令,就可以在「python2」正常的「import chewing」了


cd /usr/lib/python2.7/dist-packages/
sudo ln -s ../../../share/pyshared/chewing.py chewing.py




================================================================================

以下是根據「libchewing/contrib/python/chewing.py」這個版本寫的範例,
跟上面的「回覆#3」的範例的原理是一樣的。

而「libchewing/contrib/python/chewing.py」特別的地方,在於是封裝成一個「class ChewingContext」。

使用方法請參考「libchewing/contrib/python/test.py


* userphrase_add.py
* userphrase_enumerate.py
* userphrase_lookup.py
* userphrase_remove.py

================================================================================

補充完畢


3/27 4:19:07
應用擴展 工具箱


 [無發表權] 請登錄或者註冊


可以查看帖子.
不可發帖.
不可回覆.
不可編輯自己的帖子.
不可刪除自己的帖子.
不可發起投票調查.
不可在投票調查中投票.
不可上傳附件.
不可不經審核直接發帖.