管理拼音输入法的自定义词组

我喜欢用OS X自带的拼音输入法,因为可以使用八百多个萌萌哒emoji😹。但是对于输入错了的词组,例如输入“尾递归”时输成了“为递归”,希望能够删除掉,这样就不会出现在候选列表了。记得Windows下的紫光拼音可以用Ctrl + 数字来删除候选字,但是OS X默认的输入法没有这个功能。下面介绍怎么管理这些词组。

自定义词组,是和词语的频率一起存放在一个SQlite数据库的,位置在:

/Users/tux/Library/Dictionaries/PhraseLearning_zh_Hans.db.bundle/database.db

这个数据库有三个表,其中词组存在ZLEARNINGDICTIONARYENTRY表,结构如下:

CREATE TABLE ZLEARNINGDICTIONARYENTRY ( Z_PK INTEGER PRIMARY KEY, Z_ENT INTEGER, Z_OPT INTEGER, ZEXTRAINTEGER1 INTEGER, ZEXTRAINTEGER2 INTEGER, ZFREQUENCY INTEGER, ZSEED INTEGER, ZDEFAULTREADING VARCHAR, ZEXTRASTRING1 VARCHAR, ZEXTRASTRING2 VARCHAR, ZREADING VARCHAR, ZSURFACE VARCHAR, ZSYLLABLES VARCHAR );

我发现ZEXTRASTRING1列是指该词组的字符数。1就是一个字,如“来”;2就是一个2字词组,如“厦门”,3就是3字词组,如“萌萌哒”;11是1字加1字的二字词组,如“三个”;12是一字加二字的词组,如。还有111, 21,22等等,可按类似的规律去理解。我进一步猜测和归纳,ZEXTRASTRING1这列宽度超过1的都是原来词库里面没有的词,这正是用户的自定义词组。通过如下的SQL语句,就可以找到所以自定义词组:

select * from ZLEARNINGDICTIONARYENTRY where length(ZEXTRASTRING1) > 1 order by length(ZEXTRASTRING1) desc;

如果要删除某个词组,可以执行如下SQL:

delete from ZLEARNINGDICTIONARYENTRY where ZSURFACE = '为递归';

注意,删除掉后,这个词组虽然从数据库中消失了,但是在候选列表里面还有。我怀疑是这些内容都在内存里面,注销再登入后,删除的词组就彻底不会出现了。

延伸研究

这个输入法英文叫SCIM(猜测是Simplified Chinese Input Method的意思),程序位于/System/Library/Input Methods/SCIM.app。启动后的进程名就是SCIM。要让自定义词组生效,可以kill掉这个进程,然后再唤出输入法,进程就会启动。此外,新添加的词组并不会立刻出现在数据库,而是会缓存一段时间才会出现在数据库。