Skip to content

顶功编码 ​

上一节中您通过学习冰雪四拼的拼写规则来缩短了带调拼音的拼写长度。不过,这样每个字仍然需要三四键,而且输入结束后需要空格上屏。更重要的是,整句拼音输入的形式不利于精准把控输入的内容,因为在整句中间出现音字转换错误的时候,通常很难修改;另一方面,输入平台一般只会机械地记录用户输入的每一句话,而用户不太可能再次输入完全相同的一句话,因此输入平台并没有很高效地学习用户的输入习惯。

综合考虑以上几点,会发现「每次输入需要空格上屏」这个特性实际上让整句的问题变得更严重了,因为用户为了尽可能减少空格会倾向于输入更长的一句话,但这不利于精准性和智能学习。有没有办法既能按比较短的单位来输入,又不需要空格上屏呢?有的!这就是顶功的编码方式。

对于冰雪四拼来说,这意味着一个词的编码不再是每个音节的编码连起来打,而是应用了一套新的构词规则。初学者对于这套规则可能会感觉到颠三倒四,但是熟悉之后就会感觉到无比自然。

音节码固态词典 ​

构词规则 ​

本方案使用统一的规则来编码所有不同长度的词:

先打各个音节的声母编码;如果首选未命中,追加末音节的编码直至三码;如果首选仍未命中,追加首音节的编码直至三码。

也就是说,虽然冰雪四拼每个音节的拼写可能是三或四码,但是构词的时候词的首音节和末音节最多用前三码,而其他音节最多用第一码。各个音节的声母是首先必须要打的,后面追加的编码称为「补码」,可能有 0 ~ 4 个。到底需要打多少个补码,取决于词的频率,常用的词打得少,不常用的词就打得多。以下针对不同长度的词分别举几个例子:

  1. 单音节词:「有」的编码为 f,「又」的编码为 fo,「由」的编码为 fou;
  2. 双音节词:「你好」的编码为 nh,「希望」的编码为 xsi,「手机」的编码为 vjii,「冰雪」的编码为 bxoui,「元气」的编码为 kqiaoo;
  3. 三音节词:「为什么」的编码为 svm,「变压器」的编码为 bfqi,「最低点」的编码为 zdduo;
  4. 四音节词:「感同身受」的编码为 gtvv,「将计就计」的编码为 jjjji,「附庸风雅」的编码为 ffffuu;
  5. 以此类推,n 音节词的编码可能为 n 码到 n+4 码不等。

对于大于等于五个音节的词语,进一步规定第五个声母以及之后的所有声母需要用大写字母来输入。例如「科学发展观」的编码为 kxfwG,「哀莫大于心死」的编码为 rmdkXS,「中华人民共和国」的编码为 whrmGHG。另外,由于动态调频的存在,实际输入的编码可能与上述介绍有细微的差异。

为什么要这样设置构词规则?答案是——为了顶功!

观察上面的规则,容易发现规律如下:每个词的编码都是先有几个 bpmfdtnlgkhjqxzcsrwyv 这样的辅音字母,然后可能有几个 aeiou 这样的元音字母(当然也可能没有元音字母)。这意味着,如果用户输入完元音字母之后再输入辅音字母,就说明一定已经开始输入下一个词了,此时输入平台做出判断将前一个词顶上屏幕。在分词输入的前提下,这无疑节省了大量的空格键。

注意,对于「有 f」、「你好 nh」、「为什么 svm」这样的只包含辅音字母的编码来说,因为不知道后面还有没有更多的辅音字母,所以仍然需要使用空格上屏。但是,对于四音节词以及更长的词来说,后面的辅音字母是用大写输入,因此即使是「感同身受 gtvv」这样的也可以在输入下一个词的首码的时候自动被顶上屏。

上面提到,在输入完声母之后,后面的补码可能有 0 ~ 4 个。在输入的过程中,建议的打法是:观察候选中的第一个词,然后不断追加补码使得想要的词出现在首选;如果输完四个之后仍然没有出现在首选,则继续用数字键和翻页键选择候选(这种情况极少)。

首选后置 ​

在逐码输入的过程中,如果一个字词已经在首选出现过,那么在后续输入中它将不再位于首选,这可以充分利用编码空间,并且降低重码。例如,「冰雪」这个词打到这一码时成为首选:

bi xou
  1. _.冰雪
  2. 2.必修
  3. 3.病休
  4. 8.碧雪
  5. 9.比
  6. 0.并

