原本只是想分析小鹤音形单字全码码表的重码情况的,因为我搜遍了整个互联网没有发现有人谈论这些内容. 结果我越写越多,最后看来本文的部分内容也可以作为小鹤音形的入门指南.
定义 ¶
- 【双拼】:一种中文输入方案,相对于全拼,它使用两个字母(一个声母、一个韵母)完成拼写.
- 【小鹤双拼】:一种双拼方案. 不同的双拼方案的差别主要是韵母和双声母的分布不同.
- 【小鹤音形】:小鹤双拼 + 双形的输入方案,双形的作用主要是去重. 更多介绍与细节请看官网⧉.
- 【字】:中文最基本的元素,就是每个人理解的那个意思. 是要往屏幕上打的东西.
- 【词】:由两个或以上的【字】组成的,经常一起使用的整体.
- 【码】:为了往屏幕上打出某个【字】或某个【词】而按顺序敲击的键位,用 26 个英文字母表示.
- 【全码】:在【小鹤音形】中,4 个键位的【码】称为全码.
- 【简码】:在【小鹤音形】中,不到 4 个键位的【码】称为简码.
- 1 个键位的码叫【一简码】;
- 2 个键位的码叫【二简码】;
- 3 个键位的码叫【三简码】.
单字全码码表 ¶
字的全码数据 ¶
小鹤音形中字的全码分为前后两个部分:前一部分包含两个码,叫做音码,规则是小鹤双拼的规则;后一部分也包含两个码,叫做形码(双形),规则是把字拆开后按顺序取第一个形状和最后一个形状的码,具体请看官方的学习指引⧉、小鹤入门⧉.
小鹤音形使用的字库为《通用规范汉字表》国发〔2013〕23 号文⧉规定字表 8105 字,还另包含部分日常有机会用到而未收入通用规范汉字表的字(来源⧉),那些小鹤音形另包含进来的字我没有找到一个列表,因此只考虑《通用规范汉字表》中的 8105 字.
《通用规范汉字表》共收字 8105 个,分为三级:【一级字】表为常用字集,收字 3500 个,主要满足基础教育和文化普及的基本用字需要. 【二级字】表收字 3000 个,使用度仅次于一级字. 一、二级字表合计 6500 字,主要满足出版印刷、辞书编纂和信息处理等方面的一般用字需要. 【三级字】表收字 1605 个,是姓氏人名、地名、科学技术术语和中小学语文教材文言文用字中未进入一、二级字表的较通用的字,主要满足信息化时代与大众生活密切相关的专门领域的用字需要.
关于字符集的适用性问题,在官方的学习指引中有一篇说明⧉,里面统计了这些汉字在日常使用中的覆盖率,从中可以知道这 8105 个字在简体中文环境下已经足够使用了. 因此,小鹤音形这个输入方案的目标用户就是使用简体中文、不输入奇异字符的普通人. 这 8105 字可以在GitHub | rime-aca/character_set 仓库⧉中找到.
小鹤官网提供了一个查形工具⧉,利用这个工具和我们手中的 8105 字字表,我们就能得到一份 8105 字的全码原始数据⧉. 格式示例如下:
|
|
每一条数据从上到下共有 7 段,以“乐”字为例:
- 第 1 段
"乐:lepd ytpd lcpd-"
是这个字及其全码. 根据官方查形工具的网页版,“-
”号表示已有简码避让全码,“*
”号表示生僻字 & 音. 如果一个字是多音字(不仅仅是声调不同的多音字),那这个字就会有多于一个的全码; - 第 2 段
"丿 乛 丨 丿 丶"
是这个字的字形拆解; - 第 3 段
"丿"
是这个字字形拆开后的第一个形状; - 第 4 段
"丶"
是这个字字形拆开后的最后一个形状; - 第 5 段
"p"
是这个字字形拆开后第一个形状的形码(“撇p”); - 第 6 段
"d"
是这个字字形拆开后最后一个形状的形码(“点d”); - 第 7 段
"乐"
是这个字本身.
整理格式 ¶
为了方便后续的分析与使用,我们把格式稍稍整理一下,添加上“字的等级”这一信息,用上 json 的对象(即键值对,类似于 python 的字典). 使用这个脚本⧉完成.
得到的完美格式的 8105 字码表放在了这里⧉(gist 里也有一份同样的⧉). 格式示例如下:
|
|
分析其中的重码情况 ¶
有了完美格式的码表,我们就可以写程序进行分析了. 我只对我个人感兴趣的内容进行了分析,程序在这里⧉. 分析的思路和结果将在下文展开,如果各位读者有什么感兴趣的数据是我这里没有考虑到的,可以利用我在上一小节给出的完整码表自行写程序分析.
概览 ¶
分析的完整结果见这里⧉. 由于完整结果太长,我在这里只贴出统计出来的部分数据:
|
|
完整的结果我放在本文最后的“附录”中,并用小标题把它分了几个独立的部分,各位读者可以在阅读本文的同时利用文章中提供超链接跳过去查看,或者自行使用本文提供的目录做跳转.
本文分析出来的这些信息对于我这个初学者来说是非常重要的,我希望通过了解这种具体的信息来判断一个输入方案到底好不好、合理不合理、适合不适合我,而不是那种泛泛而谈的、经验性、感受性、“如何评价”类的信息. 不知道为什么我就是没有在网上看到我想找的这种,这明明是很简单、很基本的一个东西. 只好自己写了.
全码有多少个 ¶
拿到一份全码码表,第一个问题自然是这里面一共有多少个全码. 我们知道字一共有 8105 个,但是:
- 一方面,有的字是多音字,一个字对应多个四键全码(比如“乐”字有 “lè”、“yuè”、“lào” 三个读音,分别对应 “lepd”、“ytpd”、“lcpd” 三个四键全码),这种情况会让全码码数增加;
- 另一方面,有可能多个不同的汉字却有相同的四键全码(比如“历”、“励”、“厘”这三个字,双拼都是 “li”,拆字的第一个部分都是“厂”(i),拆字的最后一个部分分别是“力”和“里”(l),因此这三个字的四键全码都是 “liil”),这种情况会让全码码数减少.
那么一共的全码码数有多少呢?经过统计,它一共有 7963 个不同的全码,也就是说,在 26 × 26 × 26 × 26 = 456976 种四按键组合中,只有 7963 个四按键组合可以打出字来,其余的 449013 个四按键组合并不合法,合法率只有 1.74%.
作为对比,小鹤双拼的合法码数有 406 个,合法率有 406 / (26 × 26) = 60%.(感谢 @zzhirong 指正!)
406 个合法的小鹤双拼码:‘yi’, ’er’, ‘ui’, ‘dk’, ‘ih’, ‘qi’, ‘bu’, ‘ba’, ‘rf’, ‘ru’, ‘bi’, ‘ji’, ‘jq’, ‘dn’, ’le’, ‘dc’, ’li’, ’nd’, ‘yz’, ‘sj’, ‘gj’, ‘yu’, ‘kv’, ‘gs’, ’tu’, ‘cd’, ‘xx’, ‘cy’, ‘da’, ‘vh’, ‘wj’, ‘uh’, ‘xn’, ‘kz’, ‘uj’, ‘jb’, ‘qm’, ‘ir’, ‘ge’, ‘xi’, ‘me’, ‘uc’, ‘fj’, ‘gl’, ‘wh’, ‘mf’, ‘ya’, ‘vi’, ‘si’, ‘zi’, ‘ww’, ‘ye’, ’nv’, ‘fw’, ‘ia’, ‘ma’, ‘xl’, ‘fg’, ‘kd’, ‘jk’, ’tm’, ‘fu’, ‘yr’, ‘wu’, ‘yy’, ‘vr’, ‘gd’, ‘va’, ‘mu’, ’tk’, ‘qr’, ’td’, ‘qu’, ‘dd’, ‘pi’, ‘ie’, ‘ju’, ’ty’, ‘hu’, ‘qp’, ‘wa’, ‘yt’, ‘ri’, ‘vs’, ‘bw’, ‘gh’, ’nw’, ‘uv’, ‘jm’, ’nq’, ‘uz’, ‘mc’, ‘ug’, ‘yc’, ‘pm’, ‘pu’, ‘hx’, ‘iz’, ‘rg’, ‘vc’, ‘jp’, ‘cs’, ’ly’, ‘xs’, ‘ff’, ‘fa’, ‘ch’, ‘dj’, ‘gz’, ’lq’, ‘wf’, ‘kh’, ‘fh’, ‘ho’, ‘dz’, ‘rs’, ‘xb’, ‘ii’, ‘yb’, ‘ks’, ‘dv’, ‘bj’, ‘dg’, ‘ul’, ‘uu’, ‘hr’, ‘kj’, ‘mo’, ‘qn’, ‘vg’, ‘hv’, ‘ai’, ‘gu’, ‘bf’, ‘ke’, ‘bk’, ‘zo’, ‘hh’, ’ls’, ‘pk’, ‘mp’, ‘ga’, ‘ds’, ‘ka’, ‘vj’, ’lu’, ‘uk’, ‘gv’, ‘jx’, ‘uf’, ‘dm’, ‘hc’, ‘yh’, ‘jn’, ’lk’, ’tj’, ‘rj’, ‘mb’, ‘ao’, ‘qq’, ‘he’, ‘xm’, ‘bd’, ‘zd’, ’ta’, ‘gx’, ‘ys’, ‘ce’, ‘wd’, ‘iu’, ’nn’, ‘bc’, ‘vu’, ‘xr’, ’lj’, ’tz’, ‘hj’, ’nk’, ‘xt’, ’tc’, ‘xp’, ‘rh’, ‘xy’, ’ni’, ‘hs’, ’ln’, ’nu’, ‘bm’, ‘bh’, ‘xk’, ‘kc’, ’to’, ’lc’, ‘ko’, ‘sc’, ‘di’, ‘mh’, ‘xq’, ‘go’, ‘if’, ‘yj’, ‘xu’, ‘jl’, ‘kx’, ‘do’, ’lp’, ‘ig’, ‘md’, ‘ci’, ‘vf’, ‘dh’, ‘zc’, ‘is’, ’tr’, ’lv’, ’ts’, ‘sv’, ‘ze’, ‘rz’, ’nm’, ‘dq’, ‘ue’, ‘ph’, ‘hz’, ‘vz’, ‘ua’, ‘il’, ‘za’, ‘mk’, ‘se’, ‘vl’, ‘qk’, ‘ij’, ‘jt’, ‘hd’, ‘gr’, ‘mi’, ’th’, ‘vd’, ‘an’, ‘jy’, ’ee’, ‘ss’, ’ns’, ’na’, ‘sy’, ‘hk’, ‘rc’, ‘zz’, ‘ic’, ’ve’, ‘vx’, ‘ql’, ‘pc’, ‘kg’, ‘kk’, ‘qt’, ‘qb’, ‘su’, ‘du’, ‘gg’, ’ll’, ‘fz’, ’ld’, ’lm’, ‘ou’, ‘kl’, ‘dy’, ‘zu’, ’nj’, ‘ky’, ‘iv’, ‘bp’, ‘uy’, ‘gc’, ‘wo’, ’lr’, ‘mw’, ’ti’, ‘fo’, ’lb’, ‘mm’, ’tn’, ‘yk’, ‘ku’, ’lg’, ‘ry’, ‘pj’, ‘cj’, ‘vo’, ‘pw’, ‘qs’, ‘cg’, ‘aa’, ‘vv’, ‘mn’, ‘iy’, ‘bo’, ‘zs’, ‘bn’, ‘gk’, ‘pd’, ‘id’, ’la’, ‘po’, ‘ro’, ‘sh’, ‘rr’, ‘kf’, ‘ah’, ’ne’, ’tp’, ’lo’, ‘pa’, ‘dp’, ‘de’, ‘so’, ‘pb’, ‘pg’, ‘hy’, ’nt’, ’nc’, ‘jr’, ’lw’, ’lh’, ‘ux’, ‘mg’, ’lz’, ‘vk’, ‘ur’, ’no’, ‘mz’, ‘cc’, ‘hl’, ‘bg’, ‘zj’, ‘ha’, ‘yo’, ‘zf’, ‘dr’, ’lx’, ‘cu’, ‘hf’, ‘pf’, ‘uo’, ‘sa’, ‘qx’, ‘hg’, ’tv’, ‘gw’, ’np’, ‘co’, ’re’, ‘gf’, ‘ud’, ‘oo’, ’en’, ‘zw’, ‘zh’, ‘zr’, ’te’, ‘wg’, ‘cv’, ‘vy’, ’tg’, ‘pz’, ‘kr’, ‘bb’, ‘uw’, ’nl’, ’ng’, ’lt’, ‘pn’, ‘mj’, ’nb’, ‘cz’, ‘io’, ‘ik’, ‘sz’, ‘sf’, ‘gy’, ‘zv’, ‘hw’, ‘rv’, ‘zy’, ‘cr’, ‘js’, ‘qy’, ‘sr’, ’nr’, ‘sd’, ‘mq’, ‘pp’, ‘sg’, ’nf’, ‘zg’, ‘ca’, ’nh’, ‘cf’, ‘kw’, ’ei’, ‘og’, ‘dx’, ’nz’, ‘df’, ‘ix’
(顺带一提,汉语普通话中的音节数(不含声调)有 418 种,带声调的音节数有 1327 种. 来源:知乎.⧉)
重码的情况如何 ¶
汉字一共有 8105 个,全码的总数却只有 7963 个,自然是重码(第二种情况)比多音字(第一种情况)的影响更大一些. 于是接下来的问题肯定就是,小鹤音形的重码情况怎么样,比如我想打“的”这个字,其全码是“deb(白)u(勺)”,那么在我打出 “debu” 这个四键全码之后,还会不会有其他汉字出现在屏幕上让我候选呢?专业一点说就是:一个字的全码有多大可能性是重码?
- 【重码】:重复的码,指这个字的全码与另一个不同的字的全码重复了. 比如“历”、“励”、“厘”三个字的全码都是 “liil”,那么 “liil” 就是一个重码.
我们这里改写一下问题,把“码”(而不是“字”)拿出来作为主语(把 “字”的重码问题 变成 “码”的重字问题 ),毕竟虽然我们打字时想的是“字”,但我们往键盘上敲的是“码”啊!我们的问题就变成了:
- 多少个全码是无重字的全码?
- 多少全码是有重字的全码?有重字的全码有几个重字?(【重字】:不同的字)
- 一码两字的全码有几个,有哪些?
- 一码三字的全码有几个,有哪些?
- 一码四字的全码有几个,有哪些?
- 一码五字的全码有几个,有哪些?
- 一码六字的全码有几个,有哪些?
- 一码七字的全码有几个,有哪些?
- ……
我们通过跑程序很快就能得到答案:
- 7963 个全码中,有 7376 个是无重字的全码,占全体码数的 92.63%;
- 7963 个全码中,有 587 个是有重字的全码,占全体码数的 7.37%. 这些有重字的全码有 2 - 5 个重字,没有 6 个或以上重字的全码:
- 一码两字的全码有 529 个,占全体有重字全码的 90.12%,附录中有完整列出;
- 一码三字的全码有 50 个,占全体有重字全码的 8.52%,附录中有完整列出;
- 一码四字的全码有 6 个,占全体有重字全码的 1.02%,附录中有完整列出;
- 一码五字的全码有 2 个,占全体有重字全码的 0.34%,附录中有完整列出;
可以看出,这 7.37% 的有重字全码中,绝大多数只会出 2 个候选字,极少数的情况会出 5 个候选字,可以说小鹤音形方案的去重效果还是相当不错的.
重码与字的等级综合分析 ¶
我们想知道关于这些有重字的全码,其重字是否都是常用字. 例如,“levl” 是一个[有两个重字]的全码,它的两个不同的字是“了”和“簕”,但只有前者是一个常用的一级字,后者仅仅是一个不常用的三级字. 这对于小鹤音形输入方案来说无疑是最好的情况,因为这种情况越多,字的全码越能够把唯一一个常用的汉字给确定下来.
我们还是跑程序,然后得到如下数据:
- 7376 个无重字的全码中:
标记 | 解释 | 这种码的数量 |
---|---|---|
1 | 唯一的字是一级字的码 | 3266 |
2 | 唯一的字是二级字的码 | 2694 |
3 | 唯一的字是三级字的码 | 1416 |
- 529 个一码两字的全码中:
标记 | 解释 | 这种码的数量 |
---|---|---|
11 | 两个字都是一级字的码 | 98 |
12 | 两个字分别是一级字、二级字的码 | 157 |
13 | 两个字分别是一级字、三级字的码 | 74 |
22 | 两个字都是二级字的码 | 79 |
23 | 两个字分别是二级字、三级字的码 | 103 |
33 | 两个字都是三级字的码 | 18 |
- 50 个一码三字的全码中:
标记 | 解释 | 这种码的数量 |
---|---|---|
111 | 三个字都是一级字的码 | 5 |
112 | 三个字中有 2 个一级字、1 个二级字的码 | 7 |
113 | 三个字中有 2 个一级字、1 个三级字的码 | 4 |
122 | 三个字中有 1 个一级字、2 个二级字的码 | 13 |
123 | 三个字中有 1 个一级字、1 个二级字、1 个三级字的码 | 13 |
133 | 三个字中有 1 个一级字、2 个三级字的码 | 2 |
222 | 三个字都是二级字的码 | 1 |
223 | 三个字中有 2 个二级字、1 个三级字的码 | 4 |
233 | 三个字中有 1 个二级字、2 个三级字的码 | 1 |
- 6 个一码四字的全码中:
标记 | 解释 | 这种码的数量 |
---|---|---|
1112 | 四个字中有 3 个一级字、1 个二级字的码 | 1 |
1113 | 四个字中有 3 个一级字、1 个三级字的码 | 1 |
1123 | 四个字中有 2 个一级字、1 个二级字、1 个三级字的码 | 2 |
1223 | 四个字中有 1 个一级字、2 个二级字、1 个三级字的码 | 1 |
2233 | 四个字中有 2 个二级字、2 个三级字的码 | 1 |
- 2 个一码五字的全码中:
标记 | 解释 | 这种码的数量 |
---|---|---|
11122 | 五个字中有 3 个一级字、2 个二级字的码 | 1 |
12223 | 五个字中有 1 个一级字、3 个二级字、1 个三级字的码 | 1 |
我认为一级字有重复的情况是最需要特殊考虑做特殊设计的,因为一级字是最最常用的字. 我用黄色把这些部分标记出来了,好在只有 119 个,不算多. 这 119 个特殊的码我也完整地列在附录中了,在这里只象征性列出最后 10 个:
|
|
定义三种全码 ¶
无论是看上面的这 119 个需要特殊照顾的有重字全码,还是看附录:重码分布那里的 587 个有重字全码,都不难发现,每一个全码对应的所有字中,最多只有两个字的全码是单纯的四键全码而不带着 “-
” 或 “*
” 这两个特殊符号. 我们从现在开始,就使用“【纯粹全码】”来称呼这样的全码,同时使用“【减号全码】”来称呼后面跟着 “-
” 号的全码,使用“【星号全码】”来称呼后面跟着 “*
” 号的全码. 这样一来,我们就把一码多字情况下不同字的全码分了三个不同的种类. 举例来说,上面那 119 个需要特殊照顾的一码多字里面的倒数第二个,
辨(1)(bmlu-)辩(1)(bmlu-)辫(1)(bmlu)
全码是 “bmlu”,其对应“辨”、“辩”、“辫”三个字,前两字的全码都是减号全码,只有“辫”字的全码是纯粹全码. 类似的[只有的 1 个纯粹全码]的例子还有:
原(1)(yrix-)愿(1)(yrix)螈(2)(yrix*)
;驹(1)(jumk-)桔(1)(jumk)橘(1)(jumk-)枸(2)(jumk*)椐(2)(jumk*)
.
当然,我们也能看到有 2 个纯粹全码的情况:
扶(1)(fuff-)拂(1)(fuff)麸(2)(fuff)
;淤(1)(yudd)渝(1)(yudd)
;殃(1)(yhdy)洋(1)(yhdy-)漾(1)(yhdy-)泱(2)(yhdy)
.
还有就是 0 个纯粹全码的情况:
什(1)(ufru-)伸(1)(ufru-)
;尿(1)(svuu*)碎(1)(svuu-)
;摩(1)(mogu-)磨(1)(mogu-)
.
不同数目的纯粹全码在真正打字时会有怎么样不同的效果呢?经过实验,我们得到如下结果:
码的重字情况 | 纯粹全码个数 | 输入的四键全码 | 上屏内容 | 候选内容 |
---|---|---|---|---|
辨(1)(bmlu-)辩(1)(bmlu-)辫(1)(bmlu) | 1 | bmlu | 辫 | |
原(1)(yrix-)愿(1)(yrix)螈(2)(yrix*) | 1 | yrix | 愿 | |
驹(1)(jumk-)桔(1)(jumk)橘(1)(jumk-)枸(2)(jumk*)椐(2)(jumk*) | 1 | jumk | 桔 | |
扶(1)(fuff-)拂(1)(fuff)麸(2)(fuff) | 2 | fuff | 拂、麸 | |
淤(1)(yudd)渝(1)(yudd) | 2 | yudd | 渝、淤 | |
殃(1)(yhdy)洋(1)(yhdy-)漾(1)(yhdy-)泱(2)(yhdy) | 2 | yhdy | 泱、殃 | |
什(1)(ufru-)伸(1)(ufru-) | 0 | ufru | 深入 | |
尿(1)(svuu*)碎(1)(svuu-) | 0 | svuu | 岁数 | |
摩(1)(mogu-)磨(1)(mogu-) | 0 | mogu | 蘑菇 |
不难总结出:在一码多字的情况下,这些字的全码种类会影响打字效果. 如果其中只有一个纯粹全码,那么键入此全码会上屏这个字;如果其中有两个纯粹全码,那么键入此全码,这两个字会进入候选;而如果其中没有纯粹全码,那么键入此全码,好像会上屏一个词语?这是怎么回事呢?
深入理解小鹤音形整体方案 ¶
小鹤音形的“词”对象 ¶
在上一小节之前,我们讨论的所有对象都是“字”,但小鹤音形输入方案中还有另一个重要的对象,那就是词,这是小鹤音形输入方案与其他输入方案最大的一个不同,也是我在刚刚接触小鹤音形输入方案时没有立刻领悟到的地方.
像我之前使用的全拼输入方案、双拼输入方案,“字”和“词”之间的界限并没有这么清晰:字就是一个元素的词、词就是多个元素的字,打“字”就是打“字”,把“字”连在一起打就成了打“词”.
在小鹤音形这里,情况就不一样了:小鹤音形的“字”和“词”是两种不同的对象,这条清晰的界限来源于它的一个“原则”,那就是四码确定出一个对象,任何对象的“全码”都是四码——“字”的全码是四码,“词”也要四码全码——这样一来,就只能字是字、词是词了,词不再是“连字成词”(不然词就是八码、十二码了!). 下面这个表格是官方的小鹤入门⧉中的“构词规则”的摘录:
字数 规则 例词 全码 二字词 首字前两码 + 末字前两码 双拼 ulpb 三字词 前两字首码 + 末字前两码 输入法 urfa 四以上 前三字首码 + 末字首码 他乡遇故知 txyv
从这个规则中我们能够看出,“词”对象的全码已经和形码没有任何关系了,它只利用了小鹤双拼.
重新阐释重码问题 ¶
我们把小鹤音形的输入对象从单纯的 8105 字扩充到了字和词,于是所谓“重码”问题就不再是“一码多字”而是“一码多对象”了——我们暂且用“对象”这个概念来指代小鹤音形码表中的字和词. 随之改变的就是我们在上一节得到的结论,我们当时的措辞是:
在一码多字的情况下,这些字的全码种类会影响打字效果. 如果其中只有一个纯粹全码,那么键入此全码会上屏这个字;如果其中有两个纯粹全码,那么键入此全码,这两个字会进入候选;而如果其中没有纯粹全码,那么键入此全码,好像会上屏一个词语.
现在我们可以这样说:
- 在一码多对象的情况下,这些对象的全码种类会影响输入效果. 如果其中只有一个纯粹全码,那么键入此全码会上屏这个对象;如果其中有两个纯粹全码,那么键入此全码,这两个对象会进入候选.
- 小鹤音形只有以上这两种可能,不存在一码多对象的情况下没有纯粹全码、或多于等于三个纯粹全码的可能.
这在官方的常见问题解答⧉中可以得到验证:
小鹤音形的码表是按准无重码来设计的,基本都是首选上屏,少量次选上屏. 空格为首选上屏键,分号为次选上屏键.
通过理解小鹤音形的“词”对象我们搞明白了输入四键全码会上屏一个词语的问题,我们再看一下这个表格中与之相关的最后 3 行:
码的重字情况 | 纯粹全码个数 | 输入的四键全码 | 上屏内容 |
---|---|---|---|
什(1)(ufru-)伸(1)(ufru-) | 0 | ufru | 深入 |
尿(1)(svuu*)碎(1)(svuu-) | 0 | svuu | 岁数 |
摩(1)(mogu-)磨(1)(mogu-) | 0 | mogu | 蘑菇 |
以倒数第三行的 “ufru” 为例,这个四键全码不仅仅是“什”和“伸”这两个字的全码,同时还是“深入”这个词的全码,于是这就不仅仅是一码两字了,而是一码三对象. 这三个对象中,“什”和“伸”都是减号全码,只有“深入”是纯粹全码,因此在键入 “ufru” 这个四键全码之后,上屏的就是“深入”这一个对象了.
紧接着我们就产生了另外两个问题:
- 那减号全码和星号全码的字要怎么打出来呢?比如“什”和“伸”这两个字应该怎么打?
- 除了这三个对象,“ufru” 还对应其他对象吗?因为按照词的全码规则,“渗入”、“慎入”、“伸入”这三个词的全码也都是 “ufru” 呀?这些词怎么打出来呢?
引入简码 ¶
先来回答第 1 个问题,关于减号全码和星号全码的字该怎么输入的问题. 我们要先回忆一下减号全码和星号全码代表的含义是什么. 这其实我们在最开始“字的全码数据”一节刚刚拿到数据时已经提到过了:在官方的小鹤音形编码查询⧉网上有注明,
-
号表示已有简码避让全码,*
号表示生僻字 & 音,win 版启用 oqm 可输入.
“简码”的含义在文章的开头已经定义过了:
在【小鹤音形】中,不到 4 个键位的【码】称为简码. 1 个键位的码叫【一简码】,2 个键位的码叫【二简码】,3 个键位的码叫【三简码】.
而“已有简码避让全码”的意思还是很好理解的,或者来看官方的解释⧉:
什么叫 “出简让全” ?
有的字因为已经有简码而其四码全码和别的字词全码重码,这时则让出全码排前的位置,我称之为“出简让全”,并把这类字的全码单独放到一个码表分类项“出简让全”中,从而达到“让全”的两种效果:①不启用这个分类,候选不显示;②启用这个分类,候选居后. 输入法默认设置为①的效果,使用组合键 ctrl+alt+q 或直通车 oqm 切换,也可通过单引号引导临时启用.
举例来说,“伸”这个字在打 “ufru” 这个四键全码时打不出来,就是因为它已经让出了全码排前的位置——而之所以“伸”这个字让出了全码排前的位置,则是因为它
- 已有简码,
- 其四码全码和别的字词全码重码.
第二条我们已经明白,“伸”的全码 “ufru” 和“深入”的全码 “ufru” 重码了;条件 1 其实也呼之欲出了,我们只要尝试一下就能知道,打其前三个码 “ufr”,就能在候选字中看到它了!也就是说,“伸” 的简码是 “ufr”,是一个三简码. 把前面的表格扩充一下:
码的重字情况 | 纯粹全码 | 四键全码 | 上屏 | 候选 | 三简码 | 三简码候选 |
---|---|---|---|---|---|---|
辨(bmlu-)辩(bmlu-)辫(bmlu) | 1 | bmlu | 辫 | bml | 辩、辨 | |
原(yrix-)愿(yrix)螈(yrix*) | 1 | yrix | 愿 | yri | 原 | |
驹(jumk-)桔(jumk)橘(jumk-)枸(jumk*)椐(jumk*) | 1 | jumk | 桔 | jum | 橘、驹 | |
扶(fuff-)拂(fuff)麸(fuff) | 2 | fuff | 拂、麸 | fuf | 扶、敷fufw- | |
淤(yudd)渝(yudd) | 2 | yudd | 渝、淤 | yud | 鱼yuda-、浴yudk- | |
殃(yhdy)洋(yhdy-)漾(yhdy-)泱(yhdy) | 2 | yhdy | 泱、殃 | yhd | 洋、漾 | |
什(ufru-)伸(ufru-) | 0 | ufru | 深入 | ufr | 什、伸 | |
尿(svuu*)碎(svuu-) | 0 | svuu | 岁数 | svu | 碎 | |
摩(mogu-)磨(mogu-) | 0 | mogu | 蘑菇 | mog | 磨、摩 |
但要注意这里面的“敷”、“鱼”、“浴”三个字并不是本来四键全码的重码字,而是缩减到三码后的三码简码的重码字!
还剩下四个星号全码的字,我没有 Windows 系统所以没有尝试,估计按官方的提示启用 oqm 即可输入;我尝试了 Android 版本的小鹤音形,根据官方给出的说明文档⧉,可以使用末位 “/
” 号的办法输入星号全码的生僻字 & 音. 例如:输入 “yri/” 可得到“螈”字候选、输入 “jum/” 可得到“枸”、“椐”两字候选、输入 “suv/” 可得到“尿”字候选.
总结一下:小鹤音形输入方案把所有的字和词对象及其对应的全码做成码表,然后判断每个四键全码的对象重复情况. 如果一个四键全码没有重复对象,那就直接把它钦定为纯粹全码. 如果出现了一码多对象,那就把里面不常用的字作为生僻字,定为星号全码;把最常用的一个或两个定为纯粹全码;剩下的一个或两个设计简码方案,标记为“出简让全”的减号全码.
由于小鹤音形的设计要求准无重码,多数首选上屏,少量次选上屏,因此一码多对象的情况下,纯粹全码、星号全码和减号全码的个数最多都是 2. 经前文分析字的重码情况,我们已经知道 8105 字是很容易做到这一点的(一码多字的重字不超过 5 个);但现在码表里又有了“词”对象,这个任务变得艰巨起来.
由于我找不到小鹤音形的整份码表,也找不到小鹤音形官方支持的词库,没法进行定量的分析,但是随便想一想也就知道,小鹤音形的词库不敢弄太多,不然做不到准无重码. 就拿“深入”、“渗入”、“慎入”、“伸入”来说,如果这些词都在词库里,那么 “ufru” 这个四键全码就成了一码超多对象,再加上“什”和“伸”这两个字,两个纯粹全码和两个减号全码根本就排不下. 所以我们可以大胆断言:小鹤音形的词库里没有“渗入”、“慎入”、“伸入”这三个词,如果你想打这三个词,你不能想当然地去按规则去思考它们的全码,你只能一个字一个字地打它们. 这样,第 2 个问题就也回答完毕了.
一简字、二简字、二简词 ¶
上文中提到的同音词的现象在汉语中非常常见,比如:
- 现象、县乡、显像、险象、鲜香……
- 汉语、韩语、韩愈……
- 非常、肥肠……
- 常见、长剑……
这也是全拼和双拼输入法在选词上的一个痛点. 为了能够一定程度上解决这个问题,也为了能更加实用,小鹤音形还提出了一简字、二简字、二简词的概念,毕竟不足 4 码都叫简码,一简码和二简码还可以更加充分地利用才是. 具体有哪些一简字、二简字、二简词可以看小鹤的官方入门⧉,而且二简码的规则也不像是三简码这样子的了,我这里不再展开.
评论 ¶
对小鹤音形的看法 ¶
通过对小鹤音形的分析,我可以看到其为了“准无重码”所做出的努力,也能看到它为了方便用户所做的挣扎. 全拼输入法和双拼输入法设计简单,凭借强大的词库,用户可以连续输入而不用去管分词,甚至把一句话连在一起输入都没有问题,只是其重码问题有时很让人头疼. 为了解决重码问题,小鹤音形使用双拼 + 双形的方案,四码一字,对 8105 字的字库已经做了非常好的去重. 在我看来,到这里就足够了.
我觉得【词库】和【去重】是不太可能做到兼顾的,如果一个输入法是为了去重而生,就应该勇敢地使用单字输入模式,就像我们用纸笔写字一样,一个字一个字地去写,而不是写一个词语. 小鹤音形应该像五笔那样,鼓励用户一个字一个字地去输入,而且四码一字,这是非常有节奏且令人舒适愉快的方案了. 但小鹤音形设计了“词”这个对象,又为了不破坏四码一个对象的节奏,把词的全码也定为了四码,这样一来,出现了非常多的重码,只好把一些字的全码让出来,使得那些字只能通过简码输入,在我看来,这就是败笔所在. “词”这个对象的是一个完全鸡肋的设计.
这样设计出来的小鹤音形不再可以[仅仅通过简单的规律便可推知打出任何一个字的办法],不得不在练习过小鹤拆字的双形后再特别训练自己对简码的掌握和使用,小鹤拆字的双形在“有简打简”的思路下对常见字的输入变得没有那么重要,这个输入方案也就变得死板起来. 而且这种做法,也让用户不是很容易理解,比如我曾看到知乎的问题:为什么小鹤双拼没有那么好用?⧉
不要用记忆小鹤双拼键位类比这里的记忆简码来为其辩护,【记忆规律】和【记忆特殊情况】还是有着不小的差距——我不禁想起我高中的时候喜欢数学和物理的美妙,化学和生物则让人不安:数学和物理的美妙就在于一个规律可以统治所有的实例,化学和生物的规律却总有其管不到的“特殊情况”. 也许有的人会觉得有特殊情况的规律也是规律,但如果这样定义规律,我只能说没有特殊情况的规律是更加高级的规律.
更何况,这些特殊情况还都是人为规定的:哪些词在码表里、哪些词不在(比如“教师”在而“教室”不在),这是官方规定的;哪些字词有二简码、哪些没有,这也是官方规定的. 而且随着版本的更替,这些规定还会发生变化. 对我来讲,一个不能永恒长存的规律,是低级的规律,不是很有必要花时间去学习,以至于我用了好几年的小鹤双拼,也一直都对小鹤音形望而却步.
那么——如果我来设计我的输入方案,我会怎么搞呢?
改进的思路 ¶
小鹤音形的双拼 + 双形是很好的思路,而且去重效果不错,我要拿过来. 在此基础上,我首先去掉“词”对象,我的输入法不能打词,只能打字.
分析其重码情况,只有 587 个码会出现一码多字,情况比较乐观,大可以确定下【四键上屏】的原则,这样有 7376 个码就设计完了. 针对另外 587 个一码多字的码,为了能够四键上屏,可以尝试输入前三键后弹出候选框,第四键完成选择上屏,只需分析一下这 587 个全码的前三键重复情况.
跑了程序后,我发现还行,这 587 个四键全码取前三键后的重复数只有 51 组,完整的结果见附录. 而且通过浏览这 51 组三键重码,会发现每一组的重字情况大多数都是 4 个重字,最多只有 8 个重字,除这 51 组以外的 587 - 51 = 536 组都可以在键入三键后唯一确定第四键,且其重字情况不超过 5 个重字.
因此这样设计完全可行,候选页最多 1 页,候选字最多 8 个,而且我们还可以考虑把这些有重字的四键全码的本来的第四键让给最常用的汉字,其他的则是第四键选择上屏. 第四键的选择也可以不用数字键,而是使用字母键,比如键盘的第二行,asdfghjkl,共有 9 个键,无论如何也能排得开候选字.
这就是我设计的改进方案,只等我把 Rime 的方案设计学成,看看能不能搞一个出来.
评论区有朋友设计了一份单字输入的小鹤音形输入法,见这个仓库:https://github.com/OscarXWei/hesingle⧉. 放在这里补充一下. 感谢 @OscarXWei.
补充于 2022 年 4 月 19 日.
论输入法的开放性 ¶
不知道为什么,我总觉得小鹤音形输入方案有点“藏着掖着”. 第一,该方案好像没有申请专利;第二,该方案不提供码表,对 Rime 的支持仅仅是提供编译好的 .bin 文件,更多可以参见论坛求助:能传单字码表吗?⧉、GitHub 上关于码表的讨论⧉、GitHub 上关于码表的另一个讨论⧉;第三,官方的小鹤音形编码查询⧉做了一些反爬的设计,比如 sign
字段.
更正:小鹤音形的码表是有的,在官方网盘⧉的“3.2.挂接——辅助码” - “for安卓百度个性短语.ini”就是. 我打开看了,共有 58457 条!有了这个文件,能分析的就更多了!我在此撤回上一段中对小鹤音形输入法“藏着掖着”的评论,对不起啦!感谢评论区 @zzhirong 的补充!
本段添加于 2022 年 4 月 19 日.
出于对自由软件的支持和对自由精神的推崇,我还是把我手里的单字全码码表分享出来. 虽然只有字没有词,但或许对大家还是会有点帮助,比如刚刚学习拆字还没有练习简码的时候,导入一份单字的码表,这应该会方便很多.
附录(分析结果) ¶
重码分布 ¶
一码两字(529) ¶
有 529 个四键全码能对应出两个候选的汉字,本段结果较长,各位读者可以使用本文的目录进行快速跳转.
|
|
一码三字(50) ¶
有 50 个四键全码能对应出三个候选的汉字,各位读者可以使用本文的目录进行快速跳转.
|
|
一码四字(6) ¶
有 6 个四键全码能对应出四个候选的汉字,各位读者可以使用本文的目录进行快速跳转.
|
|
一码五字(2) ¶
有 2 个四键全码能对应出五个候选的汉字,各位读者可以使用本文的目录进行快速跳转.
|
|
119 个一级字重字的码 ¶
|
|
数据总结 ¶
本段内容已经在正文中贴出并进行了分析.
|
|
带 - 和 * 号却无重字的码 ¶
本段所列出的码就是在上面一小节的数据中最后四行所展示的东西,共有 1260 个,结果较长,各位读者可以使用本文的目录进行快速跳转.
|
|
有重码的那 587 个取前三键后的重码分布 ¶
后面的括号里的数字表示[以这三键为前三键的、且有一码多字现象的]全码,其重字的个数. 比如,“xip(322)” 含义解读如下:
- 以 “xip” 为前三键,且属于那 587 个一码多字里的四键全码有 “xipd”、“xipk” 和 “xipx”;
- 四键全码 “xipd” 的重字情况为:夕(1)(xipd-)奚(2)(xipd-)禊(2)(xipd*),有 3 个重字;
- 四键全码 “xipk” 的重字情况为:禧(2)(xipk)谿(3)(xipk*),有 2 个重字;
- 四键全码 “xipx” 的重字情况为:系(1)(xipx-)悉(1)(xipx),有 2 个重字.
|
|