起因
fcitx5 自带的词库的太小,手动一条条加用户词太慢,索性拿一份真实语料跑一遍词频,一次性喂给 fcitx5。
做法
词表直接取白霜拼音 1.0.3 的 fcitx5 词库,就是「词 / 拼音 / 频率」三列那个文件。统计时只用词和拼音两列,它原来的频率不参与——我们要算的是这份语料里的分布,旧频率留着反而会干扰。
我统计材料使用的是iccc,这个是目前规模最大的清洗版中文闲聊语料之一,与日常打字的场景一致。
匹配这一环其实不是分词,而是多模式匹配:把所有词条塞进一个 AC 自动机,在语料上扫一遍,所有命中都计数,允许嵌套和重叠。也就是说"计算机科学"这句话里,“计算机"“科学"“计算机科学"各算一次。语料原有的空格不当边界,直接忽略。
这样做的好处是实现简单、语料只需扫一遍,而且流式读入,不用把整个语料load进内存。
计数完按次数降序排序,权重用归一化概率(该词次数 / 总命中数),写回「词 / 拼音 / 概率」三列。同一个词有多个读音的,各占一行;一次都没命中的词也保留,概率写 0。
为什么不用 1.0.4
实测 1.0.4 在 fcitx5 下效果很差,候选排序反而更乱、常用词沉底,所以退回了 1.0.3。
实测效果
整体是够用的:术语和惯用搭配基本上都有,翻页明显变少,这部分收益很实在。
但偶尔会出现很奇怪的排序:某个冷门词跑到常用词前面,或者两个词先后顺序跟直觉完全相反。
结论
只能说比官方词库好用,但是仍然需要大量手动调整。