那么它下一码时就不会是首选:

bie xou
  1. _.病休
  2. 2.冰雪
  3. 3.并
  4. 8.病
  5. 9.冰
  6. 0.饼

音节码用户词典 ​

动态调频与动态码长 ​

音节码用户词典存储在 snow_pinyin.userdb 文件夹中、并同步到 snow_pinyin.userdb.txt 中;用户可以利用 Rime 的同步机制来在多个设备之间同步方案码用户词典。

本方案采用动态调频策略,用户打过的词会出现在候选中更靠前的位置。由于可以通过追加编码来进一步区分词语,动态调频使得一个词的码长在输入中会发生动态变化,这个特性称为动态码长。例如,用户第一次想打「史诗」时,输入较多码时它才出现在首选。

v vi
  1. _.事实
  2. 2.试试
  3. 3.实施
  4. 8.设施
  5. 9.上市
  6. 0.说是
vi vii
  1. _.史诗
  2. 2.实施
  3. 3.石狮
  4. 8.刷刷
  5. 9.帅帅
  6. 0.耍帅

但输入过一次之后,下一次只需要较少码就能输入该词:

v vi
  1. _.史诗
  2. 2.试试
  3. 3.事实
  4. 8.实施
  5. 9.设施
  6. 0.上市

自动造词 ​

选择造词 ​

选择造词与一般的拼音输入法完全相同,用户应该会感到很熟悉。输入词的编码时,候选中会首先显示与输入编码音节数量相等的候选词,然后排在后面的是较短的候选词。此时可以直接通过数字键来选择短词,从而把长词拆解成短词并依次确认,最终上屏;上屏后,用户词典中就会出现这些短词连接起来所对应的长词。例如,下面两张图展示了造词「冰四」的过程:当输入到 bsiaie 六码时,发现候选中只有一个二字词且不包含「冰四」,说明「冰四」不存在于词库中,此时直接选择「冰」然后再选择「四」即完成了造词。

bie sia
  1. _.鼻饲
  2. 2.并
  3. 3.病
  4. 8.冰
  5. 9.饼
  6. 0.鼻
冰sia
  1. _.四📌
  2. 2.4📌
  3. 3.似
  4. 8.寺
  5. 9.袜
  6. 0.巳

定位造词 ​

在使用选择造词时,如果想要的短词不在第一页,那翻页寻找就比较麻烦了。因此,本方案还提供了另一种方式来快速完成长词的拆解,那就是定位造词。定位的快捷键是:1, 4, 5, 6 和 7。其中,1, 4, 5, 6 会分别把光标移到第一个、第二个、第三个或者第四个音节处,而 7 则会返回最后一个音节的末尾。完成定位之后,可以追加补码来筛选字词,然后确认这一片段对应的字词;对各个片段依次定位并确认之后,即完成造词。下面我们举几个例子:

  • 想打「谱方法」这个三字词,输入到 pffau 时可以确定词库里没有这个词,此时直接按 1 定位到第一个音节后面,输入 uu 补全「谱」的音节码,确认「谱」之后再确认「方法」,即完成造词:

    p f fau
    1. _.评分法
    2. 2.培养法
    3. 3.配方法
    4. 8.配分法
    5. 9.拼音法
    6. 0.朋友
    puuffau
    1. _.票📌
    2. 2.谱
    3. 3.飘
    4. 8.漂
    5. 9.普
    6. 0.嫖
    谱f fau
    1. _.非法
    2. 2.方法
    3. 3.依法
    4. 8.用法
    5. 9.佛法
    6. 0.犯法
  • 想打「微分代数」这个四字词,输入到 sfdvua 时可以确定词库里没有这个词,此时直接按 4 定位到第二个音节后面,补码确认「微分」之后再补码确认「代数」,即完成造词:

    s f d vua
    1. _.违法多数
    2. 2.司法大数据
    3. 3.所有的数据
    4. 8.所有的树木
    5. 9.唯一的
    6. 0.违法的
    微分dai vua
    1. _.代数
    2. 2.带
    3. 3.呆
    4. 8.哒
    5. 9.戴
    6. 0.搭
  • 想打「态叠加原理」这个五字词,输入到 tdjkL 时可以确定词库里没有这个词,此时直接按 5 定位到第三个音节后面,补码确认「态叠加」之后再补码确认「原理」,即完成造词:

    t d j k l
    1. _.土豆加快了
    2. 2.土地集约利用
    3. 3.通道接口
    4. 8.土地集约
    5. 9.土地价款
    6. 0.它的健康
    态叠加k li
    1. _.原理
    2. 2.远离
    3. 3.颗粒
    4. 8.园林
    5. 9.口令
    6. 0.卡里

