Matrix 首页推荐
Matrix 是少数派的写作社区,我们主张分享真实的产品体验,有实用价值的经验与思考。我们会不定期挑选 Matrix 最优质的文章,展示来自用户的最真实的体验和观点。
文章代表作者个人观点,少数派仅对标题和排版略作修改。
又名:为了不患腱鞘炎,我学了一个追求极致码长的小众输入法
如果您从未接触过字形输入法,可先阅读北鸮的这两篇文章:尝试了七种形码输入法后,我想聊聊在 2022 年用五笔这件事、为了打字更爽,我学了一个追求极致性能的小众输入法。本人去年的拙作如何制作一款字形输入法里也作了简短介绍,朱宇浩所作琼林撷英亦可作为百科全书速查。
关于本人:聊天打字用星空键道,书面打字用日月,打单速度 80 字/分钟。之前浅学过小鹤音形、仓颉五代和虎码,因需求不同而放弃。在转日月之前已使用近三年徐码,因手感(Z 键频率)问题放弃。
不使用空格键的两种方式
以 86 五笔为例,单字全码码长要么是三要么是四,在开启最大码长顶屏,关闭唯一候选自动上屏时,仅三码字上屏需要空格。输入法为提高效率还使用简码,所有简码上屏都需要空格。在只打一二简的情况下,使用北语邢红兵教授的字频表1加权 86 五笔码表,65%的情况需要打空格,即便只打一简也有高达 47%的情况,无疑对腱鞘炎患者非常不友好。

那么,有没有不需要空格的输入法?2005 年,戴石麟带着论文《汉字编码输入法研究》横空出世,提出首款可脱离空格打字2的顶功输入法。
以声笔简码为例,顶功输入法通常将常用于汉字编码的 26 个字母分为两个集合——B:{aeiou} 与 A:{bpmfdtnlgkhjqxzcsrywv}——即元音字母和辅音字母,并规定汉字编码只能以 A 中字母开头,可表示为 A、AB、ABB、ABBB。当用户输入 AA、ABA 等不存在的编码时,软件就知道上一字已经结束,自动将其顶上屏。由于在输入过程中消除了空格,汉字的实际编码等同于原始编码,这便是顶功码的第一种定义。

为什么是 21:5?汉字可表示为横竖撇点折五种笔画,而字母中元音字母也有五个,所以 21:5 是易学性最好的分类法。当然 20:6、16:12 的分割的顶功码也是存在的,详见顶功集萃。
如果我们将空格(后文表示为 _)视为 B 集合的唯一元素,即 B:{_}, A:{a-y},则五笔的实际编码可表示为 AB、AAB、AAAB、AAAA。仔细观察会发现任意编码都不是其他编码的前缀,像这样的编码我们称为前缀码。而观察前文声笔码的表示方式,可发现顶功码并不满足前缀码的条件,故非前缀码是顶功码的第二种定义。
对于五笔这类 B 集合只含空格的前缀码,又可称作空格前缀码。由于空格前缀码的简码必带空格,在优化简码效率的同时,空格的频率也会越来越高:以卿云为例,光只打一简就高达 67%,算上避重三简甚至能到达 90%!

有没有通用的方法降低空格前缀码的空格频率?
一是整句输入,又叫智能联想。原理很简单,只要词库够大,语言模型就能自动分割人类无法分割的编码,相当于外置大脑,目前市面上的主流输入法软件(某狗、某度)都自带此方法。但对于 RIME 这类离线输入法,即便是打单用户也要部署一个超大词库。

二是顶功化改造。我们观察到二简的占空格频率的 20 %,所以只要将其改造成二码顶就可以大幅提高效率。此时编码方式为 AA、AAAB、AAAAB,由于不存在 AAAAA 编码,用户每打出第五个 A,前两个 A 的简码字就会自动上屏,相当于用四根字的码长来换取二简字码长。

2025 年,朱宇浩提出了一个新想法:如果前缀码的 B 集合不使用空格,改用与声笔相同的 aeiou,同样能满足顶功码的第一种定义,即无空前缀码与顶功码在数学上等价,可视为广义顶功码。
优势与劣势
顶功分析
由于不用打空格,顶功码的简码效率(单字简码缩减的实际码长)比前缀码要高一些:五笔实际码长恒定为四(四码定长,以下简称四定),可得 25 个二码上屏一简字所减短的实际码长为(4-2)x0.2590 = 0.518;声笔简码同为四码定长,21 个一码上屏一简字效率为 (4-1)x0.2381 = 0.7143。在缺少 4 个一简的情况下,声笔的一简效率比五笔多 0.1963,这便是顶功的优势。当然这是假定简码只按字频无理设置的情况,五笔的实际一简效率为 0.41,声笔实际一简效率为 0.61。

