Commit 0366b572 by luoqi

fix(摄入): 补「调合/调颌」含词规则 —— 精确表认得单词,认不得组合词

陈惠英 TS0K028757 牙34;35;36;37:
  2024-07 起做种植,中间 37 植体失败取出重做,2025-03-21 四颗全部戴牙完成
  2026-05-20 复诊,主诉「种植戴牙1年按约复查」,检查所见「冠边缘密合,牙龈未见异常」
             诊断「牙齿缺少 34;35;36;37」+ 本次治疗「调合,抛光」(牙位完全一致)
一年多的种植治疗史被这次重记的诊断挡在时间门外;当天那条本可以过门的「调合,抛光」
落 _default 整条丢弃 → 生产库里那天只有诊断没有治疗 → 判「缺失牙未启动修复」误召。

── 与「卡环加力」不是同一种失效 ──
卡环加力是词表里压根没有;这次两个词**都在词表里**,但都只在**精确表**:
  treatment_actual.yaml:147  调合: prosthodontic / 调颌: prosthodontic
  treatment-category-core.yaml:189  抛光: preventive
医生把两个词写在一起 → 精确匹配不上,含词表又没有这两个词 → 一个都不命中。
即"产品早就判定了它算修复,只是接不住组合词"。

── 影响面(真实引擎代码回放 DW 全量 135,457 个 treatName)──
  改前 丢弃 207,209 EMR → 改后 204,670 EMR
  救回 2,539 EMR / 1,065 词形,新丢 0 词形

──  顺序是这条规则的命门 ──
必须排在 restorative 之后。「去腐净,GIC垫,Z250充填,调合抛光。」这类补牙散文含「调合」,
放进上方 prosthodontic 行会把上千条充填记录改判成修复(两者都在结构 resolver 里,
召回判定不变,但治疗史和标签会错)。放在 restorative 之后让「充填/树脂」先赢 —— 已实测。
种植/正畸语境仍由更前面的规则先赢(种植体调合→implant、正畸调合→orthodontic)。
「调磨」不收,沿用词表文末  块(姑息调整 ≠ 问题已解决);调合=咬合调整,是宿主已判定的修复动作。

测试新增 9 例(含三条生产真实补牙散文的防回归断言)。96 suites / 1647 tests,tsc 0 error。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
parent 1284675e
...@@ -47,6 +47,15 @@ keyword_mapping: ...@@ -47,6 +47,15 @@ keyword_mapping:
- { value: preventive, any: [窝沟封闭, 封闭剂, 点隙封闭] } - { value: preventive, any: [窝沟封闭, 封闭剂, 点隙封闭] }
# 材料弱词:放 preventive 后 —— "玻璃离子窝沟封闭" 已被上面 preventive 收;裸"树脂/玻璃离子"→ restorative # 材料弱词:放 preventive 后 —— "玻璃离子窝沟封闭" 已被上面 preventive 收;裸"树脂/玻璃离子"→ restorative
- { value: restorative, any: [树脂, 玻璃离子] } - { value: restorative, any: [树脂, 玻璃离子] }
# 调合/调颌(2026-08-28 陈惠英 TS0K028757 牙34;35;36;37):种植戴牙一年按约复查,当次治疗
# 写「调合,抛光」,牙位与缺牙诊断完全一致。宿主精确表早已判定「调合」「调颌」= prosthodontic
# (treatment_actual.yaml),但只在精确表里 —— 医生把两个词写在一起,精确匹配不上、含词表也没有,
# 整条丢弃 → 那次复查在系统里没有任何治疗 → 判「缺失牙未启动修复」误召。DW 实测 238 条。
# ⛔ **必须排在 restorative 之后**:「去腐净,Z250充填,调合抛光」这类补牙散文含「调合」,
# 放到上面的 prosthodontic 行会把上千条充填记录改判成修复(两者都在结构 resolver 里,
# 召回判定不变,但治疗史和标签会错)。放这里让「充填/树脂」先赢。
# ⛔ 「调磨」不收 —— 见文末 ⛔ 块(姑息调整,不代表问题已解决);调合=咬合调整,是宿主已判定的修复动作。
- { value: prosthodontic, any: [调合, 调颌] }
# 牙周去裸"洁牙"(避开自由文本"清洁牙面"误命中);洁牙/全口洁牙等精确词由上方 enum_mapping 兜 # 牙周去裸"洁牙"(避开自由文本"清洁牙面"误命中);洁牙/全口洁牙等精确词由上方 enum_mapping 兜
# SRP = scaling & root planing(龈下刮治+根面平整)的国际通用缩写,正是 perio_no_srp 子场景 # SRP = scaling & root planing(龈下刮治+根面平整)的国际通用缩写,正是 perio_no_srp 子场景
# 要认的那个治疗。DW 实测 SRP 648 + 局部SRP 40 + SRP+冲洗上药 76,此前全部落 _default 被丢 —— # 要认的那个治疗。DW 实测 SRP 648 + 局部SRP 40 + SRP+冲洗上药 76,此前全部落 _default 被丢 ——
......
...@@ -177,3 +177,27 @@ describe('洁牙 → periodontic(独立规则 + none: 清洁牙)', () => { ...@@ -177,3 +177,27 @@ describe('洁牙 → periodontic(独立规则 + none: 清洁牙)', () => {
expect(cat('洁牙后树脂充填')).toBe('restorative'); expect(cat('洁牙后树脂充填')).toBe('restorative');
}); });
}); });
describe('调合 / 调颌 → prosthodontic(2026-08-28 陈惠英 TS0K028757)', () => {
it.each(['调合,抛光', '调合抛光', '调颌,抛光', '调颌抛光', '调合 抛光', '调合'])('%s', (s) => {
expect(cat(s)).toBe('prosthodontic');
});
it('🔴 ⛔ 必须排在 restorative 之后 —— 补牙散文含「调合」不能被改判成修复', () => {
// 生产真实串,各上千条;它们本来就是 restorative,加规则前后必须一致
expect(cat('去腐净,GIC垫,Z250充填,调合抛光。')).toBe('restorative');
expect(cat('去龋备洞,粘结,Z350充,调合抛光。')).toBe('restorative');
expect(cat('上橡皮障,去腐净达牙本质深层,赛光垫底,3MZ350树脂充填,调牙合,抛光。')).toBe(
'restorative',
);
});
it('⭐ 碰撞:种植 / 正畸语境仍由前面的规则先赢', () => {
expect(cat('种植体调合')).toBe('implant');
expect(cat('正畸调合')).toBe('orthodontic');
});
it('⛔ 「调磨」仍然不收(姑息调整,见词表文末 ⛔ 块)', () => {
expect(cat('调磨')).toBeUndefined();
});
});
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment