原文链接

输入法作为使用频率最高的软件之一,现有市场已经几乎被搜狗输入法垄断。也正是由于垄断,导致现有的输入法开发项目和开发资料比较少。在这里将自己最近收集的一些内容整理出来,供想做输入法开发的开发人员参考。

输入法开发最为重要的就是开发框架,它是输入法与系统中有输入焦点的应用之间连接的桥梁,将用户输入的文字传输到对应的应用中。

不同系统下输入法开发使用的框架不同,windows系统下使用的框架有:

IMM-IME和TSF,Linux系统下使用的框架有fcitx和ibus,不同的框架应对的使用环境和使用场景不同。后面文章我会详细介绍。

不考虑使用频率较低的外文和少数民族文字,输入法输入针对的语言主要是英语和中文。而英文的输入模式较为单一,这里主要介绍的是中文的输入。

中文输入依据输入源可以分为:按键输入、语音输入和手写输入,语音输入和手写输入是最近几年随着AI技术发展而逐渐发展起来的输入方式。

语音输入和手写输入与AI算法关系比较紧密,这里也不做详细介绍。这里介绍一下常规的按键输入,按键输入模式按照输入原理不同可以分为字形输入和拼音输入,拼音输入又根据拆分模式不同分为全拼输入和双拼输入。

全拼输入就是按照正常的拼音输入然后获取候选词的方式,而双拼输入就是将每个字的音节拆分为声母和韵母,然后将声母和韵母与按键组合映射起来。这样就可以通过输入声母和韵母来输入对应的字了。比如风(feng)可以拆分成声母f和韵母eng,如果键盘上按键A映射f 按键B映射eng,通过AB按键组合输入就可以获得读音为feng的候选。

字形输入细化之后可以分为五笔输入、拆分输入、笔画输入,五笔输入可以用来输入字或者词而拆分输入和笔画输入主要用来输入比较生僻的字。由于五笔模式大家已经非常熟悉,这里只详细介绍一下拆分输入和笔画输入。在搜狗输入中笔画输入和拆分输入统称为u模式,通过按键u进行启动。

笔画输入模式中:

h键代表着笔画中的横

s键代表着笔画中的竖

p键代表着笔画中的撇

n键代表着笔画中的捺

z键代表着笔画中的折

比如要想输入木字按笔画可以拆分为横竖撇捺,对应按键hspn然后得到对应的候选结果。

 拆分输入是将不常见的字或者读音比较生僻的字拆分成它的组成部分,然后通过它组成部分的读音获取这个字。比如想输入焱(yan),可以通过输入huohuohuo获得对应的候选。

为了方便大家的理解和记忆,对各种输入模式进行了整理,列表如下图所示:

其实输入法使用频率最高的是在全拼输入模式下的词汇和语句的输入,下面对这方面的内容进行详细介绍一下。拼音模式下候选词,依据来源可以分为如下几种。

自定义短语(与用户定义相关)

词库短语(与词库相关)

智能组词短语(与组词模型相关)

词库联想短语(与词语联想模型相关)

为了提升全拼输入下的用户输入体验,很多输入法还添加了很多辅助功能,比如:模糊音功能、拼音纠错功能。

模糊音就是实现固定音节的模糊匹配,下面以搜狗的模糊音进行说明

我开启了z=zh的模糊音,这样在输入拼音z的时候会自动模糊匹配zh的候选

 而智能纠错,就是将常见的错误拼音纠正成正确的拼音,比如我开启了gn ==>ng的模糊音那么我输入hogn的时候会自动纠正为hong

 

 

 

依据使用体验来说呢,这两个功能,智能纠错建议全部开启,模糊音建议全部关闭应为会影响候选的精确性。

依据上面的介绍可以简单介绍一下输入法获取候选的流程:

1.先根据系统配置获取输入原理是拼音输入还是五笔输入,如果是拼音输入还要确定是全拼输入还是双拼输入。

2.根据首字母确定输入子模式(是不是笔画输入或者拆分输入)

3.对输入的字符串进行音节解析,音节包括声母、韵母、以及音调,解析音节的时候要确定是否使用了模糊音和语音纠错。

4.根据输入的字符串和音节去检索候选词,候选词包括:

自定义短语、完整的词(从词库中去检索)、通过智能组词组出来的词、单个的字

简要的流程如下图所示:

在这个过程中需要的资源包括:

1.字库

资源(拆分字库,五笔字库,拼音字库,笔画字库)

2.词库资源(系统词库,专业词库,云词库,热词词库,英文词库)

3.自定义短语(系统自定义短语,用户自定义短语)

4.特殊符号资源

用户资源中数组结构最复杂的就是词库资源,这里最常见的词库数据结构进行介绍一下,词库其实就是一个二进制文件,具体的内容主要为音节和对应候选词的映射关系,内容主要包括:文件头、数据页两部分。

文件头中包含了词库的描述信息包括:

词库的名称

词库的作者

词库的词条数

词条的创建时期

词库的版本号

对应词库的索引表

词库的页数

其他的额外的描述字段。

数据页中主要存储了音节和对应的候选词,大家都知道词库的词条数量非常多。如何对候选词进行分类,才能让检索速度更快呢。这里提供一种方案。

由于词库的词条数据量比较大,需要依据音节对词库进行分页处理,每页中包括一部分词条。每个词条至少包含两个音节(两个字),依据前两个字的声母对词条进行分类,前两个字的声母相同的词条组成一页。而当前页中又存有下一页的编号,这样每种拼音组合的候选词就形成了一个链表,可以无限扩容。同时为了提高检索速度,每个词汇页的长度是固定的。

每一个候选页的内容包括:

1.当前页号

2.下一页的页号

3.本页中词汇长度标识 (包含哪些长度的词组)

4.已使用的数据长度

5.具体内容数据

具体内容数据中包含了每个词条信息:

1.词的有效性

2.词的长度

3.音节长度

4.词频

5.词的音节数组

6.词中每个字的Unicode值数组。

在词库中检索词的流程如下图所示:

1.先解析出输入的音节数组的前两个音节的声母

2.根据声母组合以及词库头中音节映射表找到对应音节组合的第一页页码

3.判断第一页中有没有满足对应音节长度的候选词,有的话进行查找,并加入候选词列表。没有的话查找下一页,依次循环直至查找到最后一页。

为了方便大家理解词库的数据结构下面画了一张简单的数据结构图

Logo

更多推荐