主题
⑭ 短语 lemma 折叠 FP 治理 — v23 track-② reseed 交接(RVH → RB)
方向:RVH 新会话(gate-A 第二前置,与 track-① surface-陷阱 retag 平行)→ 本文 RVH 完成回执 → RB 新会话据此
/vocab-reseed。与 track-① 合并成同一次 v23 reseed(同版本号、同最终 DB)。 会话边界:生成属 RVH(已完成);RB 侧不碰预装库生成(红线 #10)。 创建:2026-06-25(RVH 会话产出) 契约真相源:~/reading-browser/docs/plans/archive/phrase-auto-highlight-thinslice-plan.md§gate-A 实测(lemma 折叠 2 实例)+~/reading-browser/docs/plans/backlog.md「🟠 RVH 短语/习语归一噪声治理」。 track-① 回执 =~/reading-browser/docs/cross-end/15-rb-phrase-tiering-reseed-confirmation.md§11(surface 陷阱,always 2791,SHA81f4a06d…=中间态)。
0. ⚠️ 关键结论 —— 任务「改 lemmatizer 资产 + 重算 PK」前提被实测推翻
RB gate-A 把 in a fix("in a fixed proportion")/ all right reserve("All rights reserved")诊断为 「lemma 过度折叠」,原计划改 surface_to_base 资产 + 全量重算 vocabulary.word PK + byte-equal lemma 表 reseed(schema-ish)。 RVH pipeline 端实测推翻:
fixed→fix/rights→right/reserved→reserve是合法归一,不是资产 bug(≠ v18 修的picked→pic/passed→pas/trying→trie真错映射,那些早已修)。- 删 Layer 1 映射也无效:lemmatizer 4 层架构里 Layer 3 后缀规则(
-ed/-s裁剥 +base_forms裁决)会重新推导出同 fold。 实测(bin/phase0_normalize.dart,临时删映射跑):fixed→fix(suffix-validated)、rights→right(suffix-validated)→ "in a fixed proportion" 仍归一成 "in a fix proportion",FP 不消。 - 真要阻断须从
base_forms删fix/right(毁掉「fix」「right」这两个词本身)或硬加fixed→fixedoverride(全局 verb-past「fixed」不再折到「fix」,vocab 高亮召回受损)→ 净负收益。 - 结论:本轮零 lemmatizer 资产改动、零 PK 重算、零 byte-equal lemma 表变更。 正解 = 与 track-① 同款 additive 三档 retag/prune(
idiomaticity:<tier>tag 值 + bad_entry 物理 skip)。
1. 两条修复
| 短语(归一 PK) | display / canonical_surface | 处理 | 理由 |
|---|---|---|---|
in a fix | "in a fix" | always → context | 真习语,但 PK「in a fix」命中 "in a fixed proportion"(fixed→fix 合法 fold)。降 context → 不自动高亮;§9 深度模式可按句救回困境/财经义。 |
all right reserve | "all rights reserved" | bad_entry 物理 prune(不入库) | 坏词条:法律 boilerplate "All rights reserved",非习语。LLM bad_entry rule 只抓 word-salad(这是可识别英语,judge 不会判 bad)→ 必须确定性锚定 prune。一并消除 rights→right+reserved→reserve 命中。 |
2. durability —— lemma-fold 盲区修补(防下次 reseed 打回)
tools/vocabulary_builder_v3/lib/idiomaticity_generator.dart 的 _classifyPrompt rule 6 + _challengePrompt CRUCIAL 段, 在 track-① 的 (a) FRAGMENT + (b) HOMONYM 之外新增 (c) LEMMA-FOLD 子类:明确告诉 judge「matcher 逐 token lemmatize, 习语 PK 会命中其内容词的所有屈折字面形」(in a fix←in a fixed/fixes/fixing;all right reserve←all rights reserved)。 → 将来 from-scratch classify 时 in a fix 会被 LLM 自动降 context。all right reserve 非 word-salad,仍靠确定性锚点 prune。
⚠️ 本轮未重跑 LLM rescan(合并入 track-① 已跑完输出,避免非确定性重判 + 省 token);prompt 修补是前向保险。
2.1 确定性覆盖层(2026-06-26 durability 硬化,supersede 一次性脚本作为耐久记录)
track-② 的 2 个确定性决策(in a fix→context retag、all right reserve→bad_entry prune)原只写在一次性 bin/apply_track2_lemma_anchors_v23.dart,没接进 build_all——正常重建(复用提交进仓库的 phrase_idiomaticity.json 缓存)不丢,但缓存若从空重生成(--classify-idiomaticity)则这些决策不在重生成路径里。已提取进提交进仓库的声明式 tools/vocabulary_builder_v3/data/phrase_idiomaticity_overrides.json(与 track-① 的 6 retag + 19 锚点合并成单一完整记录;prune 段固化坏词条)。generate_db overlay 与 classify_idiomaticity 都在读缓存后幂等套用该文件 → 任何重建路径(含从空重判)都逐字节复现。实证:对当前合并缓存套用 = applied 0(忠实重构);人为 corrupt 全部 27 key 后套用 = 全部重建。apply_track2_lemma_anchors_v23.dart 自此降为历史脚本(产出已固化进 overrides)。
3. 合并后 v23 final(supersede track-① 中间态 §11.0)
| 项 | track-① 中间态(doc 15 §11.0) | 两轨合并 final |
|---|---|---|
| 总词数 | 18899(0 移除) | 18898(−1:all right reserve prune) |
| always / context / literal | 2791 / 3449 / 371 | 2789 / 3450 / 371 |
| bad_entry | 0 | 1 |
reading_vocab.db SHA256 | 81f4a06d…(弃) | 747f4732adab8ec9ecfe181e73316541949c5defdfb30789524828add3113913 |
lemma_surface_to_base / lemma_base_forms | 140370 / 101646 | 140370 / 101646(不变,红线 #5e) |
surface_to_base.json / base_forms.json SHA | ca75b179… / 3094c829… | 不变(红线 #5e 锚点照旧) |
加性证明(vs v22 baseline,sqlite3 row-content diff,排除 created_at/updated_at/synced_at): surviving 行 word_tags 变 250(全 always→context:249 track-① + 1 in a fix);word set −1(prune all right reserve); 0 新增;非 idiomaticity tag / 其它列 0 触碰;lemma 表不变。
4. RVH 侧改动清单(本次 commit)
- 新增:
tools/vocabulary_builder_v3/bin/apply_track2_lemma_anchors_v23.dart(确定性 demote/prune-only,不走 LLM)。 - 改动:
tools/vocabulary_builder_v3/lib/idiomaticity_generator.dart(双 prompt 加 (c) LEMMA-FOLD 子类)、tools/vocabulary_builder_v3/data/phrase_idiomaticity.json(仅 2 条:+1 demote +1 bad_entry,diff 实证只动这 2 key)、assets/databases/reading_vocab.db(整包重导出,合并 track-① + track-②)。 - 不改
assets/nlp/surface_to_base.json/base_forms.json(红线 #5e SHA 不变); app_database.dart 版本(22→23)由 track-① 改,本轮不动。 - 与 track-① 改动(
bin/rescan_always_idiomaticity_v23.dart等)合并进同一个 v23 commit。
5. RB 行动项(合并 v23)
/vocab-reseed:整包覆盖src-tauri/assets/reading_vocab.db,用 新 SHA747f4732adab8ec9ecfe181e73316541949c5defdfb30789524828add3113913校验完整性 (不是 doc 15 §11.0/§11.6 的81f4a06d…——那是 track-① 中间态,已被本合并值取代)+ bumpVOCABULARY_SEED_VERSION(建议rvh-18898-v23-idiomaticity-retag-2-2026-06-25,注意词数 18898)。- 1 个 prune 需删既存行:
all right reserve(归一 PK)从 v23 起不在预装库。RB reseed UPSERT 不自动删孤行 → 须沿 v18 phrase-asset-fix 的 prune 自愈机制删该残留行(同docs/cross-end/09「48 旧 PK 残留 prune」先例,本次仅 1 行)。 否则旧高亮 "All rights reserved" 仍误命中。 - 消费侧零代码改动——matcher
substr(value,14)+ content-script filter=== 'always'自 v21 就位;in a fix移出 always 自动停高亮。 - 验证:冷重启 → 三档
always 2789 / context 3450 / literal 371、总词数 18898 → gate-A 复测in a fix("in a fixed proportion")/all rights reserved不再误高亮 + track-① 的 3 个 surface 陷阱也清。两轨齐 → 评估phrase_auto_highlight默认 on。 - sync 脚本断言:
lemma_*表行数不变(140370/101646)→scripts/sync-rvh-vocabulary.sh4 表白名单期望行数无需改。 vocabulary 总词数若有断言:18899→18898。短语属预装库、不进 Supabase 同步矩阵 → 同步矩阵不变。 - Supabase 缓冲池:零 PK 重算(仅 1 prune、0 rename、
in a fixPK 不变)→ vocabulary 共享缓冲池无需 PK 核对;all right reserve即便曾被缓存,post-reseed 双端都无此 PK,benign(红线 #5b/#9 不触发)。
6. 关系图
gate-A 实测(28% FP,5 硬 FP)
├─ 3 surface 陷阱 → track-①(doc 15 §11,RVH rescan_v23,LLM demote)→ always 2791
└─ 2 lemma 折叠 → track-②(本文,apply_track2_lemma_anchors_v23,确定性)→ −2 always + 1 prune
↓ 合并
v23 final:always 2789 / 总 18898 / SHA 747f4732
↓
RB 一次 /vocab-reseed(按本文 §5)→ gate-A 复测两轨齐7. 收口确认 —— 「fix lemmatizer over-folding bugs」分支结案:无资产改动,747f4732 为 final(2026-06-26)
本节回应 track-① 协调文件
temp/session-status-v23-phrase-idiomaticity-for-lemmatizer-session.md§3/§4 的关键分支:「你若 NOT 改任何短语归一输出 → overrides/缓存键不动,v23 成果原样有效」。
「lemmatizer over-folding 修复」任务经 RVH pipeline 端实测结案为「不需要也不应改 lemmatizer」(根因见 §0):
- 零 lemmatizer 资产改动:
surface_to_base.json/base_forms.jsonSHA 不变(ca75b179…/3094c829…); db 内lemma_surface_to_base/lemma_base_forms未动(140370 / 101646,仍与 RB byte-equal,红线 #5e 不触发)。 - 5 个「过度折叠产物」override 键全部保持原样、不 re-key(
for the bird/spill the bean/anything go/in a fix/all right reserve)——它们是合法归一 PK(屈折→基形是正确 lemma 且被 Layer 3 后缀规则重导, 改资产无效或伤全局 vocab 召回)。故 generate_db 套 overrides =applied 0(无 missing),短语 overlay 不重 key。 747f4732…3113913即最终 SHA,不 supersede:本分支未 re-export DB。doc 15 §11 / 本文 §3/§5 的所有数字 (always 2789 / context 3450 / literal 371 / 词数 18898 / lemma 140370·101646 / prune 1=all right reserve,PK 不变)全部成立。
给 RB 的统一结论(合并 v23,已由 RVH 032fc55 + RB 3ec731f 落地):
| 问 | 答 |
|---|---|
| 最终合并 SHA | 747f4732adab8ec9ecfe181e73316541949c5defdfb30789524828add3113913(无后续 supersede) |
| 三档 / 词数 | always 2789 / context 3450 / literal 371;18898 |
lemma_* 表行数 / SHA | 140370 / 101646,byte-equal 不变 → RB reseed 无需连 lemma 表整包覆盖 |
| prune 行清单 | 仅 all right reserve(归一 PK 不变,沿 v18 prune 自愈机制删 1 行) |
| supersede 了哪些数字 | 无——doc 15 §11 / doc 14 数字均为 final |
| RB 还需等后续 SHA 吗 | 否——lemmatizer 分支已结案,直接按 doc 15 §11 / 本文 §5 reseed |