中文输入的数学原理
( 友情提示:阅读这篇文章大约需要15min的时间与7MiB的流量,转载请注明出处 )
一个偶然的契机,使我接触到了一个新的输入方式。理科生的本能,让我开始思考中文输入法的一些问题。难得最近有时间,在这里分享一下自己的思考。
0. 五笔 OR 拼音? 从未停止过的输入法之争
这一节讲的是输入法的发展历史。如果对这个内容不感兴趣,可以直接跳转到第二部分
在80年代前后,随着计算机引入中国,一个严重的问题出现在人们的眼前:如何使用计算机处理中文。表音码虽然是一个可选方案,但因为汉语中存在大量同音字,输入效率会极其低下。而对于另一个选择字形码,当时普遍认为中文是二维的组合,简单的组合不可取。
也许是受到IBM日本开发汉字键盘的影响,当时一个主流的想法是制造一个能够涵盖大多数汉字的键盘。这在现在看来简直是荒谬。
(图 IBM日本开发的汉字键盘)
(图 交通大学试验中的中文键盘)
随着需要录入汉字数量的增加,这种键盘的复杂度也逐渐增加。今天我们仍然能看到一些这种键盘臆测的段子在流传。着实反映了这种键盘给在人们心中留下的阴影。
(图 这真的不是段子)
直到倉頡輸入法的出现(1976年),这一局面才真正被打破。
倉頡輸入法如同通过字母输入单词一样,使用若干叫做字根的东西,组合成为汉字。例如汉字「倉頡」两个字会被拆分为人 戈(丶) 日 口
和工 口 一 月 金(八)
这可以说是一个非常有创意的模仿。虽然主流观点认为汉字是二维的,不适合通过字根组合的方式来输入。但通过如前缀、自身的一系列规则,倉頡輸入法做到了。可以说,倉頡輸入法的出现拯救了中文输入。
(图 倉頡輸入法键位)
然而作为第一代中文输入法,仓颉输入法并不完善。
首先,早期的倉頡輸入法没有设置简快码,一些比较常用的汉字却不得不输入复杂的编码。
其次,倉頡輸入法的字根设计过于简单。处理存在大量相似字形的中文汉字时,难免出现重码。而倉頡輸入法的解决方案居然是为其选择一个无理码,或者单独为其设计一条规则。比如「束」要被拆成木 中
。这种无理码的存在,在一定程度上增加了学习难度。
(图 奇怪的拆字规则)
再次,对于英语键盘的模仿略显拙劣。有心的读者可能已经注意到,仓颉输入法「日月金木水火土」的字根正好对应了「ABCDEFG」的按键。然而QWERT键盘的设计其实是为了降低打字速度以防止卡住打字机,倉頡輸入法作为一个新生事物,模仿的同时却不注意去其糟粕,在一定程度上提高了学习难度,降低了输入效率。
因为倉頡輸入法在当时只支持正体中文输入,在大陆地区并不普及。而在简体中文圈里,类似的故事也在上演着。若干科技人员各自为营,尝试设计不同的中文输入法。其中最为成功的也许应当属于王永民先生推出的五笔字型输入法(1983年)。
(图 胡耀邦视察五笔字型)
和倉頡輸入法相比,五笔字型输入法无疑是一个巨大的成功。
首先,五笔字型输入法摆脱了英文字母的束缚,重新在键盘上划分了横竖撇点折五种笔画区域(虽然没有找到证据,个人倾向于五笔输入法是因此得名)。这样的键位划分极大程度的方便了记忆。字根按照一个比较强的规律分布在各自的区域里,即使临时忘记也很容易推测出来在哪里。
其次,使用的拆字规则更加简洁明了,大多数字只要会写就会拆。简单的规则使得五笔字型输入法更加容易入门。而一个汉字最多只需要四次击键,很容易形成肌肉记忆,把打字速度提高到一个极高的水平。
(图 王码五笔输入法86版字根表)
然而五笔输入法的规则对于大多数人来说还是过于复杂。当时甚至需要一个叫打字员的职业,专门负责把各种文稿输入到计算机。
对于日常输入等场景,显然大多数人是没有动力,也没有必要去学习的。也就是在这一期,因为通常需要专员来操作,我们形成了电脑的操作非常复杂这一刻板印象。
(图 王码五笔发明人王永明与科委主任罗干)
对于使用拼音来输入汉字的尝试也从未停止过。另一群人坚信可以通过使用拼音,更简单地输入中文。目前考证到最早的拼音输入法是自然码(1988年)方案。
(图 自然码方案表)
使用拼音来输入中文不可避免的一个问题是大量的同音字。自然码借鉴了字形码,采用「拼音加形」的方案降低了重码。同时字形码复用了拼音的知识,减少了需要记忆的内容。中文输入的门槛开始降低。
以输入「张」字为例简单的对比一下字形和拼音两种输入法。五笔输入法需要输入X(弓) T(丿) A(七) Y(㇏)
,对于86版五笔可以使用简码XTA
。而使用自然码则需要输入V(zh) H(ang) G(弓g) I(长ch)
。对于没有时间或者没有动力学习的人来说,真的是比五笔舒服多了。
(图 自然码形码表,似乎没有标出来i里面的「长」)
当然可能会有读者发现了问题,为什么印象中的「张」的写法是X(弓) A(七) T(丿) Y(㇏)
,而五笔却拆成了X(弓) T(丿) A(七) Y(㇏)
?
这个问题嘛,和湖南人认为湖南拼音是fúlán
一个道理。所以在方言导致拼音错误,和书写导致形码错误方面,谁都别嘲笑谁。
_(:з」∠)_
拼音的发展并未止步于此。
1990年前后,朱守涛同志在自研「CW中文语词处理系统」的基础上进一步开发,推出了智能ABC输入法。
(图 智能ABC,很多人对于输入法最初的记忆)
因为计算机性能的提高,智能ABC正式携带了全拼输入。不再需要去记忆自然码那样的方案表。
而智能ABC输入法与早期自然码最大的区别在于,智能ABC大胆地采用了词组输入的方式。在智能ABC下输入A(zh) H(ang) T(t) X(ie)
,直接就可以获得张贴
这个词语。正是这一特性打开了潘多拉盒子,拼音输入开始一发不可收拾。
随着计算机性能的进一步提高,紫光拼音输入法诞生了(1999年前后)。比智能ABC更激进的是,紫光输入法允许直接输入一整个句子。通过一系列的计算推测最可能性最大的组合。然而当时存储能力的限制,不允许存储复杂的语言模型。因此紫光拼音输入法输入长句子时,并不总能准确地计算出内容,甚至会出现很奇怪的结果。
(图 紫光拼音输入法)
随着互联网技术的普及,搜狗拼音输入法(2006年前后)诞生了。搜狗输入法结合了自家搜索引擎,通过对大量网络数据的分析,计算用户需要输入的内容(这种东西有时候会被叫做大数据分析)。只要不涉及奇怪的语料,通常可以输入一个完整的句子,而不需要进行选词。
(图 搜狗输入法)
而在拼音输入法百花齐放的这段时间,字形码似乎停止了进化。拼音输入法早已经可以无重码地输入一个完整的句子,字形输入法却还停留在一个一个字录入,偶尔会有重码的状态。
(图 略有进化的智能五笔输入法,无非是词库有所增加)
在这个大家都喜欢站队的世界,总会见到拼音用户的“字形输入过时了,拼音输入才是未来”之类的言论。而字形输入法用户也总会展开反击,比如批判拼音的重码,导致提笔忘字之类的。随便一搜索,就能找到一大片异常热闹的争论,谁都没能说服谁。
不过如果有人问咱什么输入法是最好的,咱不会给出明确回答。虽然这一态度使得很多人对咱不爽,但是目前为止,真的不存在完美的输入法。
那么什么样的输入法才算完美呢?
1. 输入法是什么?
将汉字输入到计算机中,本质上是一个把信息输入计算机的过程。而输入法则充当了把人类能理解的编码,转换成机器能处理的编码的转码器角色。这个过程中可以使用麦克风(语音识别)、数位板(手写识别)、摄像头(光学字符识别)。在这个过程中,键盘是最常用的输入接口。
(图 这也是一种键盘)
通常英文键盘上会有26个英文按键被用于输入(编码),10个数字键用于选择(消歧义),外加一些诸如Shift
的控制按键。而这些同时也构成了基于键盘的中文输入法的基本元素。
对于汉字的编码主要有三种思路:基于字形的编码,基于字音的编码,基于字典的编码。这里可能需要对基于字典的编码给一个说明:这一类编码通常采用的是,类似直接输入机器码的方式。虽然不存在重码,然而对人类过于不友好,因此不在本次讨论范围内。
对于字形的编码大多是类似字典的部首检字法那样,拆成若干个字根。不同的字根分布在键盘的不同区域。需要输入某个字的时候,按照特定顺序,从键盘选出这几个字根,组合起来即可输入这个汉字。因为大多数人学习汉字的时候都有学习过偏旁部首的知识,所以拆字的方法对大多数人来说很容易接受。然而记忆少则数十个,多则数百个的字根在键盘上的分布无疑是一个巨大的门槛。
这里有一个常见的误解。很多人想当然的认为,在使用字形输入法时需要按照规则即时拆字,批判这种拆字操作会中断思维。然而事实是,一个熟练的使用者并不会在使用时拆字:想到了这个字,凭着肌肉记忆,手就奔着键盘去了。
而对于读音的编码更多的是基于汉语拼音的教育(也有使用注音符号的)。因为采用了英文字母,结合英文键盘有天生的优势,通常被认为是零门槛。但掌握拼音、键盘上各个声韵的位置实际上也是一个门槛。前者因为汉语拼音的教育不经意忽略了,而后者因为内容不多,掌握比较快,也日常被忽略。
但是二者都可以抽象为把人类能处理的编码方式,转换为计算机能处理的编码方式的转码器这一模型。区别仅仅在于采用了什么样的、人类能理解的编码方式。于是想要评价一个输入法,很重要的一部分是评价这个输入法的编码规则。而如何评论编码规则,信息论已经给出了答案。
2. 汉字输入需要多少按键?谈谈信息论与编码
既然知道了要讨论的只不过是一种方便人类理解的,使用键盘的编码方式编码方式。不妨用编码相关的理论——信息论来探讨。
信息论概述
考虑GB2312简体中文字符集中的6700个常用汉字。如果不考虑汉字的使用频率差异,使用26个英文字母对汉字进行编码。两个字母组合最多编码26 * 26 = 676
个汉字;使用三个字母编码的话,总共可以编码26 * 26 * 26 = 17576
个汉字,对于GB2312字符集来说绰绰有余。
聪明的读者也许已经发现:想要知道n次击键可以编码多少汉字,只需要求按键数量^击键次数
。想要知道编码m个汉字需要多少次击键,只需要求逆运算log_按键数量(击键次数)
即可。
为了计算方便,在这里需要引入信息熵的概念。科学家很喜欢创造可怕的名词来吓人,但是实际上可能意外的简单。简单说信息论的一个核心就是,越不可能发生的事情,包含的信息量越大。信息熵表达的就是,这件事情到底多么不可能(包含多大信息量)。
我们会说 “明天太阳从东边升起” 这样一句话是一句废话。因为对于听者来说,这句话描述的事情是必然发生的。也就是说对于听者,这句话不包含任何有用信息。
而如果一个萝莉控学弟一本正经的说,自己爱上了一个学长。那么相信很多人本能的会吐槽一句:信息量太大了。
(图 信息量太大了.png)
吴军在《数学之美》这本书里面有一个更生动的例子:
那么如何量化信息量的度量呢?来看一个例子。2014年举行了世界杯足球赛,大家都很关心谁会是冠军。假如我错过了看世界杯,赛后我问一个知道比赛结果的观众“哪支球队是冠军”?他不愿意直接告诉我,而让我猜,并且我每猜一次,他要收一元钱才肯告诉我是否猜对了,那么我要掏多少钱才能知道谁是冠军呢?我可以把球队编上号,从1到32.然后提问:“冠军球队在1-16号中吗?”假如他告诉我猜对了,我会接着问:“冠军在1-8号中吗?”假如他告诉我猜错了,我自然知道冠军队在9-16号中。这样只需要五次,我就能知道哪支球队是冠军。所以,谁是世界杯冠军这条消息的信息量只值5块钱。
当然,香农不是用钱,而是用“比特”(Bit)这个概念来度量信息量。一个比特是一位二进制数,在计算机中一个字节就是8比特。在上面的例子中,这条信息的信息量就是5比特。
一个二进制位能表示两种可能性,两个二进制位可以表达种,n个二进制可以表达种可能性。那么如何根据总的可能性计算需要多少个二进制位呢?
这要用到高中时候学到的一个知识:对数。已知欲求,则只需要计算。
于是信息熵的一个简单计算方法是:
如果希望通过一个更加严谨的数学表达式来定义的话:
从信息论来看汉字编码
现在可以开始一系列简单的计算了。
首先是26个英文字母键盘中每个按键的信息量。平均每个按键使用到的概率是,可得每个按键的信息量为比特。
对于中文字符,使用GB2312字符集时,假如字符集中收录的6763个字符服从均匀分布,每个字符的信息量为比特。
如果使用GB18030字符集,每个字符的信息量则为比特。
做一个简单的除法就可以得到,想要从GB2312字符集中唯一地确定一个汉字,平均需要2.70次击键;而对于GB18030字符集这个数字是3.42次击键。
香农第一定理指出:对于任何信息,编码长度不应当小于它携带的信息量,否则会出现信息丢失。而对于输入法来说,所谓的信息丢失主要体现在重码方面。
拼音输入法只需要两次击键,编码长度过短,小于任何一个字符集中字符携带的信息量。因此拼音输入法重码似乎不可避免;而使用更长编码的字形码因为提供了足够多的信息量,可以避免重码。
(图 我要的字在哪?)
因此似乎可以得到结论:仅有两次击键的拼音输入法,因为编码长度过短,无可避免的要重码,直接淘汰出局;字形码才是编码的王道。
新局面:基于词组的编码
如果时间线截止到20世纪八十年代,那么这也许就是结论了。然而,聪明的读者也许发现了一个问题:汉语中不是所有汉字出现的概率都是一致的。
一份统计调查表示,汉字中最常用的字是「的」,而这个「的」字在长篇行文中出现的概率大约为3.20%,因此我们可以计算这个字符的信息量是比特。
也许有更聪明的读者进一步意识到了,不是任意两个汉字都可以组合。「吃」和「饭」进行组合很合情合理,但是「吃」和「饿」组合成「吃饿了」……
怎么想都是满满的违和感。如果用学术一点的话来说,是因为「吃饿」组合出现的概率远远低于「吃饱」这个组合出现的概率。因此五笔输入法里面K(口) T(丿一) Q(饣)
会出现「吃饭」而不会出现「吃饿」。
这个理论很重要,因为这个理论说明了当一个字出现在词组中,它的信息量会变小如果想要给予一个证明的话:
第六版的辞海,收录了127221个词条。如果把他们全部假定为双音节词语,每个词语具有比特的信息量。对应到单字是每个字8.48比特的信息量。这个数据已经远小于之前计算的单字12.72比特信息量。
按照前面的换算方法可知,最低只需要平均3.61次击键即可从中完成检索。而五笔和拼音都做到了在4键以内输入这些词汇。至此,音码和字形码打平手。
但当我们放眼更大的词库。例如,截止2019年中文维基百科收录词条1000000余条。计算下来每个词条的信息量比特。
因为没有明确的分字规则,字形输入法的输入编码长度通常是受限的。例如五笔输入法的限制是最多4码。而如果仅仅使用四次击键来输入,即使使用全部键盘也只能获得比特的信息量。更何况五笔输入法实际上只使用了25个按键,一次最多只能输入18.58比特的信息量。而这些信息量显然是不足以保证不重码的。
(图 夭寿啦,五笔居然重码啦)
(图 还重了好多)
新时代:基于语言概率模型的输入
当紫光输入法开始了整句输入,五笔终于才开始显得落时。而这也是可以通过信息论来解读的。
而因为音节存在天然的声韵分词规则,拼音输入法可以不设最长编码限制。没有了编码长度限制,也就可以为所欲为的输入各种复杂词汇。同样是因为不存在编码总长度的限制,拼音更是允许输入整个句子,让计算机通过概率模型,推算想要输入什么样的句子的可能性最大。
之前的计算过以词汇统计时,每个汉字的信息量大约8.48比特的信息量。但是如果考虑上下文关联,考虑哪些词汇可以互相连接,单字的信息量就还会进一步降低。
吴军在《数学之美》一书中提到,“考虑上下文的语言模型里,平均每个汉字只有6比特的信息量”。虽然没有严格的证明,但是即使假定每个汉字的信息量略多,比如达到了8比特,那么也只需要次按键即可决定一个汉字。而按照吴军提出的6比特的计算,这个数字会下降到1.3。
(图 平均1.3比特信息量是不是说,对于信息量偏低的句子,可以一键输入一个字?)
拼音输入法中每个汉字只需要输入两个按键,也就是通过比特的信息量决定一个汉字。虽然对于单个汉字,拼音的信息量不足;但是通过后续的音节不断地为整句补充信息,最终可以以平均每字9.40比特的信息量输入整个句子。
而紫光输入法正是开始这种尝试的第一人。虽然受限于个人计算机的存储和计算能力,总会算出奇怪的结果。而互联网的普及,廉价的接入与超高容量的服务器语料库结合,整句输入终于在现在拼音输入法上绽放了光彩。
而反观字形输入法,即使整个句子都可以以二字词组输入,最终也需要平局每字9.28比特的信息量。而万一句子中出现了若干如助词一类,不能够以词组输入的单字,字型输入法的平均单字信息量一定会高于拼音。
也许会有人提出可不可以让字形码也允许像拼音那样:取消编码长度限制,允许一次性输入若干词组,以为这样字形码就可以和拼音匹敌了。你是想让某个叫「郑月」的,被识别成「关阴」么?字形输入法还指望着终止输入这一操作来分词呢。
可以说目前为止,字型输入法是被自己制定的条条框框限制死了。
双拼——被遗忘在角落的神器
可能一直有读者有一个疑问,为啥你口中的拼音只有两次击键?明明最长需要六次击键(例如zhuang
)
这就要提到一个被遗忘在角落里的拼音模式:双拼
看过自然码的方案表应该能理解这是个什么东西:
汉语拼音可以分为声母和韵母两部分,其中包含21个声母,算上被算作声母的Y和W总共23个,而韵母总共33个。而一个音节的输入只需要分别输入声母和韵母就可以了。
33个韵母超出了26个字母的范围,存在多个韵母共用一个按键的情况。因此认为双拼会导致更多的重码,甚至包括吴军博士也搞错了这个问题。
事实并非如此。
观察W(ia ua)
键上面的两个韵母,感性告诉我们一定会导致重码。然而汉语中存在着大量不可拼读音节,如gua
可以拼出一个「瓜」字,那gia
呢?同样jia
可以得到「家」,但是不存在读作jua
的汉字。双拼键盘上其他的共享也都是这个原理,因此不会导致额外的重码。
(图 中文普通话中存在大量不可拼读音节)
而与导致重码恰恰相反的是,双拼的声韵规则,可以略微减少重码。例如「西安」和「县」,全拼都是xian
,但是双拼分为xi an
和xm
。同样的例子还有「昏暗」和「湖南」,「广安」和「观感」等。
而双拼带来的收益是明显的,不再需要冗长的编码,平均码长变得和五笔一样;同时包含了足够的信息量:不会像只输入声母的超级简拼那样面临大量重码、也不会像缺少音节划分的全拼因为音节歧义而重码。
字形输入法的未来
也许看了这么一大段论述会觉得字形输入法可能已经没有未来了?
还真不一定。
如果字形输入法继续执着地单个词组输入,在高端计算机上,可能真的到此为止了。
然而,试想如果可以有这样一个字形输入法:编码分为全码和简码。全码长度为4,保证可以检索出唯一的一个汉字;简码长度为2,允许连续输入若干个简码然后运用语言模型自助选词。也许是一个可以在准确度和速度同时碾压拼音的输入法。
当然需要认真考虑一下,会不会有「日月」和「明」搞错的可能性。
3.谁才是最佳输入法?
这个问题没有答案。不同人的输入需求不一样。对不同人来说的「最佳输入法」也不一样。适合的才是最好的。
观察网上关于输入法的争论,很容易发现大家都是抱着各自的成见,用自己的喜欢的输入法的长处去攻击其他输入法的短处。却少有真正从理论上分析输入法的。汉字的输入本质就是一个人与计算机通信的过程,那么自然要用通信编码的理论去分析。如果只是一味地批判自己不认同的输入法,这样的讨论意义并不大。
直至写这篇文章的时候,仍有狂热的字形编码用户在批判咱平时用的拼音输入法不好。应该去用他用的那种字形码。理由居然是
使用拼音输入单字会导致重码,不信输入一篇古文试试。
字形码也可以输入词组,而且极少重码。
整句联想错误率很高。
这就犯了不考虑场合谈优劣的错误。这篇文章的大多数内容都符合现代汉语的统计学模型的,因此使用拼音输入这篇文章并没有过高的重码率。
(图 基于统计学模型的汉语整句输入)
比如上图的这句话,如果用五笔输入法的话,编码是
gmwa icyg r xyip saga skny lwty g gkih qkd ytd dmj i dhdh tgdc
凭借大量的词组,勉勉强强和拼音持平。
而如果是一个纯粹的字形码会是什么样子呢?
mgbhu oip ee ivmmr hapi vmyiu ivj fbnd dtak mng mnr vio ihu ivoj jqomn
oh m dkmym pr ivhjr mbll mf klnd klg hjwg mrnvm
Boom….
但是如果是这样一句话:
我叫龘䶛䨻䎱㸞蚮䡶䴞䴝䯬䬛䰕㹚
拼音输入法
但是咱会不会因为这样一句话去学习五笔输入法呢?
显然不会。原因是:咱本来就会用五笔。
那么会不会因为这一句话临时换五笔呢?
依旧不会。因为
那么什么时候会用五笔呢?
对咱来说几乎没有这种场合。也许在帮某学生组织输入一份新生名单的时候会拿出五笔吧(毕竟不在字库里)。
但是不是说字型输入法已经彻底失败了。
根据编码理论,有一些场合,字形输入法还是值得使用的。例如因为计算机存储或计算能力的限制,无法使用复杂的词库及语言统计模型(这个在嵌入式计算机中应当很常见)的场合;或者输入一些不符合现代汉语统计模型的,诸如若干不可预测的姓名、或是一段「完玩权泉不腐和中纹焊渍桶季归绿的内融」。
至于说常见的古文
(图 字音码的超大词库,使很多古文可直接输入。做成字形码词库,重码会十分感人)
超大词库使得古文早已沦陷。如果非要说必须用字形码的古文,可能只有那些还没有被解读出来的古文了吧。而这种程度的,显然已不是大多数人用得到的。
至于说照着文稿录入的,,,建议你了解一下OCR技术。
理论总会输给成见
尽管理论上可以证明,绝大多数场景都是字音码胜出、特殊场景下字形码胜出。但是争论从来没有停止。如果争论的焦点在于双方均覆盖到的一些场合,还有情可原。然而目前的争论大多还停留在,用自己的长处攻击对方的不足。
字型用户认为字音用户存在重码时,总是选择性的无视了语料库的存在。或者把字形码那容量并不大的语料库,拿来和拼音输入法的语料库相比(小巫见大巫?)。
考虑不重码的情况下允许的最大词库容量,仓颉最多10172525,大易最多4576954,五笔最多406900,郑码最多475254。而字音码词库已突破40000000条,云端前后文关联数据已经超出了大多数市售计算机内置存储器容量。在这种数据规模下,常见的句子,显然五笔是落后的。甚至对于足够常见的句子,只需要输入句子的字的声母,就可以使用语料库准确预测。(不过好想吐槽,如果一个人说话的所有句子都可以被这么轻易预测,他的大脑该有多空虚)
(图 “晚上吃什么”这种内容,真的是拼音更快)
而拼音用户在说字形码麻烦的时候,也总会选择性的无视了字形输入法的检字准确性。或者用自己那些可以被准确预测的贫乏的语料,来说明五笔已经落时了。
亲,中文只有四百多个可拼读音节,计算机中却收录了70244个汉字(GB 18030)。指望拼音从里面确定若干个奇奇怪怪的,不太符合现代汉语使用规律的字符?拼音携带的信息量已经决定了它做不到。在无法使用词库的特殊场合,想要快速准确输入,拼音做不到。承认字形输入法在这方面的优势,有什么值得怀疑的么?
为啥就不能互相理解一下各自的输入法在各自的应用场合的特殊意义呢?鸡同鸭讲的方式,强行证明自己阵营的优越性,除了浪费时间以及自以为优越,还有啥意义么?
小调查
最后多嘴一句。当您读完了这篇文章,是否愿意说一说您在使用什么输入法呢?