问题背景简介
笔者三年前学会了五笔输入法,在电脑上一直在用五笔输入法,后来手机上也在用,不过现在的手机都是虚拟按键,键位非常小,26键的情况下确实会出现打不准的情况,手机打字速度不高,一直连接到蓝牙键盘也不现实,而9键的五笔几乎不可能好用。前几天从街坊那时听说在用“双拼输入法”,便稍微学了一下,也许比较适合手机上9键输入的。
关于双拼输入法
双拼输入法的基本原理还是拼音,只不过双拼是根据汉语拼音的规则,可以把汉语拼音分为声母和韵母两部分(当然有a,an,e这样没有声母的,规则中设定它是零声母,也可以有一个特定的键),输入一个声母一个韵母即拼出字,每个声母和韵母都只用一个键打出。
以键盘26键的双拼为例,输入某个字时,第一个键是声母,那么u,i作为键面上有的韵母,不可能拼出拼音,双拼就把它映射为双字声母比如sh,ch。输入声母之后,下一部分必是一个韵母,那么普通拼音输入q,w等声母的键就用不上,于是就可以在输入声母以后的q,w映射为韵母iu,ia。这样一个键代替多字节韵母,就提高了键的利用率,从而使每个拼字只需要两键,熟练之后就比普通拼音快很多。当然因为拼音天然的重码率问题不可避免,电脑输入的速度仍比不过五笔输入这样的形码。
然而,手机的输入法就是另一副模样。因为手机屏幕不太,在人眼的同一个视野中可以全看清,首选字和副选字都是需要用手触摸点选,首选与副选的速度差距不再像电脑上首字空格上屏,其它候选字要按数字键那样明显,又加之智能拼音利用云技术智能联想,可以自动调整常用词的词频,这样拼出同音字即便可能不在首字也是第二第三候选字,不会使选字造成太大问题。
那么,在手机输入法中用9键的拼音结合双拼的思路,可以设计一个双拼9键的输入法,用数字1-9代表某些拼音的成分,首字是声母,次字是韵母,则用敲两个数字的方式拼一个字。
输入方案设计
例如:先按默认的字母分布,把韵母a,e,i,o,u排除,就得到
键位 | 声母 |
---|---|
2 | b,c |
3 | d,f |
4 | g,h |
5 | j,k,l |
6 | m,n |
7 | p,q,r,s |
8 | t |
9 | w,x,y,z |
这就是最初步的设计方式,不过还没有完,因为拼音还有ch,zh,sh没放进去,同时不难发现8号键只有t一个字母,7和9号键与有4个字,不太均衡。因为现在我们可以自行设计,当然可以调整的均衡一些,例如可以调整成:
键位 | 声母 |
---|---|
2 | b,c,NULL |
3 | d,f,ch |
4 | g,h,r |
5 | j,k,l |
6 | m,n |
7 | p,q,s |
8 | t,zh,sh |
9 | w,x,y,z |
2号键的NULL代表零声母(没有声母的拼音如“阿”“安”“鹅”等)
类似的可以组织韵母,比如我设计的易记的初版:
键位 | 韵母 |
---|---|
1 | en,eng,in,ing |
2 | a,ai,ao |
3 | e,ei,er |
4 | i,ie,iu |
5 | ia,iang,an,ang |
6 | o.ou.ong,iong |
7 | ue(ve),ui,ua,uo |
8 | u,v,un,uang |
9 | ian,iao,uai,uan |
根据26个字母在键上的分布,其中韵母a,e,i,o,u分别在2,3,4,6,8上,这个韵母表按音相近且键相近的原则分配。
不考虑同音选字的话,输入一句话,例如“计算机组成原理与系统结构”,则可输入 54 79 54 98 41 99 54 98 94 86 54 46(这里每字用空格分隔,实际输入时可以输入词组更提高准确度)
设计问题与解法
本身拼音就有同音重码的现象,现在同一个键又映射了多个音,使得重码又多了一层,这样一来效率也不会太高。
那么问题来了,如何统计出当前方案的重码数量呢?我们当然可以想到编程解决,就是分出声母和韵母,看一下每个键上一共映射了多少可能的拼音。我们知道并不是所有拼音组合都存在,比如bou,gia,cie等这种组合是不可能的,所以我们需要查一下拼音的合法性,然后统计每个键上总共有多少个拼音。
这里先不考虑拼音的每音调是否有效以及每个音包含字数以及字频问题,只看有效的拼音数是多少。
/*
设计手机双拼9键输入法的方案
统计其重码数
Programming Time:2017-08-24
planA易记,但是重码率比较高,有时一个键上有8个音,会在选音上产生一点麻烦
以后可以调整键位,再做统计
*/
#include <stdio.h>