作者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
1F:推 donkeykong:抱歉小弟没有完全的看完这篇文章,...140.117.197.150 02/24
2F:→ donkeykong:但是对於肯花心思研究 由衷致上敬意140.117.197.150 02/24
3F:推 springgod:看不太懂 但感觉上用多字根把全字拆完还要塞在140.112.251.218 02/25
4F:→ springgod:3码内 会让大脑多花不少时间来"处理"一个字140.112.251.218 02/25
5F:→ springgod:因此虽然字码变少了 但每个键input的时间变长140.112.251.218 02/25
6F:→ springgod:了 另外 我是用行列的 基本上没在选字的耶^^"140.112.251.218 02/25
7F:→ springgod:全看使用者怎麽用吧 每字的键数约2~3140.112.251.218 02/25
8F:推 qllvv:我比较好奇哪有键盘放得下"左人","上家"那麽多键@@ 218.34.154.156 02/25
9F:推 lLaK:出发点不错,不过似乎很难学习耶220.143.225.109 02/27
10F:推 pobov:行列选字? 还是什麽东西 可以吃的吗?140.119.192.246 03/06