以此类推,掌握这几个快捷键之后,就可以对几乎所有可能的组词方式(1+1, 1+2, 2+1, 1+1+1, 2+2, 2+3, 3+2, ...)快速地拆解完成造词。

组句造词 ​

若词库里没有任何词可以匹配用户输入的编码,则输入引擎会用组句功能来用短词自动生成一个与用户输入的音节数量相同长度的词。由于这个功能的存在,使得本方案常常能出现以下奇特的效果:明明词库里没有用户想打的词,但输入引擎准确「猜」出来了用户想要打的词,此时本方案类似于一个整句输入方案。例如,想输入「密度矩阵」,输入到 mdjweoia 时词库里没有任何词能匹配这个编码,但是词库里有「密度」和「矩阵」且两者频率都不低,因此通过组合的方式正好「猜」出来了用户想要的词「密度矩阵」。

mia d j weo
  1. _.密度矩阵
  2. 2.密度计
  3. 3.密度
  4. 8.密的
  5. 9.嘧啶
  6. 0.秘道

概率法对于 2+2 形式的四字词成功率尤其高,这是因为用户尝试打这个复合词之前通常已经打过了相应的二字词,因此在用户词典里两个二字词的频率较高,所以四字词组合出来多半是这个结果。由于汉语的特点,大多数专业术语都以 2+2 的四字复合词的形式出现,因此使用本方案输入专业文本时体验是极好的。

用户应掌握上述三种造词的方式以及使用场景,通过逐步的使用来融会贯通,这样才能最大程度发挥本方案的造词功能。对于后两种方式,到底是发现候选中没有想要的词就去定位编码,还是多打几码尝试让组句功能组出想要的词,存在一定的权衡,用户需要找到最适合自己的方式并养成自己的习惯。推荐的用法是:四字或更长的复合词可以把编码打全让组句造词碰碰运气,而其他情况及时定位会来得更快。

缓冲造词 ​

缓冲造词的方法为:在没有输入编码的情况下,按 Control+j 进入造词模式,然后将想造词的内容拆分成较小的单位来完成输入,此时输入的内容会积累在缓冲区中而不上屏。输入完想造词的内容后,再按一次空格,此时缓冲区中的内容上屏,同时也完成了造词。

下面以造「冰雪输入法」这个词为例:首先按 Control+j,此时会提示「造词」(取决于前端的实现,也可能不会有提示),然后分别输入「冰雪」和「输入法」(此时的输入逻辑与平时相同,顶功的功能也有效,因此后一个词会将首选「冰雪」顶上屏),如下图所示:

冰雪v r f
  1. _.输入法
  2. 2.受让方
  3. 3.水溶液
  4. 8.双人房
  5. 9.杀人犯
  6. 0.十二分

然后确认「输入法」,这样想要造词的内容就全部进入了缓冲区:

冰雪输入法

再按一次空格,「冰雪输入法」上屏,同时也完成了造词。下次使用正常规则输入该词即可:

b x v r f
  1. _.冰雪输入法
  2. 2.别瞎说啊
  3. 3.百姓收入
  4. 8.抱新生儿
  5. 9.本性使然
  6. 0.必须输入

这种造词方式非常灵活,可以以任意方式拆分任意次来输入。

英数混输造词 ​

在科技与流行文化中,经常出现混有英文、数字的词语的情况。为了让这些词也能够自动造词,本方案给 10 个阿拉伯数字、26 个大写英文字母、26 个小写英文字母也指定了相应的音节码。其规则为:

  • 阿拉伯数字与相应中文数字(零~九)相同,中文数字固定在三码的首选,阿拉伯数字固定在三码的次选;
  • 英文字母的音节码规定为
    • 辅音字母加后缀 oo,例如 b 的音节码是 boo
    • 元音字母加前缀 se,例如 a 的音节码是 sea
    • 除了 j, q, x, k 这些字母外,所有大写字母固定在三码的首选,所有小写字母固定在三码的次选
    • 对于 j, q, x, k 由于首选已经被 *oo 的高频字占据,因此所有大写字母固定在三码的次选,所有小写字母固定在三码的三选

