词库与模型:万象的基础数据体系
输入体验不仅取决于界面和功能,词库质量、词频分布以及语言模型同样决定了候选是否准确、长句是否自然。
从“打字”到“选字”:词库质量带来的长期影响
输入法使用过程中,真正影响连续输入体验的,往往不是某一次选错字,而是大量重复出现的小问题:词库中没有目标词、候选排序不合理、需要频繁翻页,或者不得不拆字重新输入。
假设每天遇到 20 个因为词库覆盖不足而无法直接输入的词,通常需要:
-
使用
PageDown等按键翻页查找候选。 -
将原本完整的词拆成多个字或词重新输入。
-
对缺失词进行额外造词。
-
如果这种情况长期存在,以每天 20 次计算,20 年累计就是 146000 次输入中断。
单次操作看起来并不明显,但长期积累后,会带来大量额外按键和候选选择操作。
因此,词库建设的目标并不是简单增加词条数量,而是尽可能让常见表达能够直接进入合理的候选位置,减少翻页、拆词和重复造词。
万象拼音的词库与模型也主要围绕这一目标进行构建:提高常用词覆盖率,同时控制低质量词条对候选排序的影响。
为什么需要重新整理词库?
很多 Rime 词库来源于多个公开词表的合并。扩大覆盖范围比较容易,但如果缺少进一步整理,也可能同时引入错音、错字、过时词和大量低频词,从而影响正常候选排序。
万象在词库处理中主要关注以下几个方面。
1. 词库清理与校正
万象并不以单纯扩大词条数量作为目标,而是对词库内容进行筛查、整理和修正:
-
清理低质量词条:减少极低频、过时或实际使用价值较低的词条对候选排序的干扰。
-
校正字词与读音:针对公开词库中存在的错误拼音、错误用字等问题进行修正,提高基础数据的一致性。
-
常用表达校正:针对“的、地、得”“在、再”等容易出现错误组合的场景,对词条和读音进行针对性整理,例如“渐渐地
de”。
词库清理的目的不是追求词条越少越好,而是在保证覆盖范围的同时,使真正高频、常用的内容获得更合理的候选位置。
2. 声调与辅助码数据
万象词库除基础拼音外,还包含声调及辅助码相关信息,使这些数据可以直接参与候选过滤。
-
声调筛选:在同音候选较多时,可以继续输入声调缩小候选范围。
-
辅助码筛选:词库中的辅助码信息可以直接用于候选过滤,使拼音负责确定读音范围,辅助码进一步区分同音字词。
-
兼容多种拼音方案:在词库数据基础上,可以配合全拼、自然码、小鹤等不同输入方案使用,并继续使用统一的词库与辅助码数据。
这种方式使声调和辅助码成为词库数据本身的一部分,而不是完全依赖后续附加的候选处理。
3. 系统词库与用户词库分离
系统词库与用户词库(UserDB)承担不同职责:
-
系统词库负责提供稳定的基础词汇、词频和语言数据。
-
用户词库用于记录个人输入过程中产生的人名、术语、专有名词及其他个性化内容。
两者相互独立,因此用户可以单独备份、同步、清理或迁移 UserDB,而不会改变系统基础词库。
配合按需造词、无感造词以及相关 Lua 处理,可以进一步控制进入 UserDB 的内容,减少无意义的临时组合长期积累。
语法模型:Grammar
仅有词库还不足以解决长句输入问题。
单个词可以依靠词频进行排序,但当多个词组合成一句话时,还需要根据上下文判断不同组合之间的合理程度。万象通过 Rime 的 Grammar 机制加载 wanxiang-lts-zh-hans 语法模型,用于参与长句候选计算。
可以简单理解为:
词库决定“有哪些词可以选”,Grammar 则进一步参与判断“这些词怎样组合更合理”。
当输入连续拼音时,模型会根据不同词语组合的概率和相关参数,对候选路径进行评分,从而影响最终长句的组合与排序。
Grammar 核心参数
万象配置中包含以下 Grammar 参数:
grammar:
language: wanxiang-lts-zh-hans
collocation_max_length: 8
collocation_min_length: 2
collocation_penalty: -15
non_collocation_penalty: -5
weak_collocation_penalty: -100
rear_penalty: -10
这些参数共同影响语言模型参与候选计算时的范围和评分方式。
language: wanxiang-lts-zh-hans
指定当前使用的语法模型。万象使用 wanxiang-lts-zh-hans 作为对应的简体中文 Grammar 模型。
collocation_max_length: 8
设置参与搭配计算时允许使用的最大长度范围。
较大的上下文范围有助于模型在连续输入中结合更多前后信息进行判断,但最终结果仍然取决于模型数据、词库以及其他评分参数的共同作用。
collocation_min_length: 2
设置参与搭配判断的最小长度,用于限制过短组合进入相应的搭配计算。
collocation_penalty: -15
用于调整已识别搭配在整体候选评分中的权重,使语言模型的搭配结果与基础词频之间保持适当平衡。
non_collocation_penalty: -5
用于处理未形成明确搭配关系的组合,对这类路径施加相应的评分调整。
weak_collocation_penalty: -100
对弱搭配关系设置较大的负向权重。
其作用是降低低相关度组合在候选中的竞争力,减少仅凭局部词频拼接、但整体搭配较弱的结果进入前列。
rear_penalty: -10
用于调整候选末端相关路径的评分,对长句尾部的组合结果产生一定影响。
这些参数并不是独立决定候选结果,而是与词典词频、分词结果、模型数据以及 Rime 本身的候选计算共同作用。
词库与模型之间的关系
在实际输入过程中,词库和 Grammar 并不是两个完全独立的模块。
词库首先提供字词及其基础权重,Grammar 再根据上下文关系参与候选组合评分。因此:
-
词库覆盖不足时,语言模型也无法生成不存在的目标词;
-
词库中低质量词条过多时,也可能增加不必要的候选路径;
-
只有词库而没有上下文模型,长句更容易依赖单个词的局部词频进行组合;
-
合理的词库、词频与 Grammar 参数配合,才能同时兼顾单词命中和连续语句输入。
因此,万象在数据建设上并不单纯追求“词条数量”,而更关注词库质量、词频排序、辅助信息与语言模型之间的配合。
结语
万象的词库和语言模型属于整个输入方案的基础数据层。
它们需要持续维护,而不是一次导入大量词条后就不再调整。随着词汇使用习惯、现代汉语表达以及模型数据不断变化,词条收录、读音校正、词频和模型参数也需要持续更新。
相比单纯扩大词库规模,更重要的是让常用内容能够稳定进入合理的候选位置,让低质量数据尽量少干扰正常输入,并通过 Grammar 改善连续语句的组合与排序。