【实验性需求】英文词组的分词快速输入设想方案
-
背景
最近在修订英文词库,发现有很多词组有如下特点:
- 类型1: 单词多,总长非常长, 如:automatic water quality monitor(自动水质监测仪)
- 类型2: 单词不多,但单词很长, 如:environmental degradation(环境退化)
- 类型3: 普通型,总长正常,单词正常, 如: a lot of, good idea
当前编码方案
- 方案1(姑且叫“首字母编码”): 各单词首字母拼接, 缺点,用户需要记得每个单词,并提取首字母,重码率高,打了第1个单词的首字母,但是不记得第2个单词是什么,想浏览候选列表,几乎是不现实的,所以这种编码方案放弃了!
- 方案2(姑且叫“首全从简编码”): 第1个单词使用全编码,后面的单词使用首字母拼接,优点:可能通过打全第1个单词,缩小候选列表的范围,并且打第2个单词的首字母后,将极大缩小候选范围,对类型1、类型3将是非常有效的编码方式, 但是有如下缺点:
- 对于类型2的词组, 要打完第1个完整的单词,将是非常痛苦的事,明明智能提示已经把单词放到候选1了,却不能空格上屏,需要完全手工打完,再打第2个单词的触发字母。
注:使用“首全从简编码”,解决了一大部分的词组用户输入方便性的问题,但效率仍然捉襟见肘。
新“分词编码”方案设想
- 单词不需要打全, 只需要打单词1的一部分前缀,再接分词符号“‘”,接着输入单词2的部分前缀....单词3前缀...,这样可以极大的减少输入负担。如:envi'deg,即可精确命中environmental degradation
- 兼容“首字母编码”,使用首字母加分词符,即可退化到单词“首字母编码”, 如:a'l'o 精确命中a lot of
约束
- “分词编码”无法在词库里进行固定形式的编码,词库只能默认内置“首全从简编码”(个人优选)
- 需要输入法内置代码逻辑,实现英文词组的“分词编码”功能, 用户使用分词方式时,需要清风按单词前缀进行分词匹配,而使用“首全从简编码”时,按现有的匹配方式。
-
1 关于英文词组分词查询算法的设计思路
注:仅做为思路参考。
1.1 词库加载
1.1.1 现有部分不变
- 继续加载词库码表及相应的创建索引
- 不区分单词还是词组,词组的编码为由词库内置
1.1.2 增加词组的额外处理
- 当发现加载的词条包含空格时,认定为词组,做特殊处理。
- 新设计一张tbl_phrases表,字段为:word,p1,p2,...p10, 共11个字段,word是词组原文,p1为word以空格分割后的第1个单词,p2为第2个...依次类推,词组只需要最多拆分到10个单词就够了,有些太长的有点扯。
- tbl_phrases表的各字段都要建立索引,注:很多词条可能后面的p3 - p10都是空的。
- 将拆分后的词组存入tbl_phrases表中,如果词组只有2个单词,则p3到p10字段填充空值。
- 词组数量并不会太多,经筛选,40W的词库里面,大概有2W条词组。
- 表结构示意:

1.2 单词输入时的查询
1.2.1 按分词方式查询词组
- 当用户输入的内容不包含分词符号时,按原逻辑进行筛选,只查询主表
- 当用户输入内容包含分词时,切换到查询词组表tbl_phrases
- 查询行为,以SQLite数据库为例(已导入2W词组), 查询目标词组为:
two heads are better than one - 输入分词方式:
two'he'a'be, 甚至不用输完,转成内部查询语句为:
SELECT word FROM tbl_phrases WHERE p1 LIKE 'two%' AND p2 LIKE 'he%' AND p3 LIKE 'a%' AND p4 LIKE 'be%';注:这个查询操作即可命中词组,本机耗时约0.002秒。
- 哪怕按极端的,只输入第1个分词字母时,性能也很快:
SELECT word FROM tbl_phrases WHERE p1 LIKE 't%';注:这个查询操作本机耗时也只约0.002秒。
1.3 后记
- 以上只是基于SQLite数据库的一些操作参考,清风输入法如果使用的内存库,则性能会更加优异。