使用这些音节码打出相应的数字和字母,就可以轻易造出如「5G通信」「哆啦A梦」这样的词:

g g t x
  1. _.5G通信
  2. 2.功盖天下
  3. 3.乖乖投降
  4. 8.五个体系
  5. 9.高跟拖鞋
  6. 0.搞怪头像
d l s m
  1. _.哆啦A梦
  2. 2.到了外面
  3. 3.点了外卖
  4. 8.大陆网民
  5. 9.达拉斯买家俱乐部
  6. 0.大连湾牡蛎

方案码固态词典 ​

一般情况下,输入各种编码时候选的排序会随着用户的使用逐渐调整,以贴合用户的使用习惯。但是,如果高频词的排序常常变动,则难以熟练掌握。因此,本方案精心设计了一些固定候选词,这些词在输入对应编码时的位置是固定的,不会随着用户的使用而变化。

这些方案固定词都定义在 snow_sipin.fixed.txt 中。不过,如果您希望调整这些固顶词,不推荐直接修改这个文本,因为如果您未来更新冰雪拼音时覆盖安装,则会使得您的修改丢失。推荐的修改方法请参考下面的「方案码用户词典」一节。

相比于声笔简整和声笔拼音,本方案设计的固定候选词更多,包括了 636 个单音节词和 510 个双音节词,而且进行了更加细致的优化。这使得在一般的连续性输入文本中固定候选词的总频率已经达到了 70% 以上,所以掌握固定候选词可以快速提高输入方案的熟练度。这些固定候选词的规律是:

  • 单音节词的一码(21 个)、二码(105 个)和三码(510 个)全部固定;
  • 双音节词的二码(441 个)全部固定,而三码和四码选取了一部分(69 个)固定;

为了减小固定候选词的记忆难度,本方案选取固定候选词的时候采取了语义优先的策略,也就是语义相关的词往往具有相同或相关的固定码长,记住一个往往就记住了一大片。例如,

...
# 事物代词
wg	这个
ng	那个
nge	哪个
wr	这儿
nr	那儿
nri	哪儿
wl	这里
nl	那里
nli	哪里
...

在 snow_sipin.fixed.txt 中有很多像这样的语义集中的「区块」,看过一次之后就能留下比较深刻的印象。

另外,「的」和「了」两个字因为频率非常高,所以分别采用 ; 和 / 键输入,不占用常规固定候选词的位置。如果不喜欢这个设定,可以在固定候选词文件中自定义。作为替代,分号用 | 输入(即 Shift + \),顿号用 \ 输入。

可选的无理音节 ​

在设置固定候选词的时候,注意到「三」和「四」的声母编码都是 s,无法在「三个」、「四个」等词中保持同样的码长,而且因为「五」的声母「零合」也在 s 上,让这个问题更加严重了。另外,「日」和「二」的前三码都是 ria,也破坏了一些词的整齐性。

为了解决这个问题,对「三」、「五」、「日」这三个字所在的音节增加了无理音节码:

  • san1 这个音节也可以用 heu 打出来,同时也是「三」的固定码
  • wu3 这个音节也可以用 gue 打出来,同时也是「五」的固定码
  • ri4 这个音节也可以用 rii 打出来,同时也是「日」的固定码

记忆的时候,可以把它们当成是一周中的三天,用「周三 wheu」「周五 wgue」「周日 wrii」这三个固定候选词来辅助记忆。另外,虽然这些音节的其他字也能用无理码打出来,但是并不推荐这样做,因为会干扰常规音节码的键位;如果反过来当成是改变了这三个字的读音,会更容易适应。

如果您记住了这些无理音节,并想强制自己使用,可以在补丁文件(snow_sipin.custom.yaml)里写入:

yaml
patch:
  speller/force_special: true

这样的好处是不仅固定词不会冲突,其他动态调频的常规词也不会再冲突了。例如,您正在输入「二零二四」和「二零二五」两个词,若仅仅启用无理音节码而不强制使用,则虽然 rlrg 可以唯一地得到「二零二五」这个词,但是 rlrs 仍然会同时出现「二零二四」和「二零二五」的候选。而若强制使用无理音节码,则可以完全分离这两个词:

