模糊音开启时 QuanpinDictionary::query 对整个候选列表按 pinyin 字符串长度降序 排序(本意是压住模糊/前缀候选)。备选切分的 canonical 键带撇号且音节更多 (xi'e / ji'ang / you'di'an),字符串比主切分键(xie / jiang / you'dian)更长, 于是权重只有 6 的西鄂、23740 的激昂从保护位第 2 跳到第 1,顶掉 xie/jiang 的 首候选;xie 连模糊变体都没有,仅因排序无条件执行就被波及。 - 排序键改为候选覆盖的输入字母数(去掉撇号),与用户实际敲的长度对齐:备选 切分键与主键同层交给词频,模糊/前缀候选仍排在整串匹配之后。 - 备选切分保护位加词频门槛:备选最佳词权重达到主切分首位 1/100 以上才提升。 真歧义保留(xian -> 西安 55K 对 先 1.66M),罕见重码被拒(xie -> 西鄂 6、 jiang -> 激昂 23.7K、youdian -> 尤迪安 7)。 test_fuzzy_pinyin 补齐四个场景回归断言(夹具权重取自出货词库); test_quanpin_scheme 的保护位用例移到新契约:夹具备选词权重 1 -> 100, 让它留在门槛内继续覆盖「真歧义保留保护位」。
engine/tests
本目录产出两个独立二进制,共用 CMakeLists.txt 里的引擎源列表,互不依赖:
| 目标 | main | 用途 |
|---|---|---|
imetest |
src/test_pinyin.cpp |
引擎测试:全拼/双拼会话、退格、词典增删与查询时序;注册源只有 test_pinyin.cpp,CI 不执行,仅作本地跑测试的入口 |
eval_quanpin_autocorrect |
src/eval_quanpin_autocorrect.cpp |
全拼纠错离线评测:采样真实 msime.db 注错,测召回(R@1/R@3)、读音还原与温态延迟 |
构建
cmake --preset default
cmake --build build --config Release --target <imetest | eval_quanpin_autocorrect>
eval_quanpin_autocorrect 会把引擎源完整再编一遍(接近翻倍构建时间),日常改代码跑 imetest 即可,按需单独构建评测目标。
eval_quanpin_autocorrect:离线评测工具
这是评测工具,不是测试,永远进不了 CI:
- 依赖真实的
msime.db(用--db指定)和server/assets/tables资源目录(在仓库根目录运行,或--resource指定)。 - 不挂测试框架、不进断言,产出的是 markdown/CSV 报告,供人工对照基线。
- 存在的理由:纠错阈值、门逻辑(gate)或错误类型改动后,需要用同一把尺子复测。固定种子保证逐档样本一致,数字与历史基线可比。基线口径是「改动后各档不得低于基线值」的零回归门禁。
注错的变体生成规则(交换/邻键/漏字/多字、QWERTY 邻键表、长度与合法音节过滤)与 server/scripts/generate_quanpin_autocorrect.py 必须逐键一致——两侧漂移会让注错模型脱离纠错表的假设空间,基线失去可比性。改任一侧时在同一个提交里同步另一侧。
历史基线与采集笔记在归档任务目录:.trellis/tasks/archive/2026-09/09-12-quanpin-autocorrect-patent/eval/(阶段 0 基线)与 09-13-quanpin-insertion-autocorrect/eval/(insertion 上线前后对照)。
运行
# 仓库根目录执行;--model 可选 mixed|deletion|ambiguous|insertion
./engine/tests/build/bin/Release/eval_quanpin_autocorrect.exe `
--db <msime.db 路径> `
--samples 300 --seed 42 --model mixed `
--csv eval-mixed.csv > eval-mixed.md
参数细节与报告分节说明见 src/eval_quanpin_autocorrect.cpp 文件头注释。