版权声明:本文章为博主原创,转载请注明出处。保留所有权利。

Contents
  1. 1. 前言
  2. 2. 为什么需要输入法?
  3. 3. 编码与重码
  4. 4. 智能输入法
  • 前言

最近一个朋友聊起他对输入法的原理比较好奇,有感而发。

  • 为什么需要输入法?

输入法的本质是为了解决文本输入成本的问题。对于英语来说,所有的文本都是由种类很少的最小单位(26个字母)所组成,所以即使是在只能放几十个建的键盘上,也可以从容不迫地为每个字母分配一个键位。而对于汉语,组成文本的最小单位(字)的种类繁多,常用字就有3000个左右,如果硬要想英语一样,为每个字分配一个键位的话,你的键盘就会变成这样:

汉字键盘

可想而知,使用这种键盘的输入成本是无法接受的,谁也不想打一个字就要在键盘上翻半天。那么我们就需要对汉字进行一种编码,这种编码应当类似于英语由少量种类的最小单位组成,来达到降低输入成本的目的;相应地,也需要一个配套的软件来进行解码,把编码还原成相应的汉字,这也就是输入法所做的事情了。

  • 编码与重码

看到这里,有的读者可能已经想到了,汉语拼音就是一种符合我们需要的编码,而且大家都学过,门槛很低。如此一来,编码的问题看似很简单就解决了;但实际上,汉语拼音这种编码还面临着重码这个问题。

什么是重码呢?举个例子来说,“时期”和“十七”的汉语拼音都是”shiqi”(不考虑音调的条件下),也就是说当我输入“shiqi”的时候,仅凭这个编码,输入法是无法确定我想要的是哪一个词的。这种情况下,输入法只能列出一系列符合这个编码的候选词,然后让用户自行进行选择。

选择候选

不幸的是,在汉语拼音中重码现象是很严重的,同样的拼音可以对应几十上百的同音候选,如果每次都在这么多的候选中寻找真正想要的词,似乎又回到了“汉字键盘”的窘境,输入成本居高不下。

那么重码的问题如何解决呢?一种思路是从编码的设计上来避免重码,让每个编码都只对应唯一的候选,从根本上避免重码。从这一思路中诞生的就是五笔、终极boss等基于区位码的输入法,五笔当时更是号称最快汉语输入法,在当时也是主流输入法之一。这种输入法固然避免了重码的问题,但随之而来的就是用户高昂的学习成本,这种对汉字的编码方式不像汉语拼音,它对新用户来说是完全陌生的,可以说学习成本和使用收益都交给了用户承担。此外为了避免重码,编码的长度也会相应地变长,平均来说用户需要输入更多内容才能得到想要的候选。然而用户永远是懒的,有没有一种办法能让我既不用学习复杂的编码,又不用输入太长的编码,又能很方便地找到我想要的词呢?答案是有的,智能输入法就是干这个的!

  • 智能输入法

基于上面的讨论,我们想要的编码和输入法要满足下面的条件:

  • 编码简单,易学,或者干脆就是用户已经会的东西
  • 编码平均码长要短
  • 找候选方便,不用大海捞针

可见,使用汉语拼音作为编码的话,可以比较好地满足前两个条件,而在有大量重码的情况下要做到第三点,就要求我们的输入法“猜测”用户意图的能力很强,可以在大部分情况下把用户想要的候选排在首位,方便用户快速上屏。实际使用中大家也可以体会到,只要你用的是一个比较现代的拼音输入法,毫不夸张地说,80%以上的情况我们根本不需要细看候选栏的所有内容,直接无脑空格上屏就可以了。移动端的情况也类似,大部分情况下都是无脑点击第一个候选(九宫格的情况下因为重码更加严重,这个比例会有一定下降)。

那么如何让输入法猜对用户想要的候选呢?首先我们要定义什么是“对”。从语言的角度来看,输入法给出的候选需要符合语法规则,并有正确的语义。举例来说,用户输入”mingchaoshixianshi”,“名超事闲适”显然不符合常规的语法规范,“命超市仙逝”则有正确的语法结构,但并不具有正确的语义。为了让输入法可以根据这个标准来对候选进行排序,我们必须有一个量化的标准来进行界定。从数学的角度来看,可以通过“概率”这一概念对候选的正确成都进行量化,也就是越正确的候选,其出现的概率越高;反之则概率越低(实际上,这也正是NLP中语言模型的基本思想)。抽象成数学问题的话,输入法就是在给定用户输入的编码串$y$的条件下,召回若干符合$y$的候选串$x$,对每个候选,估计其条件概率$P(x|y)$,最后给出若干个概率最高的候选。更进一步的话,核心问题就在于如何尽可能准确地估计条件概率$P(x|y)$。至于这个概率如何去估计?输入法又是如何建模的?这些问题我们下期继续探究。

打赏

取消
扫码支持

你的支持是对我最好的鼓励

Contents
  1. 1. 前言
  2. 2. 为什么需要输入法?
  3. 3. 编码与重码
  4. 4. 智能输入法