# 手机键盘是帮你怎么纠错的 \[打字系列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最初的键盘就是这么设计的：

<figure><img src="https://pic4.zhimg.com/80/v2-dd2b7173c68dd54b8aecc39d649bb0db_1440w.webp" alt=""><figcaption></figcaption></figure>

（尽管你看到的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%。一般来讲，分布的空间模型是一个二维高斯模型，越靠近中心的点概率越大，远离中心的点概率会迅速减小。

<figure><img src="https://pic1.zhimg.com/80/v2-bea1c7f603f7323b21f1ed8588e41cc8_1440w.webp" alt=""><figcaption></figcaption></figure>

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

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

<figure><img src="https://pic1.zhimg.com/80/v2-e4e1125de60d9bc63cbc3132a6a986bc_1440w.webp" alt=""><figcaption></figcaption></figure>

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

<figure><img src="https://pic2.zhimg.com/80/v2-ccd10544018e77ec2daf79d310959579_1440w.webp" alt=""><figcaption></figcaption></figure>

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

### &#x20;扩展：中文输入

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

答案还是词频。也就是说，哪一个字、词最经常被用到，那么它就是最佳候选词。有的时候，单个词的词频不够，还需要用到不同词组合的频率。比如我们打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），但背后的思想基本是一致的。现在的键盘引入了更为复杂的空间模型和语言模型，也加入了个性化的词典来记住你所输入过的单词。当然，有时候智能纠错也会整出一些幺蛾子，比如输入法可能因为你经常打某个词而调高了它的频率，在某些时刻闹出笑话：

<figure><img src="https://pic4.zhimg.com/80/v2-40f0a3cbef01df28db698dcfc5d360a3_1440w.webp" alt=""><figcaption></figcaption></figure>

\\

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