词库与词频
管理方案词库与附加词库、维护用户词、调频与候选置顶,以及候选排序的基本原理
打过的字词、手动造的词、调频记录都属于用户数据,与方案自带的预置词库分层存放。设置工具的「词库」页面统一管理这些数据,所有修改即时生效。
词库管理界面
打开设置工具(Ctrl + Shift + ]),进入「词库」页。顶部「词库类型」下拉选择数据域——快捷短语(全局)或某个输入方案;下方子标签切换具体数据类别。
下拉里含全部已安装方案,不限于已启用的,也包括英文、快符这类特殊方案——它们各有独立的用户词库与词频记账,与主方案互不干扰。
选择方案后,可管理的数据类别随方案引擎类型变化:
| 方案类型 | 可管理数据 |
|---|---|
| 码表 | 用户词库、临时词库、词频、候选调整 |
| 拼音 | 用户词库、临时词库、词频 |
| 英文 0.114 新增 | 用户词库、词频、候选调整 |
| 混输 | 候选调整 |
快符这类特殊方案按码表处理,四类齐全。英文少一个「临时词库」,原因见下文。
通用操作:
- 搜索 —— 输入编码或词条即时过滤,编码支持中段匹配 0.113 新增:搜
ya也能搜到haoya,不必从头打起 - 排序 —— 点击表头按该列排序
- 分页 —— 用户词库、词频等数据量大时分页浏览
- 删除、清空等破坏性操作均有二次确认
快捷短语的管理见自定义短语,本页聚焦方案词库与词频。
拼音编码带音节空格 0.113 新增
拼音词库的编码在列表、搜索回显与「出码」按钮里一律显示成带音节空格的形式(ni hao 而不是 nihao),让词库真实的音节结构可见。存储侧不变,仍是扁平码,用户词库与临时词库都已统一。
由此多出一个用法:在编码框里手打空格即显式声明音节切分,优先于程序的自动推导——自定义切分或生僻音的词,打个空格就能把边界给准。搜索时带不带空格都能匹配。
直接打开到指定方案 0.113 新增
从输入法菜单选「词库管理」时,直接落在你当前正在用的那套方案上,不再停在「快捷短语」让你再选一次。
要跳得更准,可以用命令行参数指定方案与数据类型:
wind_setting.exe --page dict --schema wubi86 --type shadow也可以挂成短语,用编码一键直达:
cods = $CC("五笔候选调整", setting.open("dict", "--schema=wubi86 --type=shadow"))取值与降级规则见设置工具的命令行参数。
附加词库开关
方案除主词库外,还可随附若干附加词库(表情、符号、地名等)。它们与主词库共同参与候选排序,可按需独立开关,是在不修改方案文件的前提下调整候选范围的最常用入口。
在「方案」页选中方案后点「设置」,打开方案设置对话框,其中「附加词库」区块列出该方案的所有附加词库(主词库不在此列出)。每个条目一个开关,下方小字说明该词库的内容范围(由方案作者预设)。
五笔方案内置的附加词库:
| 词库 | 默认 | 说明 |
|---|---|---|
| 极点五笔主词库 | —— | 主词库,始终启用,不在附加词库列表中 |
| 扩展词库 | 启用 | 新词、网络用语、生僻词等非常用词条 |
| Emoji 表情 | 启用 | 按五笔编码检索 emoji;输入 emoj 可查看常用表情 |
| 行政区域 | 关闭 | 省市县区等地名词条,按需启用 |
即时生效,无需重启
保存后开关立即生效,停用的词库即从候选中移除。开关状态写入用户数据目录下的 schema_overrides\<方案ID>.toml,仅保存与方案默认值不同的项;升级安装包不会覆盖你的开关设置。
开关只记「开或关」,不冻结词库定义
覆盖层按词库 id 只接受启用状态一个字段,词库的路径、名称、顺序等始终以方案文件为准。因此方案升级后新增或调整过的词库都能正常透传,不会被你点过的开关冻结在旧版本。若想替换词库文件本身,见同结构覆盖机制。
用户词库
用户词库收录你手动添加的词,以及自动造词转正后的词条。
手动添加 —— 输入词条后可点击「出码」按钮自动生成编码,也可手动填写;支持设置权重。此外可编辑、删除、清空。
导入 / 导出 —— 导出对话框可勾选用户词库、临时词库、词频、候选调整,一并写进同一个 WindDict YAML(.wdict.yaml);导入支持 WindDict、Rime 词库、TSV 文本(按内容自动识别)。导入前先预览识别格式与新增 / 更新 / 跳过条数,再选择:
- 合并导入 —— 保留本地已有词,追加新词
- 替换导入 —— 清空当前方案词库后导入
文件格式规范、格式识别判据、跨引擎类型校验与合并去重键见导入与导出。
英文方案的用户词库 0.114 新增
英文方案有自己的用户词库,收专有名词、缩写、项目内部词汇这些词库里不会有的词。编码就是单词本身的小写——英文词库以小写码做大小写不敏感的前缀匹配,加 WindInput 后打 wind 就能出。
三种词加不进去,加词会提示无法计算编码:
- 带空格的(如
thank you)—— 带空格的编码会让前缀查询永远命中不到,加了等于没加 - 非 ASCII 的(如
café)—— 英文词库的编码空间就是 ASCII - 一个字母都没有的(如
123)—— 纯数字或纯符号不是英文词
英文没有临时词库:临时词库是自动造词的暂存区,而英文没有造词流程。因此英文方案在词库页只有「用户词库 / 词频 / 候选调整」三个子标签。
临时词库与自动造词
启用自动造词 / 自动学习后(码表与拼音各有独立开关),连续选字产生的新词组会先进入临时词库,记录使用次数,尚未进入正式用户词库。
在「临时词库」子标签中:
- 转正 —— 将临时词条转入正式用户词库
- 全部转正 —— 一键转正当前全部临时词条
- 删除 / 清空
词频与调频
清风的候选排序由两个彼此独立的维度决定:
- 权重(weight) —— 候选自带的静态排序分,来自词库或语言模型,是默认排序维度
- 词频(frequency) —— 你实际使用候选的统计(用了多少次、最近何时用),是完全独立的另一维度
关键在于:词频不加到 weight 上,而是排序阶段作为独立维度与权重组合,排序时绝不修改任何候选的 weight。
词频记录(count 使用次数与 last_used 最近使用时间)按「方案 + 编码 + 文本」存储在 userdata.redb。在「词频」子标签中可删除单条记录(该词回落原始排序)或清空列表。
记账用哪个编码:码表与拼音相反 (0.114)
这里的「编码」两类方案取法不同,是刻意的:
- 码表 —— 记你实际敲的输入码。
d/de/def是三个独立码位,各自的首选独立调整。这也是下文「首选保护按码长分级」成立的前提 - 拼音 / 英文 —— 记候选自身的编码。候选码恒是这个词完整的读音或拼写,打
d选了「东西」之后打dongxi也该受益;而且拼音下不能用输入缓冲——双拼的siyr与候选码siyuan、带分隔符的xi'an与xian都对不上
0.113 及以前码表侧也走候选码,导致在 de 下选中「有」(它带的是全码 def)后,打 d 时它也跟着前移。0.114 已按候选来源分流修正。
调频策略
码表方案的词频以基础排序为基底调整候选顺序,设置页「调频策略」三选一:
| 策略 | 设置页标签 | 语义 | 行为 |
|---|---|---|---|
top(默认) | 置顶 | 一次到顶 | 选一次立刻置于已用档之首(按最近使用时间排) |
step | 步进 | 逐次提升 | 按累计次数爬升,抗误选 |
position | 位次渐进 0.114 新增 | 位次减半 | 每用一次把该候选的位次前移一半,逐步靠前 |
top 与 step 的本质都是布尔的「用过优先」:只要用过一次就整体跳到未用过的那批之前,策略只决定已用过的内部怎么排。这在候选以精确匹配为主时没问题,但对前缀匹配为主的方案过于粗暴——英文几乎所有候选都是前缀匹配(打 hel 出 hello / help),选过一次就顶到最前,一次误选就很显眼。
position 没有这道台阶:位次连续表达强弱,用一次前移一半,第 8 位 → 4 → 2 → 1 → 0,四次到顶;久未使用则按半衰期回落。这也是英文与前缀匹配类方案的推荐策略。
提升只在档内发生
候选按来源分档(精确全码 / 简码 / 前缀补全…),position 的提升跨不出档位——前缀补全的词再怎么提升也排不到精确全码之前,「五笔优先」不受影响。
补全词参与调频 0.114 新增
设置页「补全词参与调频」控制前缀补全出来的候选是否参与位置提升,码表与拼音各有一项,三选一:
| 取值 | 设置页标签 | 语义 |
|---|---|---|
none | 不参与 | 前缀补全的候选一律不提升 |
single | 仅单字/单词 | 只提升「单个语义单元」的候选:一个汉字,或一个西文单词 |
all | 全部 | 全部提升 |
判据是语义单元数而不是字符数:「东西」是 2 个单元,hello 是 1 个,thank you 是 2 个。用字符数判会把英文整个挡死(hello 有 5 个字符),语义单元让同一条规则在中英文下都成立。
拼音出厂 single——只打半个音(如 d)时所有候选都是补全,让「的 / 得」这类单字正常上浮,但不让「东西」这种词组跑到单字前面。码表出厂 all,因为码表的前缀补全已由档位隔离、跨不到精确档之前,无需再收窄。
码表侧只在「位次渐进」下生效
top / step 走布尔「用过优先」,根本不读这一项,故设置页把码表的「补全词参与调频」挂在策略为「位次渐进」时才可用。拼音侧没有策略选择,只要开了调频就生效。
首选保护:把基础排序原本的前 N 个候选按原序回填到最前,即使某候选词频极高,不在保护集内也进不了前 N 位。仅码表 / 混输方案生效。
保护档位按本次输入的码长分级 0.113 新增,设置页对应四项:
| 设置项 | 配置键 | 出厂 | 说明 |
|---|---|---|---|
| 一简位保护前 N 项 | protect_top_n_len1 | 1 | 一简每个编码通常只有两个字,误选一次就会永久换掉首选,故默认保护 |
| 二简位保护前 N 项 | protect_top_n_len2 | 1 | 同上 |
| 三简位保护前 N 项 | protect_top_n_len3 | 0 | 三简的固定程度弱于一二简,默认不保护 |
| 全码位保护前 N 项 | protect_top_n | 0 | 4 码及以上,默认不保护,让调频正常起作用 |
保护名额只在精确匹配的候选里取,不足则少保护——名额多于精确候选时不会把前缀补全的长词一并钉死。分级的来龙去脉与老配置的迁移注意事项见方案与引擎配置 · 首选保护按码长分级。
码表的 top / step 下,「用过」是永久的,用一次即可稳定上浮。position 与拼音则带时间衰减,久未使用的记录会逐渐褪色、落回原始序。
拼音调频:位置提升模型 0.114 新增
0.113 及以前,拼音的「用过」是一道布尔闸门——只要用过就排到没用过的之前,无论权重差多少个数量级。于是打一个 d,只选过一次的「的样子」会把「的」挤下去。
0.114 起换成与码表 position 同一套位置提升模型:
目标位次 = 原始位次 / 2^有效使用次数
有效使用次数 = 累计次数 × 时间衰减要点:
- 提升速度与权重无关。位次天生是归一化的——第 2 位就是第 2 位,与它的绝对权重是 1.5 千万还是 2 万无关。所以不管候选之间差 486 倍还是 2 倍,第 2 位的候选都是用一次到首位
- 只在层内提升。整句候选与精确码短语恒占顶部、不参与提升;简拼、前缀补全、子短语等匹配层级也是硬约束,词频不得跨层提拔
- 同位次时用得多的在前
- 累计有效使用不足半次的记录不提升——避免一年前用过一次、已衰减到几乎为零的记录仍把第 2 位顶上首位
衰减仍由 half_life(半衰期,出厂 72 小时)控制。这也意味着用过 50 次的词,一个月不用也会完全失效——墙钟衰减的固有行为,30 天约等于 10 个半衰期。
base_scale 与 recency_peak 已不再生效
拼音词频不再打分,只调位次,schema.pinyin.frequency 下的 base_scale、recency_peak 两项因此改动无任何效果。保留是为了将来可能恢复打分模型,现阶段不必调。half_life 仍然生效。
调频开关
码表与拼音的词频调整各有独立开关,随附方案默认开启。开关与策略在「方案」页的对应引擎配置对话框中调整。
调整候选顺序
短语的 position
position 是短语专有字段,用户词条没有这个字段。它只在同一编码、且权重相同的多条短语之间决定先后,详见自定义短语 · position。
候选调整(置顶 / 隐藏)
「候选调整」控制特定候选的显示行为,不修改原始词库数据,规则以一层 shadow 规则持久化在 userdata.redb:
- 添加 —— 指定编码与词条,类型选固定位置(并填目标位置)或隐藏
- 编辑 —— 修改已有规则
- 撤销 —— 取消调整规则,恢复该候选的原始显示
- 清空 —— 移除全部规则
日常使用中也可直接在候选窗口用快捷键置顶或删除候选(见快捷键定制),产生的规则同样在此管理。
拼音方案下的置顶
拼音候选权重是百万级,单纯把用户词的 weight 调到几千不足以稳定压过常用拼音词。更可靠的做法是给它一个不易与自然词碰撞的精确编码(例如 4 字母的 cobd),让它只在该精确编码下出现。
词库缓存与重建
首次加载 .dict.yaml 时会解析成二进制缓存(.wdat),存放在 %LOCALAPPDATA%\WindInput\cache,之后直接内存映射读取,省掉重复解析。
缓存按内容指纹校验,不看修改时间。以下任一情况会自动重建,用户无需手动干预:
- 词库文件内容变化(哪怕只改一个字节)
- 缓存文件或其指纹文件缺失、损坏
- 拼音词库的
import_tables子表增删或改动 - 程序升级带来了解析语义变更
- 词库的
type在english与其他类型之间切换
因为指纹基于内容而非时间戳,用 scp 部署、从版本控制签出等刷新 mtime 的操作不会触发无谓的重建;把文件改回原样也能重新命中旧缓存。
改了 .dict.yaml 之后不需要做任何事
下次加载该词库时自动重建。改方案文件(.schema.toml)同样不需要——base_order、default_weight、base_sort 作用在查询期的排序器上,根本不进缓存。
需要强制全量重建时(例如怀疑缓存异常),用命令行:
wind_input schema rebuild它会清空整个缓存目录。输出里若提示「M 个仍被占用」,是文件还处于内存映射中,再执行一次即可清掉,不影响正确性。详见命令行工具。
只投放 .wdat 而无 .dict.yaml 的词库无法重建
词库也可以只分发编译好的 .wdat 而不带 yaml 源。这种词库直接映射加载、完全绕过指纹校验;一旦加载失败会明确报错,此时只能更换词库文件,改 yaml 没有意义(根本没有 yaml)。
删除操作不可恢复
删除与清空操作不可撤销。重要数据建议提前备份用户数据目录(%APPDATA%\WindInput\),或用设置工具一键备份,见备份与还原。