Files
rime-context-filter/README.md
sakuradairong 0196b203ef docs: 更新 README 反映 v5.1 变更
- 修复 Linux 数据路径说明(XDG_DATA_HOME 优先 + fallback)
- UTF-8 安全截取说明
- 新增开发/测试/CI 章节
- 版本历史更新至 v5.1
2026-06-10 16:32:42 +08:00

6.5 KiB
Raw Blame History

rime-context-filter

RIME 输入法上下文调频过滤器。根据已上屏的前文自动调整候选词顺序,越用越准。

CI

原理

监听每次上屏内容,自动记录「前文 → 当前选的词」的共现关系。之后遇到同样前文时,将对应的候选词提权置顶。

  • 纯学习:零硬编码规则,完全从你的输入习惯中学习
  • 跨会话:学习数据持久化到本地文件,重启不丢
  • 轻量:热路径无文件 I/O不卡输入
  • 跨平台:自动适配 Windows / macOS / Linux 路径
  • 安全:数据文件在沙箱环境中加载,防止恶意代码执行
  • 自动遗忘:内置衰减机制,长期不用的搭配逐渐消退

效果

输入 第一次 多次选择后
接下来的 + renwu 人物 1. 任务 2. 人物 任务 1. 任务 2. 人物
那个 + renwu 任务 1. 人物 2. 任务 人物 1. 人物 2. 任务
完成 + renwu 任务 自动置顶

所有搭配都是你日常打字中自然学会的。

安装

1. 放入 Lua 文件

rime_context_filter.lua 复制到 RIME 用户目录的 lua/ 下:

平台 路径
Windows (Weasel) %APPDATA%\Rime\lua\
macOS (Squirrel) ~/Library/Rime/lua/
Linux (ibus/fcitx5) ~/.config/ibus/rime/lua/~/.local/share/fcitx5/rime/lua/
Android (Trime) /storage/emulated/0/rime/lua/

2. 激活过滤器

在你想启用的输入方案 .custom.yamlpatch: 下追加到 engine/filters 列表末尾。

雾凇拼音 (rime_ice)——编辑 rime_ice.custom.yaml

patch:
  "engine/filters/@after 6":
    lua_filter@*rime_context_filter

朙月拼音——编辑 luna_pinyin.custom.yaml

patch:
  "engine/filters/+":
    - lua_filter@*rime_context_filter

3. 重新部署

  • Windows: 右键托盘图标 → 重新部署
  • macOS: 点击菜单栏鼠须管图标 → 重新部署
  • Linux: ibus-daemon -drx 或重启 fcitx5
  • Android: 重新部署 Trime

配置

可选参数,写入方案的 context_filter: 节:

context_filter:
  save_interval: 30      # 每 N 次提交存一次盘(默认 30增加可减少写入频率
  data_path: ""           # 自定义数据文件路径,为空则自动检测(见下方)
  decay_enabled: true     # 是否启用衰减遗忘机制(默认 true
  decay_rate: 0.95        # 每次保存时的衰减因子(默认 0.95

参数说明

参数 类型 默认值 说明
save_interval 整数 30 每 N 次提交写一次磁盘。可设为 0 强制每次提交都存盘
data_path 字符串 自动 自定义数据文件完整路径。设置后覆盖自动检测结果
decay_enabled 布尔 true 启用衰减后,旧数据的权重随时间逐渐降低
decay_rate 浮点数 0.95 每次保存时所有计数的乘数因子0 < rate < 1

衰减行为

衰减机制防止数据无限增长,让长期不用的搭配逐渐遗忘。decay_rate = 0.95 时:

初始计数 10 次保存后 20 次保存后 40 次保存后 消亡阈值 (≈1.1)
1 已消亡 1 次
3 1.79 1.07 → 已消亡 ~20 次
5 2.99 1.79 0.64 → 已消亡 ~32 次
10 5.99 3.58 2.15 ~44 次
50 29.9 17.9 6.43 ~76 次

频率越高的搭配保留越久,偶然一次的搭配较快消亡,保持数据库精炼。

数据文件

学习数据存储在 RIME 用户目录下的 context_learned.data,路径根据平台自动检测:

平台 默认路径
Windows %APPDATA%\Rime\context_learned.data
macOS ~/Library/Rime/context_learned.data
Linux $XDG_DATA_HOME/rime/context_learned.datafallback ~/.local/share/rime/context_learned.data

也可以配置 data_path 指定任意路径。

文件格式

格式为 Lua 表字面量,由 Lua VM 原生加载,无需逐行解析。手动编辑此文件可以增删规则或重置学习数据。

return {
  ["接下来的"]={["任务"]=8,["工作"]=3},
  ["完成"]={["任务"]=5},
  ["那个"]={["人物"]=4},
}

安全性

数据文件在沙箱环境中加载。恶意构造的数据文件无法访问 osiostring 等系统库,仅允许纯数据(表、数字、字符串)返回。兼容 Lua 5.1 / LuaJIT自动降级为无沙箱模式并输出警告

工作原理

上下文评分

commit_notifier
  ├─ 更新内存 (env.learned)
  ├─ 写入待刷缓冲
  └─ 更新上下文窗口

每次录入时,过滤器从当前上下文窗口提取 4 种 key 进行加权查询。截取 key 时按 UTF-8 字符边界操作,避免中英混输时的乱码问题。

Key 权重 示例
精确前文 1.0 "接下来的"
末尾 2 字 0.5 "来的"(前文 "接下来的" 时)
末尾 1 字 0.25 "的"
双词组合 0.4 "接下来的任务"

四个 key 的得分加权求和,总分 ≥ 2.0 才参与重排(约 2-3 次选择后生效)。

持久化

数据以 Lua 源码格式 存储。加载时通过 load() 由 Lua VM 一次性编译执行,不用逐行 regex 解析。写入使用原子重写(.tmp + rename),防止文件损坏。

衰减 / 遗忘

每次保存时对全部计数乘以 decay_rate(默认 0.95),计数降至 1.1 以下的条目自动清除。频率越高的搭配保留越久,偶然一次的搭配较快消亡。

开发

运行测试

需要 Lua 5.3+ 或 LuaJIT

lua test_rime_context_filter.lua

测试覆盖:评分聚合、序列化/反序列化往返、衰减计算、UTF-8 安全截取、表格复用。

CI

每次推送自动运行:

  • luacheck 静态分析
  • 跨 Lua 5.3 / LuaJIT / Lua 5.1 三平台单元测试

版本历史

  • v5.1 — 修复 Linux 数据路径XDG_DATA_HOME 优先、UTF-8 按字符截取、Lua 5.3 序列化兼容、scores 表复用减 GC、新增 40 个单元测试 + CI
  • v5 — 跨平台路径自动检测、衰减遗忘机制、沙箱安全加载、热路径 GC 优化
  • v4 — Lua 源码持久化格式(移除 JSON 依赖)
  • v3 — 增量缓冲 + 批量写入
  • v2 — 上下文窗口 + 4 种 key 加权查询
  • v1 — 初版

License

MIT