r l r s
  1. _.人来人往
  2. 2.二零二三
  3. 3.二零二四
  4. 8.二零二五
  5. 9.二六二三
  6. 0.二六二四
r l r g
  1. _.二零二五
  2. 2.二六二五
  3. 3.日落而归
  4. 8.阿里入股
  5. 9.二零二五年
  6. 0.二六二五年

方案码用户词典 ​

用户可以利用方案码用户词典来对方案码固态词典中的条目进一步自定义。与音节码用户词典不同的是,方案码用户词典存储在 snow_sipin.userdb 文件夹中、并同步到 snow_sipin.userdb.txt 中。用户同样可以利用 Rime 的同步机制来在多个设备之间同步方案码用户词典。其操作方式如下:

固定和取消固定 ​

在有编码且选中了一个未固定的词时,Control+; 可以固定该候选至当前位置。例如,当前第一候选词为「编码」时,按下 Control+;,该词出现「📌」标志,表示已经固定到第一位:

b ma
  1. _.编码📌
  2. 2.帮忙
  3. 3.不满
  4. 8.宝马
  5. 9.饱满
  6. 0.白马

在有编码且选中了一个已固定的词时,Control+; 可以取消固定该候选。例如,当前第一候选词为「因此」且被固定时,

f c
  1. _.因此📌
  2. 2.一次
  3. 3.由此
  4. 8.英寸
  5. 9.页次
  6. 0.隐藏

按下 Control+;,该词「📌」标志消失,表示不再被固定到第一位:

f c
  1. _.因此
  2. 2.一次
  3. 3.由此
  4. 8.英寸
  5. 9.页次
  6. 0.隐藏

自由加词 ​

在有编码时,按下 Control+' 之后候选框消失,以任意方式输入想加的词,再按一下 Control+' 即将词加到该编码第一个可用的候选位置上。例如,输入 kfc → Control+' → 输入「疯狂星期四V我50」→ Control+',则「疯狂星期四V我50」添加为 kfc 的第一候选词。其中的「V」和「50」不经 Rime 上屏,而是由应用直接插入,这样的字母、数字和符号同样会被记下(西文模式下输入的也一样),退格删掉的字符也会相应去掉,首尾的空白则会被忽略。

k f c
  1. _.可以从
  2. 2.渔业村
  3. 3.雨隐村
  4. 8.砍一次
  5. 9.看一次
  6. 0.可隐藏
kfc
  1. _.疯狂星期四V我50📍
  2. 2.可以从
  3. 3.渔业村
  4. 8.雨隐村
  5. 9.砍一次
  6. 0.看一次

再例如,输入 dna → Control+' → 输入「脱氧核糖核酸」→ Control+',此时 dna 已经有固定的第一候选词为「电脑」,则「脱氧核糖核酸」添加为 dna 的第二候选词。

d na
  1. _.电脑📌
  2. 2.大脑
  3. 3.东南
  4. 8.到那
  5. 9.但那
  6. 0.都难
d na
  1. _.电脑📌
  2. 2.脱氧核糖核酸📍
  3. 3.大脑
  4. 8.东南
  5. 9.到那
  6. 0.但那

前移和后移 ​

在有编码且选中了一个已固定的词时,按 Control+[ 将已经固定的候选前移,Control+] 将已经固定的词后移。如果前移和后移的过程中遇到其他已经固定的词,则会交换位置。例如,这里有两个已经固定的候选且选中了第一个:

kooe
  1. _.圆📌 iaia~
  2. 2.原📌 euui~ euui~
  3. 3.猿uaue~
  4. 8.元eeua
  5. 9.缘aaea~
  6. 0.袁eiei~

此时按 Control+] 把选中的候选往后移一位。结果如下:

kooe
  1. _.原📌 euui~ euui~
  2. 2.圆📌 iaia~
  3. 3.猿uaue~
  4. 8.元eeua
  5. 9.缘aaea~
  6. 0.袁eiei~

重置 ​

在有编码时,按下 Control+\ 将当前编码上所有的自定义取消。


用户可以使用 snow_sipin.custom.yaml 定制上述几种操作的快捷键:

yaml
patch:
  translator/fix_key: "Control+semicolon" # 固定和取消固定
  translator/add_key: "Control+apostrophe" # 自由加词
  translator/up_key: "Control+bracketleft" # 前移
  translator/down_key: "Control+bracketright" # 后移
  translator/reset_key: "Control+backslash" # 重置

采用 VitePress 构建