Matrix 首页推荐 

Matrix 是少数派的写作社区,我们主张分享真实的产品体验,有实用价值的经验与思考。我们会不定期挑选 Matrix 最优质的文章,展示来自用户的最真实的体验和观点。 

文章代表作者个人观点,少数派仅对标题和排版略作修改。


又名:为了不患腱鞘炎,我学了一个追求极致码长的小众输入法

如果您从未接触过字形输入法,可先阅读北鸮的这两篇文章:尝试了七种形码输入法后,我想聊聊在 2022 年用五笔这件事为了打字更爽,我学了一个追求极致性能的小众输入法。本人去年的拙作如何制作一款字形输入法里也作了简短介绍,朱宇浩所作琼林撷英亦可作为百科全书速查。

关于本人:聊天打字用星空键道,书面打字用日月,打单速度 80 字/分钟。之前浅学过小鹤音形仓颉五代虎码,因需求不同而放弃。在转日月之前已使用近三年徐码,因手感(Z 键频率)问题放弃。

不使用空格键的两种方式

以 86 五笔为例,单字全码码长要么是三要么是四,在开启最大码长顶屏,关闭唯一候选自动上屏时,仅三码字上屏需要空格。输入法为提高效率还使用简码,所有简码上屏都需要空格。在只打一二简的情况下,使用北语邢红兵教授的字频表1加权 86 五笔码表,65%的情况需要打空格,即便只打一简也有高达 47%的情况,无疑对腱鞘炎患者非常不友好。

86 五笔平均四次击键中有一次空格

那么,有没有不需要空格的输入法?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=最短上屏码长。计算得出下表:

最大码长最短上屏码长动态码长全码空间空格频率
422.5984110250.2048
432.8704463050.4768
513.5088

注:一码顶没有 AA 二简,如果算上 ABB 三简码长为 2.9 左右
 
131250
522.8976551250.2048
533.16962315250.4768
623.19682756250.2048
633.468811576250.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 个繁体专用字根(鳥烏魚馬風來車長門鬥齒飛見貝鹵僉韋咼黽)。

> 关注 少数派小红书,感受精彩数字生活 🍃

> 实用、好用的 正版软件,少数派为你呈现 🚀

12
21