主题
预装短语库 reseed 交接(RVH → RB)
RVH Phase 1 完成,交 RB 启动 Phase 2。 对应 RB 简报:
~/reading-browser/docs/cross-end/06-rvh-phrase-library-brief.mdRVH 计划:rvh/docs/plans/phrase-library-rvh-phase1-plan.md日期:2026-06-07
1. 发布物
| 项 | 值 |
|---|---|
| DB 文件 | assets/databases/reading_vocab.db |
| SHA256 | 22ee5f1f0a9ebd850c68a3d0e29d51847e0db5f55b51edfbe1bb9ed448c070fd |
_preinstalledVocabVersion | 16 → 17 |
| schema | 不变(短语复用现有列,无 schema 变更) |
| 词库总量 | 12291 → 18899(+6611 短语,3 条合并入既有行) |
⚠️ DB 文件 sha 每 build 变(created_at 时间戳);RB reseed 比 pos_definitions 内容,文件 sha 仅供完整性校验。
2. 交接回填表(对应简报 §4.1)
| 项 | 目标 | RVH 实际值 | ☐ |
|---|---|---|---|
| phrasal_verb 条数 | ~1,000–2,000 | 1861 | ✅ |
| idiom 条数 | ~500–1,000 | 5336(见下注) | ⚠️ |
| 含 gloss + 中文 translation 占比 | 100% | 100% | ✅ |
含 primary_cefr_level 占比 | 尽量高 | 0%(有意不产,见 §4) | ℹ️ |
含 frequency_rank 占比 | 尽量高 | 99% | ✅ |
word 经 lemmatizer 归一 | 100% | 100%(normalizePhrase,逐 token) | ✅ |
| 仅存连续基础形(无屈折 / 无可分离) | 是 | 是 | ✅ |
| byte-equal 整包覆盖 | 是 | 是(确定性双跑校验通过) | ✅ |
_preinstalledVocabVersion bump | 是 | 17 | ✅ |
| basic(默认排除)条数 | (新增项,见 §3) | 400 | ✅ |
idiom 超目标说明:LLM 按 commonness 评分后,库纳入阈值取 commonness ≤ 3(丢 c4-5 生僻尾巴 2607 条)。idiom 的 c2-3「真常用」比简报预估多,故 5336。降噪由 RB 在高亮层用 frequency_rank 阈值控制(见 §3),库大小与高亮密度解耦——这正是简报「frequency_rank 做降噪阈值」的设计。RB 可只高亮 frequency_rank ≤ 4000(commonness ≤ 2)起步,按体验调。
3. 字段约定(RB 消费要点)
每条短语 = 一行 vocabulary:
word:归一后基础形短语(逐 token lemmatize + 单空格 + NFC)。word_tags:JSON 数组,含phrasal_verb或idiom(互不互斥,可并存)。basictag(超出原简报的新增契约):标记「太简单=系统默认排除」的短语(如go on/give up/find out)。共 400 条。语义见 §3.1。pos_definitions:单 POS key"phrase"→definitions[],每条{gloss, translations:{zh}}。覆盖度驱动义项:idiom 多为 1 条,常用 PV 1–5 条(如get up5 义:起床/站起/攀登/增强/组织)。frequency_rank:commonness×2000 代理(commonness 1→2000 … 3→6000)。越小越常用,与单词 rank 同向。RB 据此降噪。primary_cefr_level:NULL(短语不产 CEFR)。emoji/ipa/etymology/word_forms:NULL。
3.1 basic = 系统默认排除短语(决定 A,需 RB 协调)
「太简单」短语保留入库但标 basic,作为系统默认排除集。落地复用 RVH/RB 已有的 v42 recommended_excluded_words 机制(Supabase 公共表 → 确定性 id merge 进 per-user excluded_words → 同步 + 统一 UI):
- RVH 已产 artifact:
tools/vocabulary_builder_v3/output/recommended_excluded_phrases.jsonl(400 条,{word(归一), sort_order, tags})。 - 需 RB/Supabase 协调动作:把这 400 条短语加进 Supabase 公共表
recommended_excluded_words(word用 artifact 里的归一形,保证与 vocabulary.word 同归一 → merge 命中)。 - ⚠️ 这是对简报 §5「无 Supabase 动作」的有意偏离——经双方确认采用(复用现成排除机制,零新增逻辑,UX 与排除词统一)。
recommended_excluded_words是全端共享表,策展归属/时机请 RB 确认。 - RB 运行时:
有效排除 = (在用户 excluded_words) OR (该短语 basic 且未被用户捞回);basic 短语默认不高亮。
4. 归一一致性(红线 #9)—— 20 条样例(对应简报 §4.2)
RB Phase 2 须实现逐字符等价的 normalize_phrase(split_whitespace → lemmatize 每 token → join " " → NFC),用同输入复算确认 diff 为空。完整回归集:test/data/phrase-normalize-regression.txt(35 条)+ RVH 输出 tools/vocabulary_builder_v3/output/rvh-phrase-normalize.csv。
| # | 原始短语 | 入库 word(归一后) | 说明 |
|---|---|---|---|
| 1 | Looking Into | look into | 大小写 + 屈折 |
| 2 | LOOKS INTO | look into | 全大写 |
| 3 | looked into | look into | 屈折 |
| 4 | gives up | give up | 屈折 |
| 5 | gave up | give up | 不规则过去式 |
| 6 | giving up | give up | -ing |
| 7 | took off | take off | 不规则 |
| 8 | taking off | take off | -ing |
| 9 | running out | run out | 双写 -ing |
| 10 | look forward to | look forward to | 3-token |
| 11 | looking forward to | look forward to | 3-token 屈折 |
| 12 | put up with | put up with | 3-token |
| 13 | came up with | come up with | 3-token 不规则 |
| 14 | runs out of | run out of | 3-token 屈折 |
| 15 | break the ice | break the ice | idiom |
| 16 | breaks the ice | break the ice | idiom 屈折 |
| 17 | piece of cake | piece of cake | idiom(注:Kaikki 词条无冠词 a) |
| 18 | a dime a dozen | a dime a dozen | idiom |
| 19 | raining cats and dogs | rain cat and dog | ⚠️ 逐 token lemmatize 致字面变形,跨端一致即可 |
| 20 | déjà vu | déjà vu | Unicode NFC byte-equal |
⚠️ 已知 lemmatizer 资产瑕疵:surface_to_base.json(双端共享)有 3 处错误映射 picked→pic / passed→pas / trying→trie(tried→try 却对)。表现:picked up → pic up(不等于库里 pick up)。跨端一致性不破(双端同资产同输出,diff 仍空),仅影响 pick/pass/try 系短语的屈折匹配召回。属红线 #5e(资产双端原子提交)独立修,不在本次。详见 RVH memory reference_lemmatizer_asset_bugs。
5. RB 待办(Phase 2 协调清单)
/vocab-reseed:整包覆盖src-tauri/assets/reading_vocab.db+ bumpVOCABULARY_SEED_VERSION+ 校验。- 实现逐字符等价
normalize_phrase,跑test/data/phrase-normalize-regression.txtdiff RVH 的rvh-phrase-normalize.csv,确认为空。 get_phrases_for_matching:查word_tags含 phrasal_verb/idiom 的短语 + frequency_rank(降噪)+ basic(默认排除)。- 决定 A:把
recommended_excluded_phrases.jsonl(400 条)填入 Supabaserecommended_excluded_words公共表(协调策展归属;这是对简报 §5 的有意偏离)。 - 高亮降噪起步阈值建议:只高亮
frequency_rank ≤ 4000(commonness ≤ 2)且非 basic。
6. 验收 SQL(RB reseed 后)
sql
-- 短语条数(注意 NULL word_tags 行会让 json_each 报错,加 IS NOT NULL guard)
SELECT value AS tag, COUNT(*) FROM vocabulary, json_each(vocabulary.word_tags)
WHERE vocabulary.word_tags IS NOT NULL AND value IN ('phrasal_verb','idiom','basic')
GROUP BY value;
-- 期望:basic 400 / idiom 5336 / phrasal_verb 1861
SELECT word, word_tags, frequency_rank,
json_extract(pos_definitions,'$') IS NOT NULL AS has_def
FROM vocabulary WHERE word IN ('look into','give up','get up','piece of cake','break the ice');