注意:简码效率(越大越好)只能在定长输入法之间比较,最大码长不同的输入法之间须直接比较动态码长(越小越好)。
争议:空格键的输入方式与其他按键不同——一是拇指不用移动,二是有拇指作为最有力的手指,敲击速度也更快。空格键增加的实际码长与其他编码增加的码长有极大的手感差异,故而顶功缩减码长带来的好处并没有数据那么大。
如此大的优势,自然不会是天上掉下的馅饼。由于声笔简码的后三位编码只能在 B 集合中取,声笔简码的可用全码空间(可能的编码组合)为 21x5^3=2625,就算加上简码的 21+21x5+21x5^2 也只有 3276,连通用规范汉字表的 8105 个汉字都无法完全容纳,重码重上天!与之相对,只要 ,五笔的全码空间为 25^3+25^4=406250。如此悬殊的数据差距,注定声笔简码实际上无法打单,只能与简拼结合作为声笔系列码的入门方案。
注意到,B 集合是声笔简码输入法空间如此之小的罪魁祸首,所以要增加全码空间有几种思路——扩大全集 U(即 AUB)、扩大 B 集合、减少编码中 B 的数量、增加最大码长。
扩大全集 U:让更多的键位参与编码,比如 30 键输入法。
增加最大码长:每加一位就乘五,力大砖飞。
扩大 B 集合:编码空间为 (26-B)x B^3,运用高中数学知识可知编码空间在 0-19 之间单调递增。但此方法的问题是易学性要降低,而且五笔画把折拆成顺时针和逆时针变成六笔画就没得再加了。
改变编码方式:如果我们让编码第二位也能取 A,表示 AABB、ABBB 如何?25^2x5^2=15625,能容纳所有的通规字,这便是声笔飞单的编码方式。
声笔飞单的最短上屏码长为 2(即最后一个 A 在编码中的位置),称为二码顶;同理,声笔简码为一码顶。二码顶能自动上屏的无空最短编码是 AA/AB,实际二简效率为 0.992,而五笔的实际一二简效率为 0.776,但声笔使用特殊二简 AB 的代价是简全不一(简码不是全码的前缀)。如果能接受再打 20% 的空格一简,声笔飞单最终的一二简效率为 1.4 左右。

有二码顶自然就有三码顶、四码顶……但人的记忆力和简码设置均存在边际效应,一二简共 21x27=567 个简码其实就是初学者的极限了。所以我们可以给出采用声笔一二简的动态码长公式 L-max(L-N,L-2)x0.2048-max(L-N,L-3)x0.2720-0.2240x(L-2) 可用全码空间公式为 21^x5^{L-N},其中L=最大码长,N=最短上屏码长。计算得出下表:
| 最大码长 | 最短上屏码长 | 动态码长 | 全码空间 | 空格频率 |
|---|---|---|---|---|
| 4 | 2 | 2.5984 | 11025 | 0.2048 |
| 4 | 3 | 2.8704 | 46305 | 0.4768 |
| 5 | 1 | 3.5088 注:一码顶没有 AA 二简,如果算上 ABB 三简码长为 2.9 左右 | 13125 | 0 |
| 5 | 2 | 2.8976 | 55125 | 0.2048 |
| 5 | 3 | 3.1696 | 231525 | 0.4768 |
| 6 | 2 | 3.1968 | 275625 | 0.2048 |
| 6 | 3 | 3.4688 | 1157625 | 0.4768 |
不难发现,四定二码顶就已经满足常用字集的最短上屏码长,三码顶虽然提升四倍的编码空间,但码长由于 AA 二简要打空格反而下降,而这编码空间依旧无法满足全字集 101984 个汉字。
又因为四定空格前缀的动态码长在 3±0.1,六定三码顶负收益首先排除,剩下的六定二码顶 ABB 简相比五定三码顶有更高的简码效率,同时全码空间也更大,六定二码顶胜出。
结论:在 21:5 的分类下,顶功要么是满足常用字集的四定二码顶,要么是满足全字集的六定二码顶。
本人用的键道就是六定二码顶。
无空前缀分析
假定存在一个四定无空前缀码,总编码空间为 AAAA、AAAB、AAB、AB、B=243101,虽然只有空格前缀码的一半空间,但对于目前汉字的总量已经够用,这就是宇浩灵明的编码方式。当然灵明由于取主副根,部分 AB 形式的编码为全码,实际为四不定(最大码长为 4 的不定长编码)。
虽然同最大码长的无空前缀比顶功重码更低,但由于无空前缀码在不打空格的情况下无法使用 AA 简,必须记忆 AAB 形式的三简,对人的记忆负担较大。
可算出灵明的简码效率为 0.320179+0.232354+0.133855=0.6863。但由于是四不定,灵明的全码动态码长约为 3.6,最后得出的实际动态码长约为 3。

由于前缀码的简码恒定为 B、AB、AAB,当最大码长 L 增大时,需记忆的简码更多,但动态码长不会再提升,此处就不再列表作比。直接说结论:不定无空前缀码最大码长要么是四要么是五,优化方向为减小需记忆的简码量,优化方法为设置主副根。
自无空前缀的概念问世,目前已有日月(大乱小音托)、灵明(大乱小音托主副根)、松烟(纯乱)、清韵(全音托主副根)四种方案,各位读者如果对常见输入法的空格占比有所顾虑,不妨一试。
不过顶功类方案还有一个问题:目前仅 RIME 能较好支持,如果日常打字环境不能装就完蛋了。
闲话:输入法宣传之道
比如虎测评网的表里有个大跨排,因为虎码算法专门优化过;
比如宇浩测评网表里有繁体数据,因为只有他在做简繁通打;
比如声笔宣传实际码长低得离谱,但是出满二三简且不出全;
比如三郑宣传动态选重率 0.15%,但其实智能选重谁都能开。
虽然之前曾说一切需求𣅜不重要,但搞清数据的条件还是很重要的。
另:之前看到有人说简繁通打要多记一倍字根,令人莞尔。实际上,以宇浩拆分为例,一共只有 22 个繁体专用字根(鳥烏魚馬風來車長門鬥齒飛見貝鹵僉韋咼黽)。
> 关注 少数派小红书,感受精彩数字生活 🍃
> 实用、好用的 正版软件,少数派为你呈现 🚀

