看板 IME 關於我們 聯絡資訊
重新作一次完整的介紹. (*) 源起: 我以前用行列三十的 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