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条词组。
表结构示意:
[image: 1788438940-318062-image.png]
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数据库的一些操作参考,清风输入法如果使用的内存库,则性能会更加优异。