作者cnoize (泥巴星球Server)
看板IME
標題[xx] X X 輸入法簡介 2005-02
時間Thu Feb 24 08:28:27 2005
重新作一次完整的介紹.
(*) 源起:
我以前用行列三十的 CAI 練習, 鍛練常用字一千字,
現在已經把行列的規則全部忘光了, 其餘的字只好利用注音來輸入.
行列的缺點是常用字選字率太高, 所以我沒有把行列學好的願望.
為了避免選字的問題, 我決定製作一個選字率零的輸入法.
研究自己的輸入法的想法是從 1995-1997 年開始的. "Google 網上論壇"
還有保存一些我在 tw.bbs.comp.chinese 跟別人討論輸入法的文章, 那時
也買了不少輸入法的相關書籍.
經過簡易的計算 (26*26*26 = 17576), 我相信把 BIG5 (約 13053 字)
用三碼來輸入是可行的, 所以一開始是研究如何把常用字用最少的字根來組成.
一段時間之後, 突然頓悟, 只需把所有的字都強制設成三碼, 這樣常用字就可以
輕易地放進簡碼區, 沒有太大的困難. 同時這也是很容易製作的輸入法, 因為
我一開始就決定字根越多越好, 用字根數量來換取無重碼, 所以也不需要把字拆
得很細, 研究每一筆畫.
自覺觀念上有所突破之後, 我就開始開始專心做其他的事情. 這個時間點
沒有記錄, 不過我相信是在 1997-1998 年左右. 後來就幾乎沒有花時間來製作,
直到 2002 年 1 月 30 日, 決定在 BBS 個人版公開說明要製作免費、開放的
輸入法, 以便實際實作. 當時提出的宣告是
"目前完成度: 概念 100% , 字詞分析 0% , 程式 0% , 文件 0%"
經過三年, 完成度提高不少, 不過想要達到的目標漸漸增加, 做好的時間
遙遙無期, 所以只好再重寫一次最新版本的簡介, 希望可以把一些概念提供給
別人參考.
(*) 無重碼:
這是我的輸入法的最重要、最基礎的目標, 其他皆可放棄.
利用一些強制性的規則, 要達到無重碼是很容易的.
以下列出的數字可能會有些誤差:
big5 約 13053 (再加 7 個倚天字), 在 unicode 中, gb2312
約有 6763 字, 去掉與 big5 同位置的部分,還有 2381 個.
jisx 0208 約有 6356 字, 去掉與 big5 & gb2312 同位置的部分,
還有 848 字.
ksc 暫時不處理. (參考 CJKV 933 頁, Duplicate Hanja in KS X 1001:1992)
(同字形、不同音的字是字形輸入法的重大困擾.)
13060+2381+848 = 16289 字.
26*26*26 = 17576 字, 所以每個字都用三鍵, 可以做到不重碼.
(big5 + gb2312 + jisx 0208 的文字) (符號另外處理)
(1) 上述的數字是基本功能: "繁簡加日文不用選字".
我同時也很希望這個輸入法同時適用於其他三種語言環境:
(2) GBK/1 (?) + GBK/2 漢字6763個 + GBK/3 漢字6080個 不重碼.
(最好 GBK/4 之中的常用漢字也不重碼)
(ref. Google 搜尋: gbk 1 級)
http://www.unihan.com.cn/news/wangxb_ful.htm
(3) 日文 jisx 0208 + jisx 0212 不重碼.
(4) big5hkscs 漢字字符不選字.
4377 + 13060 = 17437
(ref.
數碼21:資訊科技基礎建設:甚麼是《香港增補字符集》
http://www.info.gov.hk/digital21/chi/hkscs/development.html)
在標準模式 (big5 + gb2312 + jisx0208), 輸入三鍵 + "2" 是輸出 GBK 字元,
+ "3" 輸出 JIS 字元, + "4" 輸出 BIG5HKSCS 字元. 輸入三鍵 + "1" 不變,
輸出標準模式字元.
在第 (4) 項 BIG5HKSCS 模式時, 跟上述的方法相同, 輸入三鍵 + "1" 輸出標準
模式字元.
也就是說, 其實我是同時在做下列輸入法: big5, big5hkscs, gb2312, gbk,
jisx, unicode. 它們之間的排列組合所造成的複雜度, 會嚴重地影響開發進度.
(*) 其他特色:
0. 標準字: 26 * 26 * 26 = 17576 ([a-z] 三個鍵加一個空白.)
1. 字根數量多:
在開發初期, 就預估 BIG5 字根約有 2000 ~ 3000 個, 現在的狀況是:
ici findrootuni2run.ici uniok.txt | wc -l => 2253
約 2253 個, 它還包含了簡體及日文的部分字根.
只用約一般輸入法十倍的字根來讓選字率達到零, 其實很划算.
2. 無省略字形:
一般的拆字輸入法, 常常採用 "首、次、三、尾" 的方式取碼, 我認為
這樣子不合理, 會造成訊息的損失, 所以用相反的方法處理, 不但不省略,
字形還常常重複使用.
3. 用可見字組描述字根.
在每一個獨立支援的字集, 都可以用字集內的字元描述字根.
如此就不必造字, 也可以描述字根, 方便使用者學習.
例如:
U+897B : 左衣 攀 (手) # 襻 (b5)
U+9C5E : 魚 還右 (衣下) # 鱞 (b5)
全部包含的 XX 是用 上XX 下XX 左XX 右XX 來代表
熱 的下半部是 "下火"
江 的左半部是 "左水"
作 的左半部是 "左人"
字的部分是用 XX上 XX左 XX外 XX內 XX右 等來代表.
還 的右半部是 "還右"
grep 還右 uniok.txt
U+5107 : 左人 還右 # 儇 (b5)
U+566E : 口 還右 # 噮 (b5)
U+571C : 國外 還右 # 圜 (b5)
U+5B1B : 女 還右 # 嬛 (b5)
U+5BF0 : 家上 還右 # 寰 (b5)
U+5F4B : 弓 還右 # 彋 (b5)
U+61C1 : 左心 還右 # 懁 (b5)
U+64D0 : 左手 還右 # 擐 (b5)
如果不習慣某些用詞, 因為資料表格是文字檔, 可以輕易地
修改, 例如把 "還右" 換成 "環右".
4. 拆字時不會有困難.
所有的字形都包含在字根表之中了, 拆字一定不會有問題. 不會的字
只需查表即可.
5. 沒有容錯.
一字三碼, 三碼一字.
容錯是不必要的, 難字查表即可, 學習者不會有疑惑.
6. 正式版本確定公布之後, 不可以修改.
修改字碼會浪費學習者的時間. 好的做法是一開始就做到最好.
其次是全部重新翻新, 開發新系統, 但以附加的方式增進原本的系統.
(*) 如何做到無重碼(不用選字):
重碼的意思是: 兩個不同的單字的輸入鍵位相同, 以致於必須設法避開,
或是讓使用者選字. 重碼會嚴重地降低輸入文字的速度, 一般的輸入法,
常用字區也常常有重碼.
嘸蝦米輸入法對於減少重碼, 作了很多努力, 但仍然沒有達成完全無重碼
的效果.
而這個輸入法利用了一些簡單的技巧來解決重碼的問題:
1. 運用大量的的字根, 因而能夠分散相似的文字至不同鍵位.
相似字根的文字自然地被分開. 例如: "員" 和 "唄", 由於
"員" 字旁常被其他文字使用, 所以 "員" 是字根. 取:
"員: 員 (貝)", 而 "唄: 口 貝".
2. 讓 "標準字" 都用 3 鍵輸入, 不足的要設法補滿.
補滿的方法是加入副根. 每一個字根都有一個副根,
基本上以每個字根的最後幾部分組成.
(跟嘸蝦米的輔根不太一樣, 嘸蝦米是用最後一筆劃,
而副根是任何字形都可以. )
副根在表格中加上 "()" 來識別.
例如 "畾" 的副根是 "田", "田" 的副根是 "一"
U+757E : 畾 (田) (一) # 田 田 田 # 畾 (b5)
U+7530 : 田 (一) # page 111 # 田 (b5)
筆畫較多的字, 當然自己就是字根.
grep 龜 uniok.txt =>
U+9604 $ 簡門 簡龜 (彎勾) # ??? # 蓗 (gb)
U+9B2E : 鬥 龜 (凶上) # 鬮 (b5)
U+9F9C : 龜 (凶上) (捺) # 最後一筆是 X # page 215, 14 # 龜 (b5)
U+9F9D: 禾 龜 (凶上) # 虡 (jp)
U+9F9F $ 簡龜 (彎勾) (無) # ??? # 實 (gb)
3. 由於副根的副根是相同的, 補滿的時候會容易造成重碼的機會.
舉例而言, 很多字根的副根會是 "(一)", 假設 "一" 的副根為
"(無)". 只要這類字根超過 26 個, 第一個鍵碼([a-z]) 就不夠用
了.
所以要加入一個規則, 在第二鍵碼相同、第三鍵碼空缺, 需要
加入副根時, 改成加入首根(字首).
首根在表格中加上 "<>" 來識別.
由於字根 "一" 的這類字數量過多, 改用 "石 (口)" 來舉例:
(33 個)
grep 石 uniok.txt | grep "<" | grep ">"
U+59AC: 女 石 <折> # (口) # 戀 (jp)
U+5B95: 家上 石 <點> # (口) # 宕 (b5)
U+5CA9: 山 石 <豎> # page 46 # (口) # 岩 (b5)
U+62D3: 左手 石 <橫> # page 64 # (口) # 拓 (b5)
U+67D8: 木 石 <橫> # page 78 # (口) # 柘 (b5)
U+6CB0: 左水 石 <點> # (口) # 沰 (b5)
U+70BB: 火 石 <點> # page 100 (口) # 嚍 (gb)
U+7809: 丰 石 <撇> # (口) # 砉 (b5)
U+7826: 此 石 <豎> # page 87 (口) # 砦 (b5)
U+782E: 奴 石 <折> # (口) # 砮 (b5)
U+7833: 石 石 <橫> # (口) # 砳 (b5)
U+783B: 簡龍 石 <橫>(?) # (口) # 篳 (gb)
U+7869: 折 石 <橫> # (口) # 硩 (b5)
U+7870: 沙 石 <點> # (口) # 硰 (b5)
U+787B: 堅上 石 <橫> # page 145 # (口) # 硻 (b5)
U+7881: 其 石 <橫> # page 12 (口) # 賈 (jp)
U+7881: 其 石 <橫> # (口) # 倚天字 # 碁 (b5)
U+7886: 波 石 <點> # (口) # 碆 (b5)
U+789E: 品 石 <口> # (口) # 碞 (b5)
U+78D0: 般 石 <點> # page 146 # (口) # 磐 (b5)
U+78DB: 斬 石 <橫> # page 176 (口) # 磛 (b5)
U+78E8 : 磨 (石) <點> # page 60 # (口) # 摩上 石 # 磨 (b5)
U+78EC: 聲上 石 <士> # (口) # 磬 (b5)
U+78FF: 歷上 石 <橫> # page 19 # (口) # 磿 (b5)
U+7910: 學上 石 <凶上> # <撇> page 42 # (口) # 礐 (b5)
U+791C: 舉上 石 <橫> # page 146 (口) # 礜 (b5)
U+7928: 畾 石 <田> # (口) # 礨 (b5)
U+7931: 龍 石 <立> # (口) # 礱 (b5)
U+794F: 左示 石 <點> # (口) # 祏 (b5)
U+8DD6: 足 石 <口> # (口) # 跖 (b5)
U+9250: 金 石 <全上> # (口) # 鉐 (b5)
U+9B96: 魚 石 <撇> # page 208 # (口) # 羃 (jp)
U+9F2B: 鼠 石 <撇> # page 214 # (口) # 鼫 (b5)
4. 一個字根可以用多鍵碼來輸入.
例如這個不常用字 "乜", 可以依需求, 找一個空位,
隨意編成 "EXS".
由於這是一個不常用字, 所以可以不必學.
不過對於有需求的人而言, 不需要選字, 整個系統仍然無重碼.
U+4E5C # 乜 (b5)
(*) 簡碼的數量:
1. 簡碼及保留給使用者自訂的空間:
26 ([a-z] 加一個空白.)
26 * 10 = 260 ([a-z] 加 1 ~ 0 選字.)
26 * 26 = 676 ([a-z] 兩個鍵加一個空白.)
26 * 26 * 10 = 6760 ([a-z] 兩個鍵加 1 ~ 0 選字.)
2. 標準字空間: (不選字)
26 * 26 * 26 = 17576 ([a-z] 三個鍵加一個空白.)
我的觀念是:
字根的多少並不會影響熟練之後的運用, 反而是常用字
的選字才會巨大地影響使用者輸入的速度.
不過跟字的輸入速度相比, 詞句的快速輸入才是真正
加快整體輸入速度的關鍵. 所以字根選擇的好壞、易記與否
重要性較低, 只要有一個統一的基礎可以讓常用詞語、使用者
自訂詞容易輸入即可.
因此我的簡碼區會放很多詞, 例如: "s" 就可能放 "所以", "eg"
是 "例如". "i" 是 "我", "i2" 是 "我國". 當然不只是詞, 完整的句子
也可以放進簡碼區之中.
加快輸入速度的要點是, 簡化字根製作的過程, 利用特殊規定、
不重碼的原則來達成每個標準字都 3 碼的目標. 然後即可大量訂定
常用詞. 雖然這些詞需要選字, 但是由於保留的空間很多, 使用者
可以依照自己的習慣, 大量訂定自己的常用字、詞. 只要多加使用
即可熟練. 最後每個人都可以輕易地達到每分鐘輸入 300 字的階段性
目標.
不止是 1 碼、2 碼及其選字的空間全部用來放簡碼及詞句.
能夠輸入的任何按鍵序列都能輸出簡碼及詞句. (允許大量的自訂詞.)
也就是說, 鍵盤上的符號: `~!@#$%^&*()-_+={[}]|\:;"'<,>.?/ 雖然
標準鍵並不加以使用, 但允許使用者自訂詞庫使用這些符號.
從以上的說明, 讀者可以了解, 在理論上, 目前其他的輸入法
不可能比這個輸入法快, 因為其他的輸入法保留的簡碼空間、簡碼的
詞句數量、及標準常用字長度等等要點, 都無法相比. 所以在速度方面,
這個輸入法必定居於領先的地位.
這邊有一個特殊的地方, 雖然我認為輸入法比賽必須允許
使用詞庫才合理(然後每次從題庫中選取十萬字的小說, 計時直到
全部輸入、修訂完成為止.) 但是這一個輸入法由於選字率為零,
可以採用 "BIG5 三碼出字、不用按空白鍵" 的模式, 簡碼區跟其他
輸入法一樣放常用字, 卻可以進一步提升字的輸入速度. 有興趣的人
可以實驗一下, 不按空白鍵時, 感覺上應該快很多.
(*) 製作過程:
1. 先列出 BIG5 字元, 作簡單的編號, 然後加上初步分析.
處理過的字加上冒號 ":".
112973: 麡: 鹿 齊
112974: 黵: 黑 詹
112975: 鼉 繩右
112976: 齇: 鼻 虎上 且
112977: 齸: 齒 益
112978: 齻: 齒 真
112979: 齺: 齒 鄒左
112980: 齹: 差 齒
2. 參考 cjkxref.txt, 列出 gb2312 不存在於 BIG5 的字元.
處理過的加上 "$" 符號.
http://examples.oreilly.com/cjkvinfo/unicode/cjkxref.txt
201608: 馬 $ 白 山 己
201610: 高 $ 上草 簡言 曷 # 渴右
201613: 鬼 $ 石 得右
201614: 乾 $ 簡愛
201632: 偯 $ 左示 夭
201634: 兜 $ 簡奧
3. 參考 cjkxref.txt, 列出 jisx0208 不存在於 BIG5 & gb2312 的字元.
處理過的加上 "$" 符號.
301601: 陛 $ 日亞
301602: 陝 $ 口 日亞
301612: 鬲
301613: 鬼 $ 日亞 心
301619: 偃 魚 簡參
301621: 做 厚上 土
301630: 偏 $ 魚 占
301647: 區 $ 國外 井
4. 用一個程式把上述的三個檔案合併成 uniok.txt
檢查、並補滿三碼的再把冒號放置於 unicode 編號之後.
並且加上 (b5) (gb) (jp) 等識別的記號.
U+4FE0 : 左人 夾 # 俠 (b5)
U+4FE1 : 左人 言 # 信 (b5)
U+4FE3 $ 左人 口 天 # 棤 (gb)
U+4FE4 $ 左人 弟 # 冔 (jp)
U+4FE5: 左人 車 (十) # U+4F21 # 冓 (jp)
U+4FE6 $ 左人 簡壽 # 棱 (gb)
5. 分析好的字, 例如 "用", 查詢結果如下:
grep 用 uniok.txt
U+4F63: 左人 用 (十) # 佣 (b5)
U+62E5: 左手 用 (十) # 茧 (gb)
U+7528: 用 (十) (豎) # page 111 # 用 (b5)
U+752C: 甬 (用) (十) # 甬 (b5)
U+752D: 不 用 (十) # 甭 (b5)
U+752E: 勿 用 (十) # 甮 (b5)
U+752F: 家上 心 用 # 甯 (b5)
U+75C8: 病左上 用 (十) # 虒 (gb)
U+98DB : 飛 (豎) # 豎 是最後一筆, 常用國字標準字體筆順手冊 page 201. # 飛 (b5)
U+9F21: 日鼠 (同用) (十) # (?) # 鵻 (jp)
6. 日後運算的方法:
輸入法所用的按鍵可以轉換成數字, 可依此排序, 計算之後列出序號.
[2004-10-26]
(0-25) * 26^2 + (0-25) * 26 + (0-25)
排序 數字 序號
A A A <= 0
A A B <= 1
變數 3000 個 (假設分析之後, 有三千個字根)
寫一個簡單的 script, 可以把我分析的表格檔轉成算式:
約 16289 條 (13060 + 2381 + 848)
X 開頭的變數的範圍是 0, 1, .., 25
X 開頭的變數有 3000 個 (假設)
U 開頭的變數的範圍是 0, 1, .., 16288, 內容就是上述的序號, 不重複.
U 開頭的變數有 16289 個.
U+9F98: 龍 龍 龍 # 龘 (b5)
"龍" 的 big5 內碼是 C073
XC073 * 26 * 26 + XC073 * 26 + XC073 - U09F98 = 0;
所有算式列出之後, 放進運算力強大的電腦系統中,
就可以把這個輸入法正式演算出來.
(*) 參考資料:
1. unicode.
http://www.unicode.org/cgi-bin/GetUnihanData.pl?codepoint=4e00
2. cjkxref.
http://examples.oreilly.com/cjkvinfo/unicode/cjkxref.txt
3. cns11643.
http://www.cns11643.gov.tw/web/show_seek6.jsp?v1=3&v2=473c
http://www.cns11643.gov.tw/web/show_seek6.jsp?v1=3&v3=4533&v4=4550&qry=2
4. 教育部 常用國字標準字體筆順手冊
5.
http://www.cccii.org.tw
(*) 非參考資料:
1. 妙通輸入法 是一個研究台語文的人所做的輸入法.
http://www.harvo.idv.tw
是以筆畫的方式輸入, 選字率 > 40%, 最多五碼.
2. 中易系統 Chinese Binary System
http://www.cbs.com.tw/
戚桐欣老先生費心做了這麼多資料, 並且四處參加會議,
令人佩服.
(*) 手上的書籍部分列表:
001 倚天中文系統 技術手冊
002 倉頡輸入 -- 王氏口訣法
003 中國海字集
004 科學注音輸入法
005 一.二.三 中文輸入法
006 何氏中文輸入法
007 輕鬆八用輸入法
008 圖解倉頡輸入全集
009 大易輸入法
010 象形王碼輸入法 第二代
011 輸入法字典 完整標準版
012 芳志視窗中文輸入法
013 嘸蝦米輸入法 18 版
014 盛興中文輸入法
015 嘸蝦米輸入法 23 版
016 大家學行列(行列 30 輸入法)
017 Linux 中文應用手冊
018 中文編碼學
019 洞悉 Unix 中文系統篇
020 電腦中英文字形經典
021 嘸蝦米輸入法 13 版
022 大易輸入法
023 妙通輸入法 第二代
024 輕鬆 95 輸入法
025 兩岸中文內碼輸入全集
026 簡繁體電腦對照字典
027 電腦簡繁體速查手冊
028 便捷中文編碼法及輸入法
(*) 目前狀態:
1. 初步分析結果:
big5 12877 字
gb2312 2216 字
jis0208 581 字.
2. 檢查並補滿三碼:
unicode 708 字
ici countuni2.ici uniok.txt
b5 13060 b5ok 12877
gb 2381 gbok 2216
jp 848 jpok 581
uniok 708
3. 待處理部分:
big5hkscs, jisx0212, jisx0213, gbk, cns11643, unicode 4.1,
cccii
(*) 結論:
如果讀者用心閱讀, 應該會了解, 這個輸入法必須 100% 完成
才可以造出實際的編碼.
因此, 雖然已經處理過 15000 字, 完成日仍然遙遙無期.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.113.22.98
推 donkeykong:抱歉小弟沒有完全的看完這篇文章,...140.117.197.150 02/24
→ donkeykong:但是對於肯花心思研究 由衷致上敬意140.117.197.150 02/24
推 springgod:看不太懂 但感覺上用多字根把全字拆完還要塞在140.112.251.218 02/25
→ springgod:3碼內 會讓大腦多花不少時間來"處理"一個字140.112.251.218 02/25
→ springgod:因此雖然字碼變少了 但每個鍵input的時間變長140.112.251.218 02/25
→ springgod:了 另外 我是用行列的 基本上沒在選字的耶^^"140.112.251.218 02/25
→ springgod:全看使用者怎麼用吧 每字的鍵數約2~3140.112.251.218 02/25
推 qllvv:我比較好奇哪有鍵盤放得下"左人","上家"那麼多鍵@@ 218.34.154.156 02/25
推 lLaK:出發點不錯,不過似乎很難學習耶220.143.225.109 02/27
推 pobov:行列選字? 還是什麼東西 可以吃的嗎?140.119.192.246 03/06