权重系统
清风输入法用 权重 (weight) 决定候选词在候选区中的排序位置。每个候选词背后都有一个数值, 数值越高越靠前。本专题集中说明权重的取值范围、来源、归一化方式, 以及在拼音 / 码表 / 混输三种模式下的相互关系。
范围与含义
权重统一使用 0 ~ 10000 的整数:
| 档位 | weight | 行为 |
|---|---|---|
| 必置顶 | 8000 ~ 10000 | 几乎所有候选之前 (个人签名、公司名、固定快捷命令等) |
| 高频备选 | 4000 ~ 7000 | 排在多数常用字之前 |
| 中位 (默认) | 1000 | 与中频候选自然混排 |
| 罕用 | 200 ~ 500 | 排在多数自然候选之后 |
| 禁用级 | 0 | 几乎只在精确编码且无竞争时出现 |
默认值
新建短语 / 用户词条时, 默认 weight = 1000, 与中频候选混排。如果希望强制置顶, 调到 8000 以上; 希望"只在精确编码下偶尔出现", 调到 500 以下。
显式 0 的特殊语义
weight: 0 跟"未填" (留空) 不一样:
| yaml 写法 | 实际权重 | 含义 |
|---|---|---|
| (未写 weight 字段) | 1000 | 默认中位, 与中频候选混排 |
weight: 0 | 0 | 显式禁用排序权重 (落到候选区最末) |
weight: 1000 | 1000 | 与默认值等价, 可以显式写出 |
显式 0 适合"必须收录但不希望干扰排序"的条目, 例如某些只在精确编码 + 无其它候选时才需要的备用项。
自动调频上限
用户词库的"用得越多排得越前"机制 (自动调频) 通过权重增量实现, 上限为 2000 —— 即使一条词被反复选中, 调频加成也不会让它超出这个值。这避免单个词把权重涨到 10000 级别压制其它候选。
手动设置的 weight 不受这个上限影响; 你写多少就是多少 (clamp 到 10000)。
权重的来源
不同层的候选词权重来自不同地方:
| 层 | 权重来源 |
|---|---|
| 系统码表 / 系统词库 | 词库内置词频 → 归一化映射到 0 ~ 10000 |
| 拼音引擎 | 语言模型概率 → 归一化映射到 0 ~ 10000 |
| 用户词库 | 用户编辑时设置, 默认 1000, 编辑器允许手动调整 |
| 快捷短语 | 用户编辑时设置, 默认 1000 |
| 自动造词 | 按使用次数动态调整 (详见自动造词专题) |
所有权重都落在同一个 0 ~ 10000 区间, 这样不同层之间可以直接对比、混排。
混输模式下的层级关系
清风输入法支持三种模式, 权重的"绝对值"在不同模式下的含义略有不同:
| 模式 | 比较关系 |
|---|---|
| 纯拼音 | 短语 / 用户词 / 系统词 weight 与拼音候选直接比较 |
| 纯码表 | 短语 / 用户词 / 码表候选直接比较 |
| 混输 (码表 + 拼音) | 码表层 (含短语 + 用户词库 + 系统码表) 整体 +10M boost, 全部压在拼音字之前 |
混输模式下的 +10M boost 是一种"层间隔离"机制 —— 它让用户输入码表编码时, 即便恰好与拼音冲突, 码表答案也能稳定靠前; 而拼音字仍可在码表无解时填补候选。
TIP
混输 boost 是层级机制, 不是用户能直接编辑的字段。用户调整的 weight 始终是 0 ~ 10000 那个值, 混输 boost 在排序阶段自动加上, 不会污染存储。
编辑入口
短语 / 用户词条
设置 → 词库 → 短语 (或某方案的用户词库) → 添加 / 编辑 对话框中, 权重 字段可以填 0 ~ 10000。
自动造词
设置 → 词库 → 方案 → 自动造词配置, 详见自动造词专题 (开发中)。
系统码表
只读, 不能在 UI 中调整。如要替换, 通过自定义码表方案实现。
调权建议
| 你的需求 | 建议 weight |
|---|---|
| 个人签名、邮箱地址等 "永远第一" | 9000 ~ 10000 |
| 个人常用短语 (公司名、地址等) | 4000 ~ 7000 |
| 命令直通车 - 希望明显置顶 | 8000 ~ 10000 |
| 命令直通车 - 默认 (允许与字混排) | 1000 |
| 命令直通车 - 不打扰自然候选 | 200 ~ 500 |
| 临时记录、希望偶尔出现的短语 | 200 ~ 500 |
同 weight 的二级排序 (position)
短语 / 用户词条还有一个 position 字段, 它不直接参与跨编码比较, 仅在同编码同 weight 的候选之间做二级排序 (tie-break):
| position | 含义 |
|---|---|
| 0 (默认 / 未手动调整) | 落在所有 position > 0 的条目之后 |
| 1, 2, 3, ... | 越小越靠前 (升序) |
TIP
设置 → 词库 中的"上移 / 下移 / 置顶"操作改的就是 position。这意味着你可以保留多个条目的 weight 都为 1000, 仅用 UI 上的箭头按钮调整组内顺序, 不需要逐个改 weight。
position 值不再被自动换算为 weight (历史版本曾有 10000 - position 的换算, 已废弃 — 那是导致旧 yaml 中 position: 1 被放大为 weight=9999 的根因)。
设计中的注意事项
短语层与码表层是分开的 tier
短语候选 (含 cmdbar 命令、字符组、模板短语) 都带有 IsPhrase 内部标记。智能过滤 (码表方案的 "生僻字过滤") 路径下:
- 短语永远保留, 不会被当作"无常用字编码"的生僻字过滤掉
- 短语也不计入"同编码下是否有常用字"的判定, 避免短语单独存在时让真正的码表生僻字被错误保留
这种隔离让用户配置短语 (例如 dz = 我的地址) 不会副作用地改变同编码的码表过滤行为。
字符组成员共享 group weight
$AA("标点", "、。·...") 中所有字符候选共享 group 自身的 weight; 同 group 内字符的相对顺序由 chars 数组顺序决定 (NaturalOrder 0/1/2...), 与 weight 无关。
拼音引擎的权重重算
拼音引擎对每个候选会做 rimeScore 重算 (按语言模型概率 / 字数 / 覆盖率综合打分), 最终 weight 可能远超原始词库 weight。这是引擎内部行为, 不影响你在短语 / 用户词库里设置的 weight 数值 —— 但意味着拼音方案下"weight=1000 的短语"和"系统拼音词"实际比较时, 拼音词可能拿到几百万级 weight, 不要据此推断 weight 数值的绝对优先级。
要让短语在拼音方案下稳定置顶, 推荐 weight ≥ 8000, 并配合查询路径 (例如 cobd 这种 4 字母编码本身在拼音里很难撞到自然词)。
混输 boost 不是用户字段
如前所述, 混输模式的 +10M boost 是引擎在排序阶段自动加的, 不写入存储。用户在设置里看到的 weight 永远是 0~10000 那个值。
相关参考
- 命令直通车 — 命令直通车的权重选择
- 词库管理 (设置 → 词库)
