Commit c9c1e778 by luoqi

refactor(sync): assembler 字典分层 — 临床通用层抽 _shared/dict,宿主怪癖留本地

多宿主字典治理:enum/keyword 映射词分两类 —— 临床通用知识(慢性牙髓炎→K04、
开髓→pulp_extirpation)拷贝必漂移(实证:jvs-dw 自己的 treatment_planned 字典
已是 treatment_actual 的陈旧拷贝);宿主怪癖(价格表项名/标点残留/用词判例)共用
会互相污染。→ 新增 dict_includes 机制:loader 在 zod 校验前解析合并,引擎零改动。

- dict-include.ts:include 解析 + 合并语义(enum 本地覆盖/keyword 本地优先/
  strip 去重并集/_default 禁入共享层 strict 校验)
- data/_shared/dict/ 七份共享字典:diagnosis-kcode(187 词+9 keyword 规则)、
  treat-stages(45)、treatment-category-core(177=actual∩planned 干净交集)、
  category keyword 按 kind 分 actual/planned 两个语义变体、image-modality(9)、
  recommendation-code(27+11)
- jvs-dw 五份 yaml 改用 include,本地只留判例(牙齿缺少→K08、拆线→surgical、
  单据类 modality、价格表项名、标点残留死条目)

生产零变化证明(jvs-dw 每日增量无感):20/20 assembler 新旧解析结果 deep-equal
(vs git HEAD);tsc 0 err;测试与 HEAD 基线完全一致(存量 3 挂套件与本次无关);
reparse dry-run 真实 loader 全链冒烟通过。

已知遗留(有意不修,行为保真):planned keyword 裸「二期」误吞正畸(共享文件已标
TODO);planned 残差中文标点死条目待清理 —— 均属行为变更须评估+reparse,另行提交。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
parent f7cdf226
# ═══════════════════════════════════════════════════════════
# 共享字典 · 诊断中文术语 → ICD K 码(enum 精确 + keyword 含词兜底)
#
# 【临床通用层】口腔标准术语与 K 码的对应是医学知识,不随宿主变 —— 所有宿主经
# `dict_includes` 引入本文件;宿主用词怪癖/判例(如 jvs-dw "牙齿缺少"→K08)留各宿主
# yaml 本地(本地同 key 覆盖共享,本地 keyword 规则优先于共享)。
#
# ⚠️ 治理纪律:
# - 改本文件影响【所有】引入它的宿主 → 改完对受影响宿主跑 `pnpm reparse` 重衍生;
# - 新词归层判断:标准临床术语 → 这里;某宿主的用词判例/价格表名 → 该宿主 yaml;
# - `_default` 禁止出现在本文件(loader 强校验),由宿主本地声明。
# 源出处:抽取自 jvs-dw diagnosis.yaml(2026-07,含全部临床注释与故意不映射决策)。
# ═══════════════════════════════════════════════════════════
enum_mapping:
code:
# K 大类直通
K00: K00
K01: K01
K02: K02
K03: K03
K04: K04
K05: K05
K06: K06
K07: K07
K08: K08
K09: K09
K10: K10
K11: K11
K12: K12
K13: K13
K14: K14
# ── 中文术语 → K 码(高置信草案,trim 已去尾部标点)──
# K05 牙周 / 牙龈
慢性牙龈炎: K05
牙龈炎: K05
慢性龈炎: K05
龈炎: K05
菌斑性龈炎: K05
菌斑性牙龈炎: K05 # W4 末补,DW top 200 漏配("牙龈"vs"龈"长写)
慢性牙周炎: K05
牙周炎: K05
重度牙周炎: K05
中度牙周炎: K05
侵袭性牙周炎: K05
# K02 龋
: K02
龋齿: K02
龋坏: K02
浅龋: K02
中龋: K02
深龋: K02
继发龋: K02
# ⚠️ 深窝沟 故意不映射(落 _default → code=null,不召、病历照原文显示):
# 它是龋【风险】(窝沟深易蛀,无龋洞),对症是窝沟封闭(preventive 预防),
# 不属于"应治未治(龋洞没补)"召回范畴。归任何疾病码都会误召(预防治疗满足不了"已治"闸)。
# K04 牙髓 / 根尖周
牙髓炎: K04
慢性牙髓炎: K04
急性牙髓炎: K04
根尖周炎: K04
慢性根尖周炎: K04
慢性根尖炎: K04
急性根尖周炎: K04
牙髓坏死: K04
# K03 牙体硬组织其他(楔缺 / 缺损 / 残根冠)
楔状缺损: K03
楔形缺损: K03
楔缺: K03
牙体缺损: K03
残根: K03
残冠: K03
# K01 阻生 / 埋伏
阻生齿: K01
阻生牙: K01
阻生: K01
埋伏牙: K01
# K07 牙颌面异常 / 错颌
错颌畸形: K07
牙列不齐: K07
牙列拥挤: K07
安氏I类错颌畸形: K07
安氏II类错颌畸形: K07
安氏III类错颌畸形: K07
# K08 缺牙 / 缺失
牙缺失: K08
缺失: K08
缺失牙: K08
牙列缺损: K08
牙列缺失: K08
后天性牙齿缺失: K08
全口牙列缺失: K08
上颌牙列缺损: K08
下颌牙列缺损: K08
废用牙: K08 # 临床功能性缺失
无功能牙: K08
# ── W3 末扩 K00-K08 全覆盖(源 DW 数据驱动,见 dw-data-source-issues #15)──
# K00 牙发育 / 萌出障碍 — 只收"真病种",不收"乳牙列 / 混合牙列"等正常生理态(走 _default 不入诊断)
乳牙滞留: K00
滞留乳牙: K00
乳牙早失: K00
乳牙松动: K00 # 替换期非自然脱落
替换期乳牙松动: K00
松动乳牙: K00
多生牙: K00
额外牙: K00
埋伏多生牙: K00
根方多生牙: K00
间多生牙: K00
腭侧多生牙: K00
前牙区埋伏多生牙: K00
先天缺失: K00
先天缺牙: K00
釉质发育不全: K00 # = K00.2 釉质形成
釉质发育不良: K00
牙釉质发育不全: K00
牙釉质发育不良: K00
氟斑牙: K00 # K00.3 牙齿氟中毒着色
四环素牙: K00 # K00.3 内源性着色
迟萌: K00 # K00.6 萌出障碍
恒牙迟萌: K00
萌出迟缓: K00
萌出不全: K00
异位萌出: K00
萌出间隙不足: K00
部分萌出: K00
未萌出: K00
牙萌出障碍: K00
牙萌出延迟: K00
# K01 阻生 / 埋伏(补 host 真实用词)
智齿: K01 # host 大量直接录"智齿"作为诊断,实际是阻生齿
阻生智齿: K01
近中阻生: K01
垂直位阻生齿: K01
垂直位智齿: K01
异位阻生: K01
# K03 牙体硬组织其他(补复合 / 不良修复体 / 牙齿磨耗)
牙齿楔状缺损: K03
牙体磨耗: K03
牙磨耗: K03
重度磨耗: K03
不良修复体: K03 # 已存在 host 数据,主要走 restorative / prosthodontic 重做
不良充填体: K03
死髓牙: K03 # 牙体已失活,临床走 prosthodontic 桩冠 / surgical 拔除
修复体脱落: K03
充填脱落: K03
冠折: K03
简单冠折: K03
复杂冠折: K03
根折: K03
牙外伤: K03
# ⚠️ 脱矿 / 牙本质敏感 故意不映射(落 _default → code=null):
# 脱矿=早期龋【风险】(对症涂氟,预防)、牙本质敏感=【症状】(对症脱敏,非修复缺损)。
# 跟已 null 的"牙釉质脱矿/釉质脱矿"口径统一,均不作"应治未治"召回信号。
# K05 牙周 / 牙龈(补 host 真实高频用词)
牙周病: K05
全口慢性牙周炎: K05
萌出性龈炎: K05 # 实际牙龈炎,临床路径同 K05
# ⚠️ 牙菌斑堆积 不映射(卫生/菌斑【风险】,对症洁治/宣教=预防);菌斑性龈炎是真龈炎,保留 K05
# K06 牙龈 / 牙槽嵴疾患(原本走 _default → code=null,W3 末归 K06)
牙周脓肿: K06
慢性牙周脓肿: K06
急性牙周脓肿: K06
冠周炎: K06 # K05.2 / K06 边缘,临床归 K06 (智齿冠周特化)
智齿冠周炎: K06
急性冠周炎: K06
慢性冠周炎: K06
牙龈萎缩: K06
龈萎缩: K06
牙龈增生: K06
龈增生: K06
药物性牙龈增生: K06
牙龈瘤: K06
龈瘤: K06
龈息肉: K06
根分叉病变: K06 # K05.x 并发,但临床上独立标
重度根分叉病变: K06
# ⚠️ 食物嵌塞 不映射(【症状】,对症调牙合/牙周处置,非"应治未治"病灶)→ 落 _default code=null
附着丧失: K06
附着龈缺如: K06
牙槽骨缺损: K06
牙槽骨骨尖: K06
牙槽嵴: K06
唇系带附着低: K06
唇系带附着过低: K06
唇系带附丽过低: K06
唇系带附着异常: K06
上唇系带附着低: K06
上唇系带附着异常: K06
舌系带过短: K06
舌系带短: K06
舌系带附着低: K06
舌系带附着异常: K06
舌系带附着过前: K06
系带异常: K06
# K09 牙发生囊肿(根尖囊肿/含牙囊肿/颌骨囊肿)— DW 真实数据 ~170 条,临床必摘除
根尖囊肿: K09
根尖周囊肿: K09
慢性根尖囊肿: K09
含牙囊肿: K09
颌骨囊肿: K09
上颌骨囊肿: K09
下颌骨囊肿: K09
牙源性囊肿: K09
# K07 错颌畸形(补"合"字版本 + 安氏分类异写)
错合畸形: K07 # host 用"合"而非"颌"也很多
错合畸形安氏Ⅰ类: K07
错合畸形安氏Ⅱ类: K07
错合畸形安氏Ⅲ类: K07
错合畸形安氏II类: K07 # 阿拉伯数字版本
错合畸形安氏III类: K07
安氏I类: K07
安氏II类: K07
安氏III类: K07
安氏Ⅰ类: K07
安氏Ⅱ类: K07
安氏Ⅲ类: K07
前牙反合: K07
前牙反颌: K07
深覆合: K07
深覆颌: K07
牙位置异常: K07
骨性I类: K07
骨性II类: K07
骨性III类: K07
骨性Ⅰ类: K07
骨性Ⅱ类: K07
骨性Ⅲ类: K07
# ─────────────────────────────────────────────────────────
# 含词兜底 —— 精确 enum 未命中时,按序含词匹配 → K 码。
# 治本长尾:诊断常是复合/变体("埋伏阻生;"、"前倾位阻生,颌面龋"、"牙齿缺失"、"窝沟龋"…),
# 精确白名单永远漏(沈建锋 28/38 阻生智齿 → null → 漏召)。引擎按 canonicalKey 通用。
# 顺序=优先级:阻生/缺失/牙髓 在 龋 之前 → 复合"阻生+龋"判 K01(智齿该评估拔除,非补)。
# ⚠️ 龋:any=[龋] + none=[风险,可疑,脱矿] —— 排除"高龋风险/可疑龋"(=风险,非龋洞,同深窝沟不召);
# 深窝沟/食物嵌塞/牙本质敏感 不含上述关键词 → 仍落 null,故意不召(无回归)。
keyword_mapping:
code:
- { value: K08, any: [缺失, 缺牙, 牙列缺损] }
- { value: K01, any: [阻生, 埋伏, 智齿] }
- { value: K09, any: [颌骨囊肿, 含牙囊肿, 根尖囊肿] }
- { value: K04, any: [牙髓炎, 牙髓坏死, 根尖周, 根尖炎, 牙髓] }
- { value: K03, any: [楔状, 残根, 残冠, 隐裂, 牙体缺损, 牙折] }
- { value: K05, any: [牙周炎, 龈炎, 牙周袋] }
- { value: K02, any: [], none: [风险, 可疑, 脱矿] }
# 牙磨耗 → 牙体损伤 K03(过度/中度/重度/牙齿磨耗… 一次收全 host 变体,补 enum 精确词漏的)。
# 放 K02/K05 之后:复合名"龋+磨耗""磨耗+牙周炎"让位给更主要的龋/牙周。
# none 排:生理性/轻度磨耗(正常生理,无需修复)+ 活动义齿/人工牙磨耗(假牙磨损=修复体重做,非牙体)。
- { value: K03, any: [磨耗], none: [生理, 轻度, 义齿, 人工牙] }
# K07 错颌/正畸族 含词兜底 —— 精确白名单总漏变体(错牙合/开颌/反颌/深覆/间隙/拥挤/安氏…)。
# 放最后:K08(缺牙间隙)/K09(颌骨囊肿)等已在前面先吃;none 再兜一层防"缺牙间隙"误判正畸。
# 注:反合/开合/对刃合 = 反牙合/开牙合 的"合"简写(host 高频:反合 120+),crossbite/openbite 都是正畸。
- { value: K07, any: [错颌, 错合, 错牙合, 锁颌, 偏颌, 开颌, 反颌, 开牙合, 反牙合, 反合, 开合, 对刃合, 深覆, , 前突, 拥挤, 安氏, 间隙], none: [缺牙, 缺失, 牙列缺损, 嵌塞] }
# ═══════════════════════════════════════════════════════════
# 共享字典 · 影像类型名 → PAC modality 闭集(pa/bw/pano/cbct/intraoral_photo/scan/other)
# 【临床通用层】真影像类型名(FRIDAY std_check_class 与 jvs-dw check_name 实测同名)。
# 宿主单据/化验类名目(牙周大表/血常规/术前清单…→other)与 _default 留宿主 yaml。
# 源出处:jvs-dw image.yaml。
# ═══════════════════════════════════════════════════════════
enum_mapping:
modality:
"口内像照片": intraoral_photo
"面相照": intraoral_photo
"内窥镜": intraoral_photo
"小牙片": pa
"全景片/头颅正侧位片截图": pano
"全景片/侧位片/其他X线影像": pano
"CT影像截图": cbct
"口腔扫描": scan
"其他类型资料(非X影像)": other
# ═══════════════════════════════════════════════════════════
# 共享字典 · 医生建议文本 → PAC 推荐码(IMPLANT_RECOMMENDED 等)
# 【临床通用层】"建议种植/建议拔除"等标准表达(enum 精确 + keyword 含词兜底)。
# 宿主标点变体等痕迹词与 _default 留宿主 yaml。源出处:jvs-dw recommendation.yaml。
# ═══════════════════════════════════════════════════════════
enum_mapping:
code:
# ── 种植 ──
建议种植: IMPLANT_RECOMMENDED
建议种植修复: IMPLANT_RECOMMENDED
推荐种植: IMPLANT_RECOMMENDED
建议种植治疗: IMPLANT_RECOMMENDED
建议种植牙: IMPLANT_RECOMMENDED
# ── 戴冠 / 修复 ──
建议戴冠: CROWN_RECOMMENDED
建议冠修复: CROWN_RECOMMENDED
建议全冠: CROWN_RECOMMENDED
建议桩核冠: CROWN_RECOMMENDED
建议做冠: CROWN_RECOMMENDED
推荐冠修复: CROWN_RECOMMENDED
# ── 充填 ──
建议充填: FILLING_RECOMMENDED
建议树脂充填: FILLING_RECOMMENDED
建议补牙: FILLING_RECOMMENDED
# ── 牙周基础 ──
建议洁牙: SRP_RECOMMENDED
建议龈上洁治: SRP_RECOMMENDED
建议牙周治疗: SRP_RECOMMENDED
建议牙周基础治疗: SRP_RECOMMENDED
# ── 拔除 ──
建议拔除: EXTRACTION_RECOMMENDED
建议拔牙: EXTRACTION_RECOMMENDED
推荐拔除: EXTRACTION_RECOMMENDED
# ── 复查 ──
建议年度复查: ANNUAL_REVIEW_RECOMMENDED
建议定期复查: ANNUAL_REVIEW_RECOMMENDED
建议复查: ANNUAL_REVIEW_RECOMMENDED
# ── 正畸咨询 ──
建议正畸咨询: ORTHO_CONSULT_RECOMMENDED
建议正畸: ORTHO_CONSULT_RECOMMENDED
建议矫正: ORTHO_CONSULT_RECOMMENDED
# ─────────────────────────────────────────────────────────
# 含词兜底 —— 精确 enum 未命中时,按序含词匹配 → 召回码。
# 治本长尾:"建议X"变体太多(建议充填治疗/建议根管治疗后冠修复/建议拔除后种植…),
# 精确白名单永远漏(谢玉兰 44 "建议充填治疗" 漏配 → null → 44 漏召)。引擎按 canonicalKey 通用。
# 顺序=优先级:高价值/主操作在前(种植>冠、根管>冠、拔除独立)。错配最坏=_default(现状),无回归。
keyword_mapping:
code:
- { value: IMPLANT_RECOMMENDED, any: [种植, 植体] }
- { value: RCT_RECOMMENDED, any: [根管, RCT, 牙髓] }
- { value: EXTRACTION_RECOMMENDED, any: [拔除, 拔牙] }
- { value: CROWN_RECOMMENDED, any: [, , 桩核] }
- { value: FILLING_RECOMMENDED, any: [充填, 补牙, 树脂] }
- { value: HARD_TISSUE_REPAIR_RECOMMENDED, any: [楔状, 牙体, 嵌体, 缺损] }
- { value: SRP_RECOMMENDED, any: [洁治, 洗牙, 牙周, 龈下, 刮治] }
- { value: ORTHO_CONSULT_RECOMMENDED, any: [正畸, 矫正, 矫治] }
- { value: GUM_TREATMENT_RECOMMENDED, any: [牙龈, 牙槽嵴, 系带] }
- { value: JAW_CYST_REMOVAL_RECOMMENDED, any: [囊肿] }
- { value: ERUPTION_INTERVENTION_RECOMMENDED, any: [萌出, 乳牙滞留, 多生牙] }
# ═══════════════════════════════════════════════════════════
# 共享字典 · 治疗 stage 词 → PAC step enum(开髓→pulp_extirpation 等)
# 【临床通用层】牙科标准术式步骤词。宿主经 dict_includes 引入;_default 宿主本地声明。
# 治理:改动影响所有引入宿主 → reparse;宿主怪癖词留宿主 yaml(本地覆盖共享)。
# 源出处:jvs-dw treatment_actual.yaml(与 treatment_planned 完全相同,抽取消除同宿主重复)。
# ═══════════════════════════════════════════════════════════
enum_mapping:
treatStages:
开髓: pulp_extirpation
拔髓: pulp_extirpation
根备: canal_preparation
根管预备: canal_preparation
根充: canal_filling
根管充填: canal_filling
# 牙髓切断术 / 活髓保存(pulpotomy 类 — VPT 终末术式)
# 临床等价:活髓切断 / 部分活髓切断 / 部分牙髓切断 / 冠髓切断 / 干髓 / 盖髓 / 牙髓血运重建
活髓切断: pulpotomy
部分活髓切断: pulpotomy
部分牙髓切断: pulpotomy
冠髓切断: pulpotomy
干髓术: pulpotomy
干髓治疗: pulpotomy
盖髓术: pulpotomy
间接盖髓: pulpotomy
直接盖髓: pulpotomy
牙髓血运重建: pulpotomy
活髓保存: pulpotomy
# 种植
植入: implant_placement
种植体植入: implant_placement
种植一期: implant_placement
种植I期: implant_placement # 罗马数字版(host 实测)
简单种植: implant_placement
复杂种植: implant_placement
即刻种植: implant_placement
延期种植: implant_placement
基台: abutment_placement
种植二期: abutment_placement
种植II期: abutment_placement # 罗马数字版(host 实测)
上部修复: crown_placement
种植冠修复: crown_placement
种植戴牙: crown_placement
种植三期: crown_placement
# 牙周
龈上洁治: supragingival_scaling
龈下刮治: subgingival_scaling
刮治: subgingival_scaling
牙周维护: periodontal_maintenance
# 修复
充填: composite_filling
嵌体: inlay
冠修复: crown_restoration
桩核: post_core
# 正畸
粘附件: bracket_placement
托槽: bracket_placement
矫治器: bracket_placement
保持器: retainer
加力: ortho_adjustment
# 长尾兜底:host stage 词字典外 → 空(不进 PAC,treat_stages 数组减一元素)
# ═══════════════════════════════════════════════════════════
# 共享字典 · 治疗 category 关键词兜底 —— 【actual(本次已做)语义变体】
# 与 planned 变体(treatment-category-planned-rules.yaml)是有意语义分歧:
# actual 剥"建议/推荐/考虑/若"从句(那些=本次没做);planned 本就以建议措辞,只剥纯条件词。
# 规则顺序=优先级(首个命中即用);宿主本地规则(若有)自动排在本文件规则之前。
# 源出处:jvs-dw treatment_actual.yaml(含裁决顺序的全部推敲注释)。
# ═══════════════════════════════════════════════════════════
# 关键词分类兜底 —— 精确 enum_mapping 未命中时,按序含词匹配 → 赋 category。
# 治本长尾:treatName 2万+ distinct 精确字典覆盖不全,以前全靠 _default:'' 丢(→ 误召)。
# 引擎算法(切段 / 含词 / 按序裁决 / 剥离从句)host 无关;此处规则词 = 本 host 术式特征(host 差异)。
# 只覆盖【真治疗】10 大类;流程/无操作(观察/复诊/无治疗)不在此 → 落 _default 丢弃
# (review 噪音已由 transforms.route_by_pattern 上游分流,这里不重复)。
# 顺序 = 优先级:主操作/高价值在前 → 关键词赢复合(种植>冠、根管>冠、操作词>人群词)。
# ⚠️ 安全:只接管精确未命中的长尾,精确命中零影响;错配最坏退化=_default(现状),无回归。
keyword_mapping:
category:
# ⚠️ "二期" 必须限定到「种植二期」:裸"二期"会误吞"二期隐形矫正"(正畸)等 → 误判 implant。
# 种植语境的二期都带"种植"(种植二期);ortho 的"二期隐形矫正/二期矫正"靠下面 orthodontic 兜住。
- { value: implant, any: [种植, 即拔即种, 植体, 种植二期] }
- { value: endodontic, any: [根管, RCT, 牙髓, 开髓, 根备, 根充, 盖髓, 摘髓, 根尖] }
- { value: orthodontic, any: [正畸, 矫治, 矫正, 托槽, 保持器, 粘附件, 隐适美, 隐形矫, 扩弓, 错颌, 错合] }
- { value: cosmetic, any: [贴面, 漂白, 美白] }
# 修复/备牙/取模:收 C.10 治疗痕迹(修复后/修复术后/全瓷桥修复后/备牙后/重新取模后)。
# 排在 implant/endo/ortho/cosmetic 之后 → 种植修复→implant、根管…修复→endo 仍被前面抢走。
# "嵌体修复"等 restorative 已由上方精确 enum 先命中,不受裸"修复"影响。
- { value: prosthodontic, any: [, , 义齿, 修复体, 修复, 备牙, 取模, 桩核, 桩冠, 戴牙, 全瓷, 烤瓷, 重新粘接] }
# ⭐ 明确充填动作(充填/去腐/备洞/嵌体/垫底/补牙)压过 preventive:
# "去腐,备洞,...树脂充填,窝沟封闭"(dispose 散文)是补牙(restorative),不能因含"窝沟封闭"
# 被误判 preventive → 非 resolver → 误召(马思煦@46)。注:"开髓去腐"等根管语境已被上方 endodontic 先收。
- { value: restorative, any: [充填, 补牙, 去腐, 备洞, 嵌体, 垫底] }
# 纯封闭(无充填动作)→ preventive:玻璃离子常作封闭剂材料("玻璃离子窝沟封闭"≠充填)
- { value: preventive, any: [窝沟封闭, 封闭剂, 点隙封闭] }
# 材料弱词:放 preventive 后 —— "玻璃离子窝沟封闭" 已被上面 preventive 收;裸"树脂/玻璃离子"→ restorative
- { value: restorative, any: [树脂, 玻璃离子] }
# 牙周去裸"洁牙"(避开自由文本"清洁牙面"误命中);洁牙/全口洁牙等精确词由上方 enum_mapping 兜
- { value: periodontic, any: [洁治, 洗牙, 龈上, 龈下, 刮治, 牙周, 喷砂, 细洁] }
- { value: preventive, any: [涂氟, 防龋, OHI, 口腔卫生宣教] }
- { value: surgical, any: [拔除, 拔牙, 切开, 翻瓣, 切除, 系带, 脓肿, 囊肿, 植骨] }
- { value: pediatric, any: [乳牙, 儿童, 年轻恒牙] }
# actual 语义:这些词开头的从句 = 本次没做(条件/未来/建议)→ 切段丢弃后再匹配。
# 例 "充填,必要时根管治疗" → 丢"必要时根管治疗" → "充填" → restorative(不误判成 endodontic)。
keyword_strip_clauses: [必要时, 如需, 择期, 建议, 推荐, 考虑, ] # 若…=条件从句(若牙面脱矿,建议充填),非本次实际治疗
# ═══════════════════════════════════════════════════════════
# 共享字典 · 治疗名 → PAC category(11 类闭集)· 精确匹配临床核心
#
# 【临床通用层】只收"干净"的标准术式名(无标点残留/价格表项名/长句/宿主判例)。
# 取自 jvs-dw treatment_actual ∩ treatment_planned 同值交集再过滤宿主痕迹(2026-07)。
# 宿主价格表项名/标点变体/判例(拆线→surgical、全景片→preventive 等)留各宿主 yaml。
# _default 宿主本地声明。keyword 兜底规则见 treatment-category-{actual,planned}-rules.yaml。
# ═══════════════════════════════════════════════════════════
enum_mapping:
category:
# ── 牙周(periodontic)
龈上洁治: periodontic
龈上洁治术: periodontic
全口龈上洁治: periodontic
全口洁治: periodontic
全口洁牙: periodontic
全口超声洁治: periodontic
全口超声波洁治: periodontic
全口龈上超声洁治: periodontic
定期全口洁治: periodontic
定期洁牙: periodontic
洁牙: periodontic
洁治: periodontic
洗牙: periodontic
"洁治 OHI": periodontic
龈下细洁: periodontic
龈上超声洁治: periodontic
牙周基础治疗: periodontic
牙周系统治疗: periodontic
牙周治疗: periodontic
牙周维护: periodontic
牙周刮治: periodontic
牙周刮治术: periodontic
龈下刮治: periodontic
龈下刮治术: periodontic
根面平整术: periodontic
PMTC: periodontic
牙周序列治疗: periodontic
系统性牙周治疗: periodontic
# ── 充填修复(restorative)
充填: restorative
充填治疗: restorative
充填术: restorative
树脂充填: restorative
光固化树脂充填: restorative
非美学区树脂充填: restorative
美学区简单树脂充填: restorative
重新充填: restorative
预防性充填: restorative
树脂充填术: restorative
嵌体修复: restorative
嵌体: restorative
戴嵌体: restorative
龋齿充填: restorative
玻璃离子充填: restorative
玻璃离子充填术: restorative
进口玻璃离子充填: restorative
玻璃离子暂封: restorative
玻璃离子预充填: restorative
充填或嵌体修复: restorative
高嵌体修复: restorative
预防性树脂充填: restorative
# ── 牙髓/根管(endodontic)
根管治疗: endodontic
根管再治疗: endodontic
根管预备: endodontic
根管充填: endodontic
根充: endodontic
RCT: endodontic
牙髓治疗: endodontic
根尖诱导成形术: endodontic
拔髓: endodontic
干髓术: endodontic
盖髓术: endodontic
间接盖髓: endodontic
直接盖髓: endodontic
MTA盖髓: endodontic
冲洗上药: endodontic
根管治疗后冠修复: endodontic
活髓切断术: endodontic
部分活髓切断术: endodontic
部分牙髓切断术: endodontic
活髓切断: endodontic
乳牙活髓切断术: endodontic
乳牙活髓保存术: endodontic
冠髓切断术: endodontic
干髓治疗: endodontic
直接盖髓术: endodontic
间接盖髓术: endodontic
开髓引流: endodontic
开髓失活: endodontic
开髓开放: endodontic
开髓封药: endodontic
开髓封失活剂: endodontic
牙髓失活: endodontic
封失活剂: endodontic
放失活剂: endodontic
放置失活剂: endodontic
失活: endodontic
乳牙牙髓治疗: endodontic
髓腔消毒: endodontic
髓腔封药: endodontic
髓腔预备: endodontic
髓腔换药: endodontic
保髓治疗: endodontic
牙髓保留: endodontic
根管治疗术: endodontic
复杂根管治疗: endodontic
# ── 种植(implant)
种植: implant
种植手术: implant
种植体植入: implant
种植修复: implant
种植戴牙: implant
种植一期: implant
种植二期: implant
种植三期: implant
种植耗材: implant
种植基台: implant
种植取模: implant
种植拆线: implant
即刻种植术: implant
拔除后种植修复: implant
延期种植术: implant
拔除后种植: implant
# ── 修复(冠/桥/义齿/桩核)(prosthodontic)
冠修复: prosthodontic
全冠修复: prosthodontic
牙冠修复: prosthodontic
重新冠修复: prosthodontic
戴冠: prosthodontic
粘冠: prosthodontic
拆冠: prosthodontic
戴牙: prosthodontic
桩核: prosthodontic
桩核冠: prosthodontic
固定修复: prosthodontic
活动修复: prosthodontic
重新修复: prosthodontic
修复: prosthodontic
预成冠修复: prosthodontic
牙体预备: prosthodontic
种植上部修复: prosthodontic
种植体上部修复: prosthodontic
桩冠修复: prosthodontic
# ── 外科(拔除)(surgical)
拔除: surgical
拔除术: surgical
拔牙: surgical
牙拔除术: surgical
简单牙拔除术: surgical
松动恒牙拔除术: surgical
松动乳牙拔除术: surgical
择期拔除: surgical
阻生齿拔除术: surgical
阻生牙拔除: surgical
残根拔除术: surgical
# ── 正畸(orthodontic)
正畸: orthodontic
正畸治疗: orthodontic
隐形正畸: orthodontic
固定正畸: orthodontic
早期矫治: orthodontic
保持器: orthodontic
正畸保持器: orthodontic
正畸保持: orthodontic
正畸矫治器: orthodontic
正畸辅助治疗: orthodontic
正畸加力: orthodontic
加力: orthodontic
粘附件: orthodontic
粘接附件: orthodontic
重粘托槽: orthodontic
更换新矫治器: orthodontic
粘接上半口矫治器: orthodontic
粘接全口附件: orthodontic
精调粘接附件: orthodontic
发放新矫治器: orthodontic
精细调整: orthodontic
发放矫治器: orthodontic
# ── 预防(preventive)
涂氟: preventive
全口涂氟: preventive
窝沟封闭: preventive
窝沟封闭术: preventive
OHI: preventive
口腔卫生宣教: preventive
脱敏: preventive
抛光: preventive
# ── 美学(cosmetic)
美白: cosmetic
冷光美白: cosmetic
牙齿美白: cosmetic
牙位图美白: cosmetic
贴面: cosmetic
贴面修复: cosmetic
# ═══════════════════════════════════════════════════════════
# 共享字典 · 治疗 category 关键词兜底 —— 【planned(未来计划)语义变体】
# 与 actual 变体是有意语义分歧:planned 文本本就以"建议/拟/推荐"措辞 → 不剥这些词,
# 只剥纯条件从句(必要时/如需/择期)。
# ⚠️ TODO(继承自 jvs-dw 陈旧拷贝,行为保真原样搬入):implant 规则里裸「二期」会误吞
# "二期隐形矫正"(actual 变体已改「种植二期」)。修复属行为变更,须评估 + reparse,另行提交。
# 源出处:jvs-dw treatment_planned.yaml。
# ═══════════════════════════════════════════════════════════
keyword_mapping:
category:
- { value: implant, any: [种植, 即拔即种, 植体, 二期] }
- { value: endodontic, any: [根管, RCT, 牙髓, 开髓, 根备, 根充, 盖髓, 摘髓] }
- { value: orthodontic, any: [正畸, 矫治, 矫正, 托槽, 保持器, 粘附件, 隐适美, 扩弓] }
- { value: cosmetic, any: [贴面, 漂白, 美白] }
- { value: prosthodontic, any: [, , 义齿, 修复体, 桩核, 桩冠, 戴牙, 全瓷, 烤瓷, 重新粘接] }
- { value: restorative, any: [充填, 补牙, 树脂, 玻璃离子, 嵌体, 垫底] }
- { value: periodontic, any: [洁治, 洗牙, 洁牙, 龈上, 龈下, 刮治, 牙周, 喷砂, 细洁] }
- { value: preventive, any: [涂氟, 窝沟封闭, 封闭, 防龋, OHI, 口腔卫生宣教] }
- { value: surgical, any: [拔除, 拔牙, 切开, 翻瓣, 切除, 系带, 脓肿, 囊肿] }
- { value: pediatric, any: [乳牙, 儿童, 年轻恒牙] }
# planned 语义:计划本就以"建议/拟/推荐"措辞 → 不剥,只剥纯条件词(必要时/如需/择期)。
# 例 "建议全口洁治后,必要时正畸治疗" → 丢"必要时正畸治疗" → "建议全口洁治后" → periodontic。
keyword_strip_clauses: [必要时, 如需, 择期]
......@@ -34,257 +34,18 @@ field_mapping:
# ① ICD K 大类直通(已 substring 的 stdCode);② 中文标准术语 → K 码白名单(草案,⚠️ 待牙医 review)
# 实测 ~98% 诊断没填 stdCode,只给标准中文名,这张表把高频高置信术语救回 K 码。
# 不在白名单的(复合 / 不确定 / 流程性,如"龋(16.继发龋)"、"种植术后")→ _default → code=null。
enum_mapping:
code:
# K 大类直通
K00: K00
K01: K01
K02: K02
K03: K03
K04: K04
K05: K05
K06: K06
K07: K07
K08: K08
K09: K09
K10: K10
K11: K11
K12: K12
K13: K13
K14: K14
# ── 中文术语 → K 码(高置信草案,trim 已去尾部标点)──
# K05 牙周 / 牙龈
慢性牙龈炎: K05
牙龈炎: K05
慢性龈炎: K05
龈炎: K05
菌斑性龈炎: K05
菌斑性牙龈炎: K05 # W4 末补,DW top 200 漏配("牙龈"vs"龈"长写)
慢性牙周炎: K05
牙周炎: K05
重度牙周炎: K05
中度牙周炎: K05
侵袭性牙周炎: K05
# K02 龋
: K02
龋齿: K02
龋坏: K02
浅龋: K02
中龋: K02
深龋: K02
继发龋: K02
# ⚠️ 深窝沟 故意不映射(落 _default → code=null,不召、病历照原文显示):
# 它是龋【风险】(窝沟深易蛀,无龋洞),对症是窝沟封闭(preventive 预防),
# 不属于"应治未治(龋洞没补)"召回范畴。归任何疾病码都会误召(预防治疗满足不了"已治"闸)。
# K04 牙髓 / 根尖周
牙髓炎: K04
慢性牙髓炎: K04
急性牙髓炎: K04
根尖周炎: K04
慢性根尖周炎: K04
慢性根尖炎: K04
急性根尖周炎: K04
牙髓坏死: K04
# K03 牙体硬组织其他(楔缺 / 缺损 / 残根冠)
楔状缺损: K03
楔形缺损: K03
楔缺: K03
牙体缺损: K03
残根: K03
残冠: K03
# K01 阻生 / 埋伏
阻生齿: K01
阻生牙: K01
阻生: K01
埋伏牙: K01
# K07 牙颌面异常 / 错颌
错颌畸形: K07
牙列不齐: K07
牙列拥挤: K07
安氏I类错颌畸形: K07
安氏II类错颌畸形: K07
安氏III类错颌畸形: K07
# K08 缺牙 / 缺失
牙缺失: K08
缺失: K08
缺失牙: K08
牙列缺损: K08
牙列缺失: K08
后天性牙齿缺失: K08
全口牙列缺失: K08
上颌牙列缺损: K08
下颌牙列缺损: K08
废用牙: K08 # 临床功能性缺失
无功能牙: K08
# ── W3 末扩 K00-K08 全覆盖(源 DW 数据驱动,见 dw-data-source-issues #15)──
# ── 字典分层(2026-07 重构):临床通用层抽到 _shared/dict,本地只留 jvs-dw 判例 ──
# 合并语义:本地 enum 同 key 覆盖共享;本地 keyword 规则优先;_default 本地声明。
dict_includes:
- ../../_shared/dict/diagnosis-kcode.yaml
# K00 牙发育 / 萌出障碍 — 只收"真病种",不收"乳牙列 / 混合牙列"等正常生理态(走 _default 不入诊断)
乳牙滞留: K00
滞留乳牙: K00
乳牙早失: K00
乳牙松动: K00 # 替换期非自然脱落
替换期乳牙松动: K00
松动乳牙: K00
多生牙: K00
额外牙: K00
埋伏多生牙: K00
根方多生牙: K00
间多生牙: K00
腭侧多生牙: K00
前牙区埋伏多生牙: K00
先天缺失: K00
先天缺牙: K00
enum_mapping:
code:
# ⭐ "牙齿缺少" 实际是 host 通用术语,大多用于成人后天缺失(临床路径=种植/修复,跟 K08 完全一致)
# 之前误归 K00 导致陆伟根(62 岁)等成人患者出现"先天/萌出处置"链 — 不合临床
# 改归 K08 — 跟 "牙缺失"/"后天性牙齿缺失" 同处理
# 改归 K08 — 跟 "牙缺失"/"后天性牙齿缺失" 同处理。【宿主判例:jvs-dw 用词语义,不入共享层】
牙齿缺少: K08
釉质发育不全: K00 # = K00.2 釉质形成
釉质发育不良: K00
牙釉质发育不全: K00
牙釉质发育不良: K00
氟斑牙: K00 # K00.3 牙齿氟中毒着色
四环素牙: K00 # K00.3 内源性着色
迟萌: K00 # K00.6 萌出障碍
恒牙迟萌: K00
萌出迟缓: K00
萌出不全: K00
异位萌出: K00
萌出间隙不足: K00
部分萌出: K00
未萌出: K00
牙萌出障碍: K00
牙萌出延迟: K00
# K01 阻生 / 埋伏(补 host 真实用词)
智齿: K01 # host 大量直接录"智齿"作为诊断,实际是阻生齿
阻生智齿: K01
近中阻生: K01
垂直位阻生齿: K01
垂直位智齿: K01
异位阻生: K01
# K03 牙体硬组织其他(补复合 / 不良修复体 / 牙齿磨耗)
牙齿楔状缺损: K03
牙体磨耗: K03
牙磨耗: K03
重度磨耗: K03
不良修复体: K03 # 已存在 host 数据,主要走 restorative / prosthodontic 重做
不良充填体: K03
死髓牙: K03 # 牙体已失活,临床走 prosthodontic 桩冠 / surgical 拔除
修复体脱落: K03
充填脱落: K03
冠折: K03
简单冠折: K03
复杂冠折: K03
根折: K03
牙外伤: K03
# ⚠️ 脱矿 / 牙本质敏感 故意不映射(落 _default → code=null):
# 脱矿=早期龋【风险】(对症涂氟,预防)、牙本质敏感=【症状】(对症脱敏,非修复缺损)。
# 跟已 null 的"牙釉质脱矿/釉质脱矿"口径统一,均不作"应治未治"召回信号。
# K05 牙周 / 牙龈(补 host 真实高频用词)
牙周病: K05
全口慢性牙周炎: K05
萌出性龈炎: K05 # 实际牙龈炎,临床路径同 K05
# ⚠️ 牙菌斑堆积 不映射(卫生/菌斑【风险】,对症洁治/宣教=预防);菌斑性龈炎是真龈炎,保留 K05
# K06 牙龈 / 牙槽嵴疾患(原本走 _default → code=null,W3 末归 K06)
牙周脓肿: K06
慢性牙周脓肿: K06
急性牙周脓肿: K06
冠周炎: K06 # K05.2 / K06 边缘,临床归 K06 (智齿冠周特化)
智齿冠周炎: K06
急性冠周炎: K06
慢性冠周炎: K06
牙龈萎缩: K06
龈萎缩: K06
牙龈增生: K06
龈增生: K06
药物性牙龈增生: K06
牙龈瘤: K06
龈瘤: K06
龈息肉: K06
根分叉病变: K06 # K05.x 并发,但临床上独立标
重度根分叉病变: K06
# ⚠️ 食物嵌塞 不映射(【症状】,对症调牙合/牙周处置,非"应治未治"病灶)→ 落 _default code=null
附着丧失: K06
附着龈缺如: K06
牙槽骨缺损: K06
牙槽骨骨尖: K06
牙槽嵴: K06
唇系带附着低: K06
唇系带附着过低: K06
唇系带附丽过低: K06
唇系带附着异常: K06
上唇系带附着低: K06
上唇系带附着异常: K06
舌系带过短: K06
舌系带短: K06
舌系带附着低: K06
舌系带附着异常: K06
舌系带附着过前: K06
系带异常: K06
# K09 牙发生囊肿(根尖囊肿/含牙囊肿/颌骨囊肿)— DW 真实数据 ~170 条,临床必摘除
根尖囊肿: K09
根尖周囊肿: K09
慢性根尖囊肿: K09
含牙囊肿: K09
颌骨囊肿: K09
上颌骨囊肿: K09
下颌骨囊肿: K09
牙源性囊肿: K09
# K07 错颌畸形(补"合"字版本 + 安氏分类异写)
错合畸形: K07 # host 用"合"而非"颌"也很多
错合畸形安氏Ⅰ类: K07
错合畸形安氏Ⅱ类: K07
错合畸形安氏Ⅲ类: K07
错合畸形安氏II类: K07 # 阿拉伯数字版本
错合畸形安氏III类: K07
安氏I类: K07
安氏II类: K07
安氏III类: K07
安氏Ⅰ类: K07
安氏Ⅱ类: K07
安氏Ⅲ类: K07
前牙反合: K07
前牙反颌: K07
深覆合: K07
深覆颌: K07
牙位置异常: K07
骨性I类: K07
骨性II类: K07
骨性III类: K07
骨性Ⅰ类: K07
骨性Ⅱ类: K07
骨性Ⅲ类: K07
# 兜底:翻不出 → 交下面 keyword_mapping 含词兜底;再不中 → 空 → code=null(不丢 fact)
# 兜底:翻不出 → 共享层 keyword_mapping 含词兜底;再不中 → 空 → code=null(不丢 fact)
_default: ""
# ─────────────────────────────────────────────────────────
# 含词兜底 —— 精确 enum 未命中时,按序含词匹配 → K 码。
# 治本长尾:诊断常是复合/变体("埋伏阻生;"、"前倾位阻生,颌面龋"、"牙齿缺失"、"窝沟龋"…),
# 精确白名单永远漏(沈建锋 28/38 阻生智齿 → null → 漏召)。引擎按 canonicalKey 通用。
# 顺序=优先级:阻生/缺失/牙髓 在 龋 之前 → 复合"阻生+龋"判 K01(智齿该评估拔除,非补)。
# ⚠️ 龋:any=[龋] + none=[风险,可疑,脱矿] —— 排除"高龋风险/可疑龋"(=风险,非龋洞,同深窝沟不召);
# 深窝沟/食物嵌塞/牙本质敏感 不含上述关键词 → 仍落 null,故意不召(无回归)。
keyword_mapping:
code:
- { value: K08, any: [缺失, 缺牙, 牙列缺损] }
- { value: K01, any: [阻生, 埋伏, 智齿] }
- { value: K09, any: [颌骨囊肿, 含牙囊肿, 根尖囊肿] }
- { value: K04, any: [牙髓炎, 牙髓坏死, 根尖周, 根尖炎, 牙髓] }
- { value: K03, any: [楔状, 残根, 残冠, 隐裂, 牙体缺损, 牙折] }
- { value: K05, any: [牙周炎, 龈炎, 牙周袋] }
- { value: K02, any: [], none: [风险, 可疑, 脱矿] }
# 牙磨耗 → 牙体损伤 K03(过度/中度/重度/牙齿磨耗… 一次收全 host 变体,补 enum 精确词漏的)。
# 放 K02/K05 之后:复合名"龋+磨耗""磨耗+牙周炎"让位给更主要的龋/牙周。
# none 排:生理性/轻度磨耗(正常生理,无需修复)+ 活动义齿/人工牙磨耗(假牙磨损=修复体重做,非牙体)。
- { value: K03, any: [磨耗], none: [生理, 轻度, 义齿, 人工牙] }
# K07 错颌/正畸族 含词兜底 —— 精确白名单总漏变体(错牙合/开颌/反颌/深覆/间隙/拥挤/安氏…)。
# 放最后:K08(缺牙间隙)/K09(颌骨囊肿)等已在前面先吃;none 再兜一层防"缺牙间隙"误判正畸。
# 注:反合/开合/对刃合 = 反牙合/开牙合 的"合"简写(host 高频:反合 120+),crossbite/openbite 都是正畸。
- { value: K07, any: [错颌, 错合, 错牙合, 锁颌, 偏颌, 开颌, 反颌, 开牙合, 反牙合, 反合, 开合, 对刃合, 深覆, , 前突, 拥挤, 安氏, 间隙], none: [缺牙, 缺失, 牙列缺损, 嵌塞] }
......@@ -25,19 +25,14 @@ field_mapping:
doctorId: user_id # 接诊医生(从 emr 父级继承,影像拍摄/解读医生)
doctorName: doctor_name
# ── 字典分层(2026-07 重构):真影像类型在 _shared/dict;单据/化验类名目留本地 ──
dict_includes:
- ../../_shared/dict/image-modality.yaml
enum_mapping:
# host check_name → PAC modality 闭集(pa/bw/pano/cbct/intraoral_photo/scan/other)
# 真影像归对应类型;化验/表单/记录类(血常规/牙周大表/登记表…)无影像语义,归 other
# host check_name → PAC modality:化验/表单/记录类(无影像语义)归 other(本 host 名目)
modality:
"口内像照片": intraoral_photo
"面相照": intraoral_photo
"内窥镜": intraoral_photo
"小牙片": pa
"全景片/头颅正侧位片截图": pano
"全景片/侧位片/其他X线影像": pano
"CT影像截图": cbct
"口腔扫描": scan
"其他类型资料(非X影像)": other
"牙周大表": other
"血常规": other
"拔牙术前清单": other
......
......@@ -29,68 +29,14 @@ field_mapping:
# treat_name 自由文本,enum_mapping cover 高频"建议 XX"白名单
# 长尾 _default: '' parser 跳过(不入 recommendation_record fact)
enum_mapping:
code:
# ── 种植 ──
建议种植: IMPLANT_RECOMMENDED
建议种植修复: IMPLANT_RECOMMENDED
推荐种植: IMPLANT_RECOMMENDED
建议种植治疗: IMPLANT_RECOMMENDED
建议种植牙: IMPLANT_RECOMMENDED
# ── 戴冠 / 修复 ──
建议戴冠: CROWN_RECOMMENDED
建议冠修复: CROWN_RECOMMENDED
建议全冠: CROWN_RECOMMENDED
建议桩核冠: CROWN_RECOMMENDED
建议做冠: CROWN_RECOMMENDED
推荐冠修复: CROWN_RECOMMENDED
# ── 字典分层(2026-07 重构):标准"建议X"词典在 _shared/dict;本地留 host 标点变体 ──
dict_includes:
- ../../_shared/dict/recommendation-code.yaml
# ── 充填 ──
建议充填: FILLING_RECOMMENDED
enum_mapping:
code:
# host 数据尾标点残留(normalize 前旧形态,保真保留)
"建议充填。": FILLING_RECOMMENDED
建议树脂充填: FILLING_RECOMMENDED
建议补牙: FILLING_RECOMMENDED
# ── 牙周基础 ──
建议洁牙: SRP_RECOMMENDED
建议龈上洁治: SRP_RECOMMENDED
建议牙周治疗: SRP_RECOMMENDED
建议牙周基础治疗: SRP_RECOMMENDED
# ── 拔除 ──
建议拔除: EXTRACTION_RECOMMENDED
"建议拔除。": EXTRACTION_RECOMMENDED
建议拔牙: EXTRACTION_RECOMMENDED
推荐拔除: EXTRACTION_RECOMMENDED
# ── 复查 ──
建议年度复查: ANNUAL_REVIEW_RECOMMENDED
建议定期复查: ANNUAL_REVIEW_RECOMMENDED
建议复查: ANNUAL_REVIEW_RECOMMENDED
# ── 正畸咨询 ──
建议正畸咨询: ORTHO_CONSULT_RECOMMENDED
建议正畸: ORTHO_CONSULT_RECOMMENDED
建议矫正: ORTHO_CONSULT_RECOMMENDED
_default: "" # 未识别"建议X" → 交下面 keyword_mapping 含词兜底;再不中 → 丢弃
# ─────────────────────────────────────────────────────────
# 含词兜底 —— 精确 enum 未命中时,按序含词匹配 → 召回码。
# 治本长尾:"建议X"变体太多(建议充填治疗/建议根管治疗后冠修复/建议拔除后种植…),
# 精确白名单永远漏(谢玉兰 44 "建议充填治疗" 漏配 → null → 44 漏召)。引擎按 canonicalKey 通用。
# 顺序=优先级:高价值/主操作在前(种植>冠、根管>冠、拔除独立)。错配最坏=_default(现状),无回归。
keyword_mapping:
code:
- { value: IMPLANT_RECOMMENDED, any: [种植, 植体] }
- { value: RCT_RECOMMENDED, any: [根管, RCT, 牙髓] }
- { value: EXTRACTION_RECOMMENDED, any: [拔除, 拔牙] }
- { value: CROWN_RECOMMENDED, any: [, , 桩核] }
- { value: FILLING_RECOMMENDED, any: [充填, 补牙, 树脂] }
- { value: HARD_TISSUE_REPAIR_RECOMMENDED, any: [楔状, 牙体, 嵌体, 缺损] }
- { value: SRP_RECOMMENDED, any: [洁治, 洗牙, 牙周, 龈下, 刮治] }
- { value: ORTHO_CONSULT_RECOMMENDED, any: [正畸, 矫正, 矫治] }
- { value: GUM_TREATMENT_RECOMMENDED, any: [牙龈, 牙槽嵴, 系带] }
- { value: JAW_CYST_REMOVAL_RECOMMENDED, any: [囊肿] }
- { value: ERUPTION_INTERVENTION_RECOMMENDED, any: [萌出, 乳牙滞留, 多生牙] }
_default: "" # 未识别"建议X" → 共享 keyword 含词兜底;再不中 → 丢弃
......@@ -47,190 +47,65 @@ field_mapping:
# fact_emr_treatment_out ARRAY JOIN JSONExtractArrayRaw(coalesce(treat_plan,'[]')) AS t
# WHERE brand IN ('瑞泰','瑞尔') GROUP BY 1 ORDER BY 2 DESC LIMIT 200`
# 看新出现的高频 treat_name,补到对应 category。
# ── 字典分层(2026-07 重构):临床通用层在 _shared/dict,本地只留 jvs-dw 特有词 ──
# 共享:treatStages 全量 / category 干净临床核心 / keyword+strip(actual 语义变体)。
# 本地:价格表项名·标点变体·长句(host 数据痕迹) + 判例词(拆线→surgical 绑本 host route
# 分流语境;全景片/CBCT 等影像项计作 preventive 是本 host 数据实用主义)。
dict_includes:
- ../../_shared/dict/treat-stages.yaml
- ../../_shared/dict/treatment-category-core.yaml
- ../../_shared/dict/treatment-category-actual-rules.yaml
enum_mapping:
# ── treat_stages (W4 末加) — host step 词 → PAC 标准 enum ──
# 字段名 treatStages 是 PAC 标准(英文 camelCase),内容也是 PAC enum(snake_case)
# host 字面值(开髓/根备/根充等)只在这里出现一次,翻译完进 fact 就是 PAC 标准
# 其他宿主接入只改 yaml 这一段,代码不动
treatStages:
# 牙髓 / 根管
开髓: pulp_extirpation
拔髓: pulp_extirpation
根备: canal_preparation
根管预备: canal_preparation
根充: canal_filling
根管充填: canal_filling
# 牙髓切断术 / 活髓保存(pulpotomy 类 — VPT 终末术式)
# 临床等价:活髓切断 / 部分活髓切断 / 部分牙髓切断 / 冠髓切断 / 干髓 / 盖髓 / 牙髓血运重建
活髓切断: pulpotomy
部分活髓切断: pulpotomy
部分牙髓切断: pulpotomy
冠髓切断: pulpotomy
干髓术: pulpotomy
干髓治疗: pulpotomy
盖髓术: pulpotomy
间接盖髓: pulpotomy
直接盖髓: pulpotomy
牙髓血运重建: pulpotomy
活髓保存: pulpotomy
# 种植
植入: implant_placement
种植体植入: implant_placement
种植一期: implant_placement
种植I期: implant_placement # 罗马数字版(host 实测)
简单种植: implant_placement
复杂种植: implant_placement
即刻种植: implant_placement
延期种植: implant_placement
基台: abutment_placement
种植二期: abutment_placement
种植II期: abutment_placement # 罗马数字版(host 实测)
上部修复: crown_placement
种植冠修复: crown_placement
种植戴牙: crown_placement
种植三期: crown_placement
# 牙周
龈上洁治: supragingival_scaling
龈下刮治: subgingival_scaling
刮治: subgingival_scaling
牙周维护: periodontal_maintenance
# 修复
充填: composite_filling
嵌体: inlay
冠修复: crown_restoration
桩核: post_core
# 正畸
粘附件: bracket_placement
托槽: bracket_placement
矫治器: bracket_placement
保持器: retainer
加力: ortho_adjustment
# 长尾兜底:host stage 词字典外 → 空(不进 PAC,treat_stages 数组减一元素)
_default: ''
category:
# ── 牙周(periodontic)
龈上洁治: periodontic
"龈上洁治。": periodontic
龈上洁治术: periodontic
"龈上洁治术。": periodontic
"龈上洁治术/预防性洁治/洁牙/洗牙": periodontic
龈上洁治+牙周治疗: periodontic
全口龈上洁治: periodontic
# 注:W4 末加 transforms.normalize op 后,DW 中文标点(、,();)已统一到 ASCII,
# 字典只需 ASCII 形态(英文逗号 + 英括号);中文标点条目已被 normalize 折叠到这些
"龈上洁治+牙周治疗": periodontic
"全口龈上洁治,抛光。": periodontic
"全口龈上洁治,抛光": periodontic
"全口龈上洁治。": periodontic
"全口龈上洁治术。": periodontic
全口洁治: periodontic
"全口洁治。": periodontic
全口洁牙: periodontic
全口超声洁治: periodontic
全口超声波洁治: periodontic
全口龈上超声洁治: periodontic
定期全口洁治: periodontic
"定期全口洁治\r\n": periodontic
"全口洁治\r\n": periodontic
定期洁牙: periodontic
洁牙: periodontic
洁治: periodontic
"洁治。": periodontic
洗牙: periodontic
洁治 OHI: periodontic
"洁治+OHI": periodontic
"龈上洁治;细洁": periodontic
"龈上洁治+细洁": periodontic
"龈上洁治+龈下细洁": periodontic
龈下细洁: periodontic
龈上超声洁治: periodontic
牙周基础治疗: periodontic
牙周系统治疗: periodontic
"牙周系统治疗。": periodontic
"OHI\r\n牙周系统治疗": periodontic
牙周治疗: periodontic
牙周维护: periodontic
牙周刮治: periodontic
牙周刮治术: periodontic
龈下刮治: periodontic
龈下刮治术: periodontic
"龈下刮治及根面平整术(>5mm牙周袋)/牙周刮治术/超声龈下清创术": periodontic
"龈下刮治及根面平整术(<5mm牙周袋)/牙周刮治术/超声龈下清创术": periodontic
根面平整术: periodontic
PMTC: periodontic
"PMTC+全口涂氟": periodontic
# W4 末补 DW top 200 漏配
牙周序列治疗: periodontic
系统性牙周治疗: periodontic
"龈上洁治术/预防性洁治/洗牙/洁牙": periodontic # yaml 早期写的是"/洁牙/洗牙"顺序,这里补常见的反顺序
"龈上洁治术/预防性洁治/洗牙/洁牙": periodontic
"定期洁牙,牙周系统治疗": periodontic
"全口洁治+OHI": periodontic
"龈上洁治术/预防性洁治/洁牙/洗牙全口龈上洁治": periodontic # host 行内炸行残留,本质洁牙
"龈上洁治术/预防性洁治/洁牙/洗牙全口龈上洁治": periodontic
# ── 充填修复(restorative)
充填: restorative
"充填。": restorative
充填治疗: restorative
"充填治疗(乳牙单面洞)": restorative
充填术: restorative
树脂充填: restorative
光固化树脂充填: restorative
非美学区树脂充填: restorative
美学区简单树脂充填: restorative
"垫底+充填": restorative
重新充填: restorative
预防性充填: restorative
树脂充填术: restorative
嵌体修复: restorative
嵌体: restorative
戴嵌体: restorative
龋齿充填: restorative
# W4 末补 — 玻璃离子(GIC)类充填(临床: 等价于树脂充填,主要用于乳牙/年轻恒牙/暂封)
玻璃离子充填: restorative
玻璃离子充填术: restorative
"玻璃离子充填术。": restorative
"玻璃离子充填。": restorative
进口玻璃离子充填: restorative
"进口玻璃离子充填术。": restorative
"充填治疗(玻璃离子)": restorative
玻璃离子暂封: restorative
玻璃离子预充填: restorative
# 其他高频补全
充填或嵌体修复: restorative
"充填治疗(乳牙复面洞)": restorative
"恒牙充填治疗(儿科)": restorative
高嵌体修复: restorative
预防性树脂充填: restorative
# ── 牙髓 / 根管(endodontic)
根管治疗: endodontic
# ── 牙髓/根管(endodontic)
"根管治疗(磨牙)": endodontic
"根管治疗(前牙及双尖牙单根管)": endodontic
"根管治疗(前牙及双尖牙多根管/显微根管)": endodontic
"根管治疗+冠修复": endodontic
"根管治疗+充填": endodontic
根管再治疗: endodontic
根管预备: endodontic
根管充填: endodontic
根充: endodontic
RCT: endodontic
牙髓治疗: endodontic
根尖诱导成形术: endodontic
拔髓: endodontic
干髓术: endodontic
盖髓术: endodontic
间接盖髓: endodontic
直接盖髓: endodontic
MTA盖髓: endodontic
冲洗上药: endodontic
# W4 末补
根管治疗后冠修复: endodontic
"RCT+冠修复": endodontic
# W4 末补 — pulpotomy 类(VPT 终末术式,等价于完整 RCT;chain-composer 走 terminalSteps 走闭环)
# 已在前面列出的 干髓术 / 盖髓术 / 直接盖髓 / 间接盖髓 / MTA盖髓 / 拔髓 / 开髓 / 牙髓治疗 不再重复
活髓切断术: endodontic
部分活髓切断术: endodontic
部分牙髓切断术: endodontic
"活髓切断术+预成冠修复": endodontic
"活髓切断术+预成冠": endodontic
"活髓切断+预成冠修复": endodontic
......@@ -238,134 +113,48 @@ enum_mapping:
"活髓切断术+全瓷冠冠修复": endodontic
"活髓切断术+全瓷预成冠修复": endodontic
"活髓,活髓切断术": endodontic
活髓切断: endodontic
乳牙活髓切断术: endodontic
"乳牙活髓切断术+冠修复": endodontic
"乳牙活髓保存+冠修复": endodontic
"活髓保存+冠修复": endodontic
乳牙活髓保存术: endodontic
"乳牙活髓保存术+冠修复": endodontic
冠髓切断术: endodontic
"冠髓切断术(乳牙)": endodontic
"冠髓切断术(乳牙)+预成冠修复": endodontic
"冠髓切断术+预成冠修复": endodontic
"恒牙冠髓切断术(儿科)": endodontic
干髓治疗: endodontic
直接盖髓术: endodontic
间接盖髓术: endodontic
"间接盖髓术+预成冠修复": endodontic
牙髓血运重建: endodontic
# 牙髓相关其他术式(中间步骤,subtype 词根 fallback,无终末效力)
开髓引流: endodontic
开髓失活: endodontic
开髓开放: endodontic
开髓封药: endodontic
"开髓,封药": endodontic
开髓封失活剂: endodontic
"开髓,封失活剂": endodontic
牙髓失活: endodontic
封失活剂: endodontic
放失活剂: endodontic
放置失活剂: endodontic
失活: endodontic
乳牙牙髓治疗: endodontic
"乳牙牙髓治疗+冠修复": endodontic
髓腔消毒: endodontic
髓腔封药: endodontic
髓腔预备: endodontic
髓腔换药: endodontic
保髓治疗: endodontic
牙髓保留: endodontic
根管治疗术: endodontic
"根管治疗术(乳磨牙封失活剂法)": endodontic
"根管治疗术(乳磨牙直接拔髓多步法)": endodontic
"根管治疗术(复杂乳牙封失活剂法)": endodontic
"根管治疗术(复杂乳牙直接拔髓多次法)": endodontic
"根管治疗术(乳前牙直接拔髓多步法)": endodontic
"根管治疗(封失活剂)": endodontic
复杂根管治疗: endodontic
# ── 种植(implant)
种植: implant
种植手术: implant
种植体植入: implant
种植修复: implant
种植戴牙: implant
种植一期: implant
种植二期: implant
种植三期: implant
种植耗材: implant
种植基台: implant
种植取模: implant
种植拆线: implant
# 光杆"拆线"= 术后护理(外科动作);此前被 route 分流到 review 不算治疗 →
# 术后复诊日 EMR 复述缺失诊断时,同日拆线无法证明"已启动"→ 误召(一线反馈①)
拆线: surgical
"种植冠修复(非美学区单颗)": implant
"简单种植术(非美学区,单颗)": implant
"复杂种植术(非美学区,连续缺失/多颗)": implant
"复杂种植术(非美学区,伴同期上颌窦底内提升/同期GBR术)": implant
"复杂种植术(同期上颌窦底外提升术)": implant
"复杂种植术(美学区连续2颗以上或伴骨量不足及GBR术)": implant
即刻种植术: implant
拔除后种植修复: implant
延期种植术: implant
"延期种植术(美学区,单颗)": implant
# W4 末补
拔除后种植: implant
# ── 修复(prostho)— 冠 / 桥 / 义齿 / 桩核
冠修复: prosthodontic
# ── 修复(冠/桥/义齿/桩核)(prosthodontic)
"冠修复(非美学区)": prosthodontic
"冠修复(简单美学区)": prosthodontic
全冠修复: prosthodontic
牙冠修复: prosthodontic
重新冠修复: prosthodontic
戴冠: prosthodontic
粘冠: prosthodontic
拆冠: prosthodontic
戴牙: prosthodontic
桩核: prosthodontic
桩核冠: prosthodontic
固定修复: prosthodontic
活动修复: prosthodontic
重新修复: prosthodontic
修复: prosthodontic
预成冠修复: prosthodontic
牙体预备: prosthodontic
取模: prosthodontic
调合: prosthodontic
调颌: prosthodontic
种植上部修复: prosthodontic
种植体上部修复: prosthodontic
# W4 末补
桩冠修复: prosthodontic
# ── 外科(surgical)— 拔除 / 智齿 / 残根残冠
拔除: surgical
# ── 外科(拔除)(surgical)
拆线: surgical
"拔除。": surgical
拔除术: surgical
拔牙: surgical
牙拔除术: surgical
"牙拔除术(松动乳牙)": surgical
简单牙拔除术: surgical
松动恒牙拔除术: surgical
松动乳牙拔除术: surgical
择期拔除: surgical
阻生齿拔除术: surgical
阻生牙拔除: surgical
"智齿拔除术(正位)": surgical
"智齿拔除术(复杂)": surgical
残根拔除术: surgical
"残根(残冠)拔除术": surgical
"正畸牙拔除术(正位)": surgical
# ── 正畸(orthodontic)
正畸: orthodontic
正畸治疗: orthodontic
隐形正畸: orthodontic
固定正畸: orthodontic
早期矫治: orthodontic
"合垫/预防性矫治/功能矫治/早期阻断性矫治": orthodontic
"简单前牙排齐/安氏I类非拔牙矫治": orthodontic
"安氏I类拔牙矫治(轻中度支抗)": orthodontic
......@@ -374,101 +163,27 @@ enum_mapping:
"安氏II类拔牙矫治(强支抗/种植支抗)": orthodontic
"安氏III类非拔牙矫治-涉及后牙咬合关系调整": orthodontic
"安氏III类拔牙矫治(轻中度支抗)": orthodontic
保持器: orthodontic
正畸保持器: orthodontic
正畸保持: orthodontic
正畸矫治器: orthodontic
正畸辅助治疗: orthodontic
正畸加力: orthodontic
"正畸加力。": orthodontic
加力: orthodontic
粘附件: orthodontic
粘接附件: orthodontic
"粘接全口附件。": orthodontic
重粘托槽: orthodontic
"重粘托槽。": orthodontic
# W4 末补
更换新矫治器: orthodontic
粘接上半口矫治器: orthodontic
粘接全口附件: orthodontic
精调粘接附件: orthodontic
发放新矫治器: orthodontic
"去除矫正器,配戴保持器保持现有咬合关系": orthodontic # 长句结尾去保持器
精细调整: orthodontic
"去除矫正器,配戴保持器保持现有咬合关系": orthodontic
"精细调整。": orthodontic
"精调粘接附件。": orthodontic
发放矫治器: orthodontic
"发放新矫治器。": orthodontic
"去除矫正器,配戴保持器保持现有咬合关系。": orthodontic
# ── 预防(preventive)
涂氟: preventive
全口涂氟: preventive
"牙面清洁,涂氟": preventive
窝沟封闭: preventive
"窝沟封闭。": preventive
窝沟封闭术: preventive
OHI: preventive
"OHI,涂氟": preventive
口腔卫生宣教: preventive
口腔检查: preventive
全口检查: preventive
常规检查: preventive
脱敏: preventive
抛光: preventive
全景片: preventive
CBCT: preventive
曲面断层: preventive
根尖片: preventive
# ── 美学(cosmetic)
美白: cosmetic
冷光美白: cosmetic
牙齿美白: cosmetic
牙位图美白: cosmetic
贴面: cosmetic
贴面修复: cosmetic
# 长尾兜底:未命中 → category='',parser 跳过该 fact(silently warn)
# 故意不纳入(已被 transforms.route_by_pattern 分流走):
# 常规复查 / 复查 / 定期复查 / 检查(无具体内容) / 暂观 / 观察 / 无治疗 / 重复 / 取资料 / 拆线
# 建议XX / 推荐XX(走 recommendation_record)
_default: ""
# ─────────────────────────────────────────────────────────
# 关键词分类兜底 —— 精确 enum_mapping 未命中时,按序含词匹配 → 赋 category。
# 治本长尾:treatName 2万+ distinct 精确字典覆盖不全,以前全靠 _default:'' 丢(→ 误召)。
# 引擎算法(切段 / 含词 / 按序裁决 / 剥离从句)host 无关;此处规则词 = 本 host 术式特征(host 差异)。
# 只覆盖【真治疗】10 大类;流程/无操作(观察/复诊/无治疗)不在此 → 落 _default 丢弃
# (review 噪音已由 transforms.route_by_pattern 上游分流,这里不重复)。
# 顺序 = 优先级:主操作/高价值在前 → 关键词赢复合(种植>冠、根管>冠、操作词>人群词)。
# ⚠️ 安全:只接管精确未命中的长尾,精确命中零影响;错配最坏退化=_default(现状),无回归。
keyword_mapping:
category:
# ⚠️ "二期" 必须限定到「种植二期」:裸"二期"会误吞"二期隐形矫正"(正畸)等 → 误判 implant。
# 种植语境的二期都带"种植"(种植二期);ortho 的"二期隐形矫正/二期矫正"靠下面 orthodontic 兜住。
- { value: implant, any: [种植, 即拔即种, 植体, 种植二期] }
- { value: endodontic, any: [根管, RCT, 牙髓, 开髓, 根备, 根充, 盖髓, 摘髓, 根尖] }
- { value: orthodontic, any: [正畸, 矫治, 矫正, 托槽, 保持器, 粘附件, 隐适美, 隐形矫, 扩弓, 错颌, 错合] }
- { value: cosmetic, any: [贴面, 漂白, 美白] }
# 修复/备牙/取模:收 C.10 治疗痕迹(修复后/修复术后/全瓷桥修复后/备牙后/重新取模后)。
# 排在 implant/endo/ortho/cosmetic 之后 → 种植修复→implant、根管…修复→endo 仍被前面抢走。
# "嵌体修复"等 restorative 已由上方精确 enum 先命中,不受裸"修复"影响。
- { value: prosthodontic, any: [, , 义齿, 修复体, 修复, 备牙, 取模, 桩核, 桩冠, 戴牙, 全瓷, 烤瓷, 重新粘接] }
# ⭐ 明确充填动作(充填/去腐/备洞/嵌体/垫底/补牙)压过 preventive:
# "去腐,备洞,...树脂充填,窝沟封闭"(dispose 散文)是补牙(restorative),不能因含"窝沟封闭"
# 被误判 preventive → 非 resolver → 误召(马思煦@46)。注:"开髓去腐"等根管语境已被上方 endodontic 先收。
- { value: restorative, any: [充填, 补牙, 去腐, 备洞, 嵌体, 垫底] }
# 纯封闭(无充填动作)→ preventive:玻璃离子常作封闭剂材料("玻璃离子窝沟封闭"≠充填)
- { value: preventive, any: [窝沟封闭, 封闭剂, 点隙封闭] }
# 材料弱词:放 preventive 后 —— "玻璃离子窝沟封闭" 已被上面 preventive 收;裸"树脂/玻璃离子"→ restorative
- { value: restorative, any: [树脂, 玻璃离子] }
# 牙周去裸"洁牙"(避开自由文本"清洁牙面"误命中);洁牙/全口洁牙等精确词由上方 enum_mapping 兜
- { value: periodontic, any: [洁治, 洗牙, 龈上, 龈下, 刮治, 牙周, 喷砂, 细洁] }
- { value: preventive, any: [涂氟, 防龋, OHI, 口腔卫生宣教] }
- { value: surgical, any: [拔除, 拔牙, 切开, 翻瓣, 切除, 系带, 脓肿, 囊肿, 植骨] }
- { value: pediatric, any: [乳牙, 儿童, 年轻恒牙] }
# actual 语义:这些词开头的从句 = 本次没做(条件/未来/建议)→ 切段丢弃后再匹配。
# 例 "充填,必要时根管治疗" → 丢"必要时根管治疗" → "充填" → restorative(不误判成 endodontic)。
keyword_strip_clauses: [必要时, 如需, 择期, 建议, 推荐, 考虑, ] # 若…=条件从句(若牙面脱矿,建议充填),非本次实际治疗
......@@ -43,178 +43,64 @@ field_mapping:
#
# 维护:跑 SQL `SELECT DISTINCT treatName, count() FROM ... GROUP BY 1 ORDER BY 2 DESC LIMIT 200`
# 看新出现的高频项,补到本表。
# ── 字典分层(2026-07 重构):同 treatment_actual,keyword 用 planned 语义变体 ──
# 本地残差含 normalize 前的中文标点死条目(输入已归一不会再命中;行为保真原样保留,
# 清理属行为无关但需单独验证,另行提交)。
dict_includes:
- ../../_shared/dict/treat-stages.yaml
- ../../_shared/dict/treatment-category-core.yaml
- ../../_shared/dict/treatment-category-planned-rules.yaml
enum_mapping:
# treat_stages 跟 treatment_actual.yaml 完全相同(W4 末加)
treatStages:
开髓: pulp_extirpation
拔髓: pulp_extirpation
根备: canal_preparation
根管预备: canal_preparation
根充: canal_filling
根管充填: canal_filling
# 牙髓切断术 / 活髓保存(pulpotomy 类 — VPT 终末术式)
活髓切断: pulpotomy
部分活髓切断: pulpotomy
部分牙髓切断: pulpotomy
冠髓切断: pulpotomy
干髓术: pulpotomy
干髓治疗: pulpotomy
盖髓术: pulpotomy
间接盖髓: pulpotomy
直接盖髓: pulpotomy
牙髓血运重建: pulpotomy
活髓保存: pulpotomy
植入: implant_placement
种植体植入: implant_placement
种植一期: implant_placement
种植I期: implant_placement # 罗马数字版(host 实测)
简单种植: implant_placement
复杂种植: implant_placement
即刻种植: implant_placement
延期种植: implant_placement
基台: abutment_placement
种植二期: abutment_placement
种植II期: abutment_placement # 罗马数字版(host 实测)
上部修复: crown_placement
种植冠修复: crown_placement
种植戴牙: crown_placement
种植三期: crown_placement
龈上洁治: supragingival_scaling
龈下刮治: subgingival_scaling
刮治: subgingival_scaling
牙周维护: periodontal_maintenance
充填: composite_filling
嵌体: inlay
冠修复: crown_restoration
桩核: post_core
粘附件: bracket_placement
托槽: bracket_placement
矫治器: bracket_placement
保持器: retainer
加力: ortho_adjustment
_default: ''
category:
# ── 牙周(periodontic)— 龈上洁治 / 牙周治疗 各种写法
龈上洁治: periodontic
# ── 牙周(periodontic)
"龈上洁治。": periodontic
龈上洁治术: periodontic
"龈上洁治术。": periodontic
"龈上洁治术/预防性洁治/洁牙/洗牙": periodontic
龈上洁治+牙周治疗: periodontic
全口龈上洁治: periodontic
"龈上洁治+牙周治疗": periodontic
"全口龈上洁治、抛光。": periodontic
"全口龈上洁治,抛光。": periodontic
"全口龈上洁治,抛光": periodontic
"全口龈上洁治。": periodontic
"全口龈上洁治术。": periodontic
全口洁治: periodontic
"全口洁治。": periodontic
全口洁牙: periodontic
全口超声洁治: periodontic
全口超声波洁治: periodontic
全口龈上超声洁治: periodontic
定期全口洁治: periodontic
"定期全口洁治\r\n": periodontic
"全口洁治\r\n": periodontic
定期洁牙: periodontic
洁牙: periodontic
洁治: periodontic
"洁治。": periodontic
洗牙: periodontic
洁治 OHI: periodontic
"洁治+OHI": periodontic
"龈上洁治;细洁": periodontic
"龈上洁治+细洁": periodontic
"龈上洁治+龈下细洁": periodontic
龈下细洁: periodontic
龈上超声洁治: periodontic
牙周基础治疗: periodontic
牙周系统治疗: periodontic
"牙周系统治疗。": periodontic
"OHI\r\n牙周系统治疗": periodontic
牙周治疗: periodontic
牙周维护: periodontic
牙周刮治: periodontic
牙周刮治术: periodontic
龈下刮治: periodontic
龈下刮治术: periodontic
"龈下刮治及根面平整术(>5mm牙周袋)/牙周刮治术/超声龈下清创术": periodontic
"龈下刮治及根面平整术(<5mm牙周袋)/牙周刮治术/超声龈下清创术": periodontic
根面平整术: periodontic
PMTC: periodontic
"PMTC+全口涂氟": periodontic
# W4 末补
牙周序列治疗: periodontic
系统性牙周治疗: periodontic
"龈上洁治术/预防性洁治/洗牙/洁牙": periodontic
"定期洁牙,牙周系统治疗": periodontic
"全口洁治+OHI": periodontic
"龈上洁治术/预防性洁治/洁牙/洗牙全口龈上洁治": periodontic
# ── 充填修复(restorative)
充填: restorative
"充填。": restorative
充填治疗: restorative
"充填治疗(乳牙单面洞)": restorative
充填术: restorative
树脂充填: restorative
光固化树脂充填: restorative
非美学区树脂充填: restorative
美学区简单树脂充填: restorative
"垫底+充填": restorative
重新充填: restorative
预防性充填: restorative
树脂充填术: restorative
嵌体修复: restorative
嵌体: restorative
戴嵌体: restorative
龋齿充填: restorative
# W4 末补 — 玻璃离子(GIC)类充填(临床: 等价于树脂充填,主要用于乳牙/年轻恒牙/暂封)
玻璃离子充填: restorative
玻璃离子充填术: restorative
"玻璃离子充填术。": restorative
"玻璃离子充填。": restorative
进口玻璃离子充填: restorative
"进口玻璃离子充填术。": restorative
"充填治疗(玻璃离子)": restorative
玻璃离子暂封: restorative
玻璃离子预充填: restorative
# 其他高频补全
充填或嵌体修复: restorative
"充填治疗(乳牙复面洞)": restorative
"恒牙充填治疗(儿科)": restorative
高嵌体修复: restorative
预防性树脂充填: restorative
# ── 牙髓 / 根管(endodontic)
根管治疗: endodontic
# ── 牙髓/根管(endodontic)
"根管治疗(磨牙)": endodontic
"根管治疗(前牙及双尖牙单根管)": endodontic
"根管治疗(前牙及双尖牙多根管/显微根管)": endodontic
"根管治疗+冠修复": endodontic
"根管治疗+充填": endodontic
根管再治疗: endodontic
根管预备: endodontic
根管充填: endodontic
根充: endodontic
RCT: endodontic
牙髓治疗: endodontic
根尖诱导成形术: endodontic
拔髓: endodontic
干髓术: endodontic
盖髓术: endodontic
间接盖髓: endodontic
直接盖髓: endodontic
MTA盖髓: endodontic
冲洗上药: endodontic
# W4 末补
根管治疗后冠修复: endodontic
"RCT+冠修复": endodontic
# W4 末补 — pulpotomy 类 + 牙髓相关术式(跟 treatment_actual.yaml 同源)
活髓切断术: endodontic
部分活髓切断术: endodontic
部分牙髓切断术: endodontic
"活髓切断术+预成冠修复": endodontic
"活髓切断术+预成冠": endodontic
"活髓切断+预成冠修复": endodontic
......@@ -222,129 +108,46 @@ enum_mapping:
"活髓切断术+全瓷冠冠修复": endodontic
"活髓切断术+全瓷预成冠修复": endodontic
"活髓,活髓切断术": endodontic
活髓切断: endodontic
乳牙活髓切断术: endodontic
"乳牙活髓切断术+冠修复": endodontic
"乳牙活髓保存+冠修复": endodontic
"活髓保存+冠修复": endodontic
乳牙活髓保存术: endodontic
"乳牙活髓保存术+冠修复": endodontic
冠髓切断术: endodontic
"冠髓切断术(乳牙)": endodontic
"冠髓切断术(乳牙)+预成冠修复": endodontic
"冠髓切断术+预成冠修复": endodontic
"恒牙冠髓切断术(儿科)": endodontic
干髓治疗: endodontic
直接盖髓术: endodontic
间接盖髓术: endodontic
"间接盖髓术+预成冠修复": endodontic
开髓引流: endodontic
开髓失活: endodontic
开髓开放: endodontic
开髓封药: endodontic
"开髓,封药": endodontic
开髓封失活剂: endodontic
"开髓,封失活剂": endodontic
牙髓失活: endodontic
封失活剂: endodontic
放失活剂: endodontic
放置失活剂: endodontic
失活: endodontic
乳牙牙髓治疗: endodontic
"乳牙牙髓治疗+冠修复": endodontic
髓腔消毒: endodontic
髓腔封药: endodontic
髓腔预备: endodontic
髓腔换药: endodontic
保髓治疗: endodontic
牙髓保留: endodontic
根管治疗术: endodontic
"根管治疗术(乳磨牙封失活剂法)": endodontic
"根管治疗术(乳磨牙直接拔髓多步法)": endodontic
"根管治疗术(复杂乳牙封失活剂法)": endodontic
"根管治疗术(复杂乳牙直接拔髓多次法)": endodontic
"根管治疗术(乳前牙直接拔髓多步法)": endodontic
"根管治疗(封失活剂)": endodontic
复杂根管治疗: endodontic
# ── 种植(implant)— 注意"种植上部修复"算 prostho;"种植修复"在 host 文本是合并语,归 implant
种植: implant
种植手术: implant
种植体植入: implant
种植修复: implant
种植戴牙: implant
种植一期: implant
种植二期: implant
种植三期: implant
种植耗材: implant
种植基台: implant
种植取模: implant
种植拆线: implant
# ── 种植(implant)
"种植冠修复(非美学区单颗)": implant
"简单种植术(非美学区,单颗)": implant
"复杂种植术(非美学区,连续缺失/多颗)": implant
"复杂种植术(非美学区,伴同期上颌窦底内提升/同期GBR术)": implant
"复杂种植术(同期上颌窦底外提升术)": implant
"复杂种植术(美学区连续2颗以上或伴骨量不足及GBR术)": implant
即刻种植术: implant
拔除后种植修复: implant
延期种植术: implant
"延期种植术(美学区,单颗)": implant
# W4 末补
拔除后种植: implant
# ── 修复(prostho)— 冠 / 桥 / 义齿 / 桩核
冠修复: prosthodontic
# ── 修复(冠/桥/义齿/桩核)(prosthodontic)
"冠修复(非美学区)": prosthodontic
"冠修复(简单美学区)": prosthodontic
全冠修复: prosthodontic
牙冠修复: prosthodontic
重新冠修复: prosthodontic
戴冠: prosthodontic
粘冠: prosthodontic
拆冠: prosthodontic
戴牙: prosthodontic
桩核: prosthodontic
桩核冠: prosthodontic
固定修复: prosthodontic
活动修复: prosthodontic
重新修复: prosthodontic
修复: prosthodontic
预成冠修复: prosthodontic
牙体预备: prosthodontic
取模: prosthodontic
调合: prosthodontic
调颌: prosthodontic
种植上部修复: prosthodontic
种植体上部修复: prosthodontic
# W4 末补
桩冠修复: prosthodontic
# ── 外科(surgical)— 拔除 / 智齿 / 残根残冠
拔除: surgical
# ── 外科(拔除)(surgical)
"拔除。": surgical
拔除术: surgical
拔牙: surgical
牙拔除术: surgical
"牙拔除术(松动乳牙)": surgical
简单牙拔除术: surgical
松动恒牙拔除术: surgical
松动乳牙拔除术: surgical
择期拔除: surgical
阻生齿拔除术: surgical
阻生牙拔除: surgical
"智齿拔除术(正位)": surgical
"智齿拔除术(复杂)": surgical
残根拔除术: surgical
"残根(残冠)拔除术": surgical
"正畸牙拔除术(正位)": surgical
# ── 正畸(orthodontic)— 实测 host treatName 覆盖了"加力 / 安氏分类 / 矫治器/保持器" 全流程
正畸: orthodontic
正畸治疗: orthodontic
隐形正畸: orthodontic
固定正畸: orthodontic
早期矫治: orthodontic
# ── 正畸(orthodontic)
"合垫/预防性矫治/功能矫治/早期阻断性矫治": orthodontic
"简单前牙排齐/安氏I类非拔牙矫治": orthodontic
"安氏I类拔牙矫治(轻中度支抗)": orthodontic
......@@ -353,87 +156,24 @@ enum_mapping:
"安氏II类拔牙矫治(强支抗/种植支抗)": orthodontic
"安氏III类非拔牙矫治-涉及后牙咬合关系调整": orthodontic
"安氏III类拔牙矫治(轻中度支抗)": orthodontic
保持器: orthodontic
正畸保持器: orthodontic
正畸保持: orthodontic
正畸矫治器: orthodontic
正畸辅助治疗: orthodontic
正畸加力: orthodontic
"正畸加力。": orthodontic
加力: orthodontic
粘附件: orthodontic
粘接附件: orthodontic
"粘接全口附件。": orthodontic
重粘托槽: orthodontic
"重粘托槽。": orthodontic
# W4 末补
更换新矫治器: orthodontic
粘接上半口矫治器: orthodontic
粘接全口附件: orthodontic
精调粘接附件: orthodontic
发放新矫治器: orthodontic
"去除矫正器,配戴保持器保持现有咬合关系": orthodontic
精细调整: orthodontic
"精细调整。": orthodontic
"精调粘接附件。": orthodontic
发放矫治器: orthodontic
"发放新矫治器。": orthodontic
"去除矫正器,配戴保持器保持现有咬合关系。": orthodontic
# ── 预防(preventive)— 涂氟 / 封闭 / 检查
涂氟: preventive
全口涂氟: preventive
# ── 预防(preventive)
"牙面清洁,涂氟": preventive
窝沟封闭: preventive
"窝沟封闭。": preventive
窝沟封闭术: preventive
OHI: preventive
"OHI,涂氟": preventive
口腔卫生宣教: preventive
口腔检查: preventive
全口检查: preventive
常规检查: preventive
脱敏: preventive
抛光: preventive
全景片: preventive
CBCT: preventive
曲面断层: preventive
根尖片: preventive
# ── 美学(cosmetic)
美白: cosmetic
冷光美白: cosmetic
牙齿美白: cosmetic
牙位图美白: cosmetic
贴面: cosmetic
贴面修复: cosmetic
# 长尾兜底:enum_mapping 未命中 → category='',parser 跳过该 fact(silently warn)
# 维护:跑 SQL `SELECT JSONExtractString(t, 'treatName') treat_name, count() FROM
# fact_emr_treatment_out ARRAY JOIN JSONExtractArrayRaw(assumeNotNull(treat_plan)) AS t
# WHERE brand IN ('瑞泰','瑞尔') GROUP BY 1 ORDER BY 2 DESC LIMIT 200`
# 看新出现的高频 treat_name,补到上方对应 category。
# 故意不纳入(归 review / 非治疗 / 流程性 — 已被 transforms.route_by_pattern 分流走):
# 常规复查 / 复查 / 定期复查 / 检查(无具体内容)/ 已交付纸质病历 / 缴费 / 咨询 /
# 听方案 / 沟通治疗方案 / 方案沟通 / 拒绝拍片 / 未拍片 / 治疗中 / 未指定治疗项 / 转诊
# 长尾兜底:未命中 → category='',parser 跳过该 fact
_default: ""
# ─────────────────────────────────────────────────────────
# 关键词分类兜底 —— 跟 treatment_actual 同一套真治疗规则(精确未命中按序含词匹配)。
# 引擎算法 host 无关;规则词 = 本 host 术式特征。只覆盖真治疗 10 类,流程/无操作落 _default。
keyword_mapping:
category:
- { value: implant, any: [种植, 即拔即种, 植体, 二期] }
- { value: endodontic, any: [根管, RCT, 牙髓, 开髓, 根备, 根充, 盖髓, 摘髓] }
- { value: orthodontic, any: [正畸, 矫治, 矫正, 托槽, 保持器, 粘附件, 隐适美, 扩弓] }
- { value: cosmetic, any: [贴面, 漂白, 美白] }
- { value: prosthodontic, any: [, , 义齿, 修复体, 桩核, 桩冠, 戴牙, 全瓷, 烤瓷, 重新粘接] }
- { value: restorative, any: [充填, 补牙, 树脂, 玻璃离子, 嵌体, 垫底] }
- { value: periodontic, any: [洁治, 洗牙, 洁牙, 龈上, 龈下, 刮治, 牙周, 喷砂, 细洁] }
- { value: preventive, any: [涂氟, 窝沟封闭, 封闭, 防龋, OHI, 口腔卫生宣教] }
- { value: surgical, any: [拔除, 拔牙, 切开, 翻瓣, 切除, 系带, 脓肿, 囊肿] }
- { value: pediatric, any: [乳牙, 儿童, 年轻恒牙] }
# planned 语义:计划本就以"建议/拟/推荐"措辞 → 不剥,只剥纯条件词(必要时/如需/择期)。
# 例 "建议全口洁治后,必要时正畸治疗" → 丢"必要时正畸治疗" → "建议全口洁治后" → periodontic。
keyword_strip_clauses: [必要时, 如需, 择期]
import * as fs from 'node:fs';
import * as path from 'node:path';
import * as yaml from 'js-yaml';
import { z } from 'zod';
/**
* 字典 include —— assembler yaml 的 `dict_includes:` 解析与合并。
*
* 动机(多宿主字典分层):enum/keyword 映射词分两类 ——
* ① 临床通用知识(慢性牙髓炎→K04、开髓→pulp_extirpation):跟宿主无关,拷贝会漂移
* (实证:jvs-dw 自己的 treatment_planned 字典已是 treatment_actual 的陈旧拷贝);
* ② 宿主怪癖(价格表项名、标点残留、host 用词判例):共用会互相污染。
* → ① 抽到 data/_shared/dict/*.yaml,宿主 yaml 用 `dict_includes:` 引入;② 留宿主本地。
*
* 用法(assembler yaml 顶层):
* dict_includes:
* - ../../_shared/dict/diagnosis-kcode.yaml # 路径相对本 yaml 文件
*
* 合并语义(⚠️ 三条规则,变更需同步 pac-docs data-ingestion 文档):
* - enum_mapping :同字段逐 key 合并;include 按声明序先铺,本地条目**覆盖**同 key
* (宿主可用本地 `词: ""` 墓碑禁用共享词条 —— "" 与 _default 空值同义)。
* - keyword_mapping:同字段规则数组拼接,**本地规则在前**(引擎首个命中即用 → 宿主优先),
* include 按声明序殿后兜底。
* - keyword_strip_clauses:去重并集,本地在前(引擎对全列表做 startsWith,序无语义)。
* - `_default` 约定留宿主本地声明(共享文件禁止携带,schema 强校验拦截)。
*
* 解析发生在 zod 校验【之前】(loadAllAssemblers),合并产物 = 现行 AssemblerConfig 形状
* → 引擎(assembler-engine)与 schema 零改动;不写 dict_includes 的 yaml 行为分毫不变。
*/
const EnumMapSchema = z.record(z.string(), z.record(z.string(), z.string()));
const KeywordRuleSchema = z.object({
value: z.string(),
any: z.array(z.string().min(1)).min(1),
none: z.array(z.string().min(1)).optional(),
});
const KeywordMapSchema = z.record(z.string(), z.array(KeywordRuleSchema));
/// 共享字典文件形状:只允许三个映射段(strict:打错字段名/夹带 field_mapping 等 fail-fast)。
const DictIncludeFileSchema = z
.object({
enum_mapping: EnumMapSchema.optional(),
keyword_mapping: KeywordMapSchema.optional(),
keyword_strip_clauses: z.array(z.string().min(1)).optional(),
})
.strict()
.superRefine((file, ctx) => {
// _default 是宿主决策(丢弃 or 空码兜底),共享层禁止携带 —— 防止共享文件悄悄改宿主兜底行为
for (const [field, m] of Object.entries(file.enum_mapping ?? {})) {
if (Object.prototype.hasOwnProperty.call(m, '_default')) {
ctx.addIssue({
code: z.ZodIssueCode.custom,
message: `共享字典不得含 _default(enum_mapping.${field});_default 由宿主 yaml 本地声明`,
});
}
}
});
export type DictIncludeFile = z.infer<typeof DictIncludeFileSchema>;
interface RawAssemblerYaml {
dict_includes?: unknown;
enum_mapping?: Record<string, Record<string, string>>;
keyword_mapping?: Record<string, unknown[]>;
keyword_strip_clauses?: string[];
[k: string]: unknown;
}
/**
* 解析 yaml 原始对象里的 dict_includes 并合并,返回可直接过 AssemblerConfigSchema 的对象。
* 无 dict_includes → 原样返回(零开销,老 yaml 完全不走新逻辑)。
* @param raw yaml.load 的原始产物
* @param yamlPath 本 yaml 的绝对路径(include 相对路径的锚点;也用于报错定位)
*/
export function resolveDictIncludes(raw: unknown, yamlPath: string): unknown {
if (raw === null || typeof raw !== 'object') return raw;
const cfg = raw as RawAssemblerYaml;
if (cfg.dict_includes === undefined) return raw;
const incPaths = z.array(z.string().min(1)).min(1).safeParse(cfg.dict_includes);
if (!incPaths.success) {
throw new Error(`${yamlPath}: dict_includes 须为非空字符串数组`);
}
// 1. 逐个加载 include 文件(相对本 yaml;strict 校验)
const includes: DictIncludeFile[] = incPaths.data.map((rel) => {
const abs = path.resolve(path.dirname(yamlPath), rel);
if (!fs.existsSync(abs)) {
throw new Error(`${yamlPath}: dict include 不存在: ${rel}${abs}`);
}
const parsed = yaml.load(fs.readFileSync(abs, 'utf-8'));
const r = DictIncludeFileSchema.safeParse(parsed);
if (!r.success) {
throw new Error(
`共享字典 ${rel} 校验失败(由 ${path.basename(yamlPath)} 引入):\n` +
JSON.stringify(r.error.issues, null, 2),
);
}
return r.data;
});
// 2. enum_mapping:include 按序先铺(后者覆盖前者),本地最后覆盖
const mergedEnum: Record<string, Record<string, string>> = {};
for (const inc of includes) {
for (const [field, m] of Object.entries(inc.enum_mapping ?? {})) {
mergedEnum[field] = { ...mergedEnum[field], ...m };
}
}
for (const [field, m] of Object.entries(cfg.enum_mapping ?? {})) {
mergedEnum[field] = { ...mergedEnum[field], ...m };
}
// 3. keyword_mapping:本地规则在前,include 按序殿后
const mergedKeyword: Record<string, unknown[]> = {};
for (const [field, rules] of Object.entries(cfg.keyword_mapping ?? {})) {
mergedKeyword[field] = [...rules];
}
for (const inc of includes) {
for (const [field, rules] of Object.entries(inc.keyword_mapping ?? {})) {
mergedKeyword[field] = [...(mergedKeyword[field] ?? []), ...rules];
}
}
// 4. keyword_strip_clauses:本地在前去重并集
const strip = [
...(cfg.keyword_strip_clauses ?? []),
...includes.flatMap((i) => i.keyword_strip_clauses ?? []),
];
const mergedStrip = [...new Set(strip)];
// 5. 拼回(剥掉 dict_includes;空段不落 key,与"没写该段"的老形状一致)
const { dict_includes: _drop, ...rest } = cfg;
return {
...rest,
...(Object.keys(mergedEnum).length > 0 ? { enum_mapping: mergedEnum } : {}),
...(Object.keys(mergedKeyword).length > 0 ? { keyword_mapping: mergedKeyword } : {}),
...(mergedStrip.length > 0 ? { keyword_strip_clauses: mergedStrip } : {}),
};
}
......@@ -23,6 +23,7 @@ import {
AssemblerConfigSchema,
type AssemblerConfig,
} from '../assembler/assembler.schema';
import { resolveDictIncludes } from '../assembler/dict-include';
import {
ColdImportManifest,
ColdImportManifestSchema,
......@@ -2139,7 +2140,10 @@ export class ColdImportService {
if (!fs.existsSync(filePath)) {
throw new Error(`Assembler config not found: ${filePath}`);
}
const parsed = yaml.load(fs.readFileSync(filePath, 'utf-8'));
const parsed = resolveDictIncludes(
yaml.load(fs.readFileSync(filePath, 'utf-8')),
filePath,
);
const r = AssemblerConfigSchema.safeParse(parsed);
if (!r.success) {
throw new Error(
......
......@@ -28,6 +28,7 @@ import {
AssemblerConfigSchema,
type AssemblerConfig,
} from '../src/modules/sync/assembler/assembler.schema';
import { resolveDictIncludes } from '../src/modules/sync/assembler/dict-include';
// ─────────────────────────────────────────────
// 闸 1:FactType ↔ FactContentSchemas 完整性
......@@ -109,8 +110,10 @@ function loadAllAssemblerYamls(): YamlFileInfo[] {
if (!fs.existsSync(asmDir)) continue;
for (const f of fs.readdirSync(asmDir)) {
if (!f.endsWith('.yaml') && !f.endsWith('.yml')) continue;
const raw = fs.readFileSync(path.join(asmDir, f), 'utf-8');
const parsed = yaml.load(raw);
const yamlPath = path.join(asmDir, f);
const raw = fs.readFileSync(yamlPath, 'utf-8');
// 走生产同款加载:dict_includes(共享字典分层)在 zod 校验前解析合并
const parsed = resolveDictIncludes(yaml.load(raw), yamlPath);
const r = AssemblerConfigSchema.safeParse(parsed);
if (!r.success) {
throw new Error(
......
......@@ -12,10 +12,12 @@ import * as path from 'path';
import * as yaml from 'js-yaml';
import { classifyByKeyword } from '../src/modules/sync/assembler/assembler-engine';
import { AssemblerConfigSchema } from '../src/modules/sync/assembler/assembler.schema';
import { resolveDictIncludes } from '../src/modules/sync/assembler/dict-include';
function loadCfg(file: string) {
const p = path.join(__dirname, '..', 'data', 'jvs-dw', 'assemblers', file);
const parsed = yaml.load(fs.readFileSync(p, 'utf-8'));
// 走生产同款加载:dict_includes(共享字典分层)在 zod 校验前解析合并
const parsed = resolveDictIncludes(yaml.load(fs.readFileSync(p, 'utf-8')), p);
const r = AssemblerConfigSchema.safeParse(parsed);
if (!r.success) {
throw new Error(`${file} schema invalid:\n${JSON.stringify(r.error.issues, null, 2)}`);
......
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