手机键盘是帮你怎么纠错的 [打字系列Vol.1]

这是人机交互科普文章的第一篇,就以我研究的领域“文字输入”来打头阵。

试着在你的手机英文键盘上按下这几个键:h, e, k, k, o 再按空格,99%的情况下你会发现她被纠正成了hello。 智能纠错已经成为现代交流不可或缺的一部分,它是怎么工作的呢?

# 一句话总结

手机键盘会通过空间分布模型计算手指点击位置的概率,再通过查找词典的方法来提供纠错的建议。

# 目录

  • 简单方案:找词典

  • 进阶方案:引入空间模型

  • 扩展:中文输入

  • 硬核时刻:单词相似度

简单方案:找词典

看到hekko的时候,大多数人会想到hello,因为这个词很常见,而且和hekko很接近。手机键盘也是如此:在键盘里有一个词典,里面保存了许多拼写正确的单词以及它的使用频率。通过把词典里的词和打出来的词进行比较,键盘会找出最常见并且最接近的那个单词。词典往往是从很大的文本库里收集构建出来的,每一项包含单词以及它的使用频率(也就是这个单词总共在文本库里出现过几次)。比如我们把马宝国老师的话“这两个年轻人不讲武德,来骗,来偷袭,我六十九岁的老同志,这好吗?这不好” 当作文本库来制作一个词典,那么结果就是

词语词频

3

2

两个

1

年轻人

1

(这里只列出词典前四项)

这句话里,“这”出现了三次,所以它的词频就是3,”年轻人“出现了一次,所以它的词频就是1。当然,键盘里的词库通常会用成千上万的文章(例如报纸,维基百科)作为文本库,基本上涵盖了我们日常要用到的词语。

当你打出一个单词序列hekko的时候,键盘会发现它不在词典里,于是从词典里找到和hekko拼写最靠近的单词(如何判断两个词接近请移步硬核时刻),比如hello, hero,gecko。假设hello的使用频率是50000(也就是hello在文本库里被使用了50000次),hero是3000,gecko是100,那么词典就会选择频率最高,也就是最常见的那个单词作为纠错的结果。

这时候或许有聪明的小朋友想到,没有必要每次都比较词典里的每一个词(比如我打hekko,那么wechat肯定不是我想打的词)。因为大部分时候大家打错都是因为手指点错了某一个键,比如hekko是把字母键l点成了k。这种错误往往会发生在相邻的键位上,因此每当手指按下一个键的时候,我们只需要寻找相邻键字母的单词就能解决大多数问题。比如手指在打k的时候,k周围的字母有i,o,j,l,m,那么我们只需要把k的位置替换成其他的四个字母,然后看一看词典里有没有对应的词,再根据频率选出最常用的就可以了。实际上,iOS最初的键盘就是这么设计的:

(尽管你看到的iOS的键盘是左边的样子,但是当你点击其中一个键,比如F的时候,键盘会把它周围所有可能的字母都考虑在内,来纠正手滑打错的问题。图摘自Creative Selection --- by Ken Kocienda

是不是觉得很神奇?那么问题来了---请你按下这几个键:w,k,n。在按k的时候,你可以尝试往k键的左半边或者右半边按一下,会发现有时候建议的单词是win,有时候是won,这是为什么呢?

进阶方案:引入空间模型

如果你键盘的建议单词情况如上所述,那么可以肯定的是,它引入了一个空间模型。而更可能的是,当你点的k比较靠左时,键盘会建议win,如果点在了k键靠右的地方,键盘会建议won。空间模型指的是对于每一个键位,都对应了一个空间分布模型来计算一个点击位置的概率。简单来说,你的每一个点击都会产生一个概率分布:比如按在K字母的正中央,那么键盘可能认为点K的概率为99.9%,点JLMN为0.001%,更远一点的键则概率更小但大于零。但是如果按在K和L的中间,那么键盘可能认为点K的概率和L的概率都是45%。一般来讲,分布的空间模型是一个二维高斯模型,越靠近中心的点概率越大,远离中心的点概率会迅速减小。

(左边是二维高斯概率分布示意图,概率从中心向四周迅速减小。右边是人们在手机打字时点每一个按键的落点分布(the invisible keyboard),可以看到,越靠近每一个键的中心,落点就越多,越靠近边缘的地方落点越稀疏,所以我们可以用二维高斯分布作为键盘的空间模型。)

在你点击一系列键之后,键盘就会计算出每个点击对应字母的分布,再找到概率最大的字母序列。例如上面的例子,依次按下三个键w,k,n。因为每次都点在了按键内部,所以最为可能的序列就是wkn。然而wkn并不是一个拼写正确的单词,此时键盘就会在字典里查找可能的单词,然后锁定在与之最相近且常用的 win 和 won。当两个候选词词频相近时,就需要用空间的概率来决定改成哪一个单词。假如你点k时,落点靠左:

那么根据空间模型,字母i的概率要比字母o更大(落点距离I键的中心更近),因此会选择win作为改正单词。如果落点靠右:

由于落点更靠近O键的中心,这次字母o的概率要更大一些,因此会选择won作为改正单词。

扩展:中文输入

讲了半天英文,中文其实也是一样的道理。如果是拼音输入法的话,会首先根据手指的落点找到对应的字母,然后根据拼音找到对应的汉字。输入拼音的部分基本上和输入英文是相同的,那么有了拼音,输入法怎么找到最可能的汉字呢?

答案还是词频。也就是说,哪一个字、词最经常被用到,那么它就是最佳候选词。有的时候,单个词的词频不够,还需要用到不同词组合的频率。比如我们打laoshi,输入法很可能建议”老师“;但如果我们打laoshiren,“老实人”又会变成最可能的单词,因为“老师人”的组合要远远比“老实人”罕见。

硬核时刻:单词相似度

这里是硬核一点的知识,面向想要进一步了解的同学们:)

在词典法的解释中我们提到了单词之间要“接近”,也就是拼写要相似。但是如何具体的定义两个单词的相似度呢?计算机学科里面称之为“编辑距离”:将一个单词转化为另一个单词时所需要的最小编辑次数。编辑的操作可以是替换一个字符,插入一个字符,或者删除一个字符。

例如 hekko 与 hello 的编辑距离是 2,最少需要把两个k替换为l。hekko 和 hero 的编辑距离也是2:把第一个k替换为r,然后删掉第二个k。hekko和hi的编辑距离是 4,需要把e替换为i,然后删掉kko。所以比起hi,hello和hero更接近hekko。相似度的计算则需要用到一种叫做“动态规划“的算法,感兴趣的话可以在网上搜索,此不展开。


通过引入空间模型+词典词频的方法(专业上称后者为语言模型),我们基本上就可以解释智能纠错的原理啦。当然,真正用在你的手机键盘上的不只有纠错,还有单词补全(比如输入com会建议computer),但背后的思想基本是一致的。现在的键盘引入了更为复杂的空间模型和语言模型,也加入了个性化的词典来记住你所输入过的单词。当然,有时候智能纠错也会整出一些幺蛾子,比如输入法可能因为你经常打某个词而调高了它的频率,在某些时刻闹出笑话:

本文引用: [1] Ken Kocienda: Creative Selection, 2018 [2] Suwen Zhu, Tianyao Luo, Xiaojun Bi, Sh umin Zhai: Typing on an Invisible Keyboard, 2018

最后更新于