docs: 诊断编码改归解码开关管

负责人 2026-10-16「诊断编码归开关管,实现统一」:映射表加 Diagnosis 一项(17 项),
管三张表的诊断列;不再从报告表列名取编码含义;decode_codes 为 false 时答案库诊断名留空。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-16 01:18:23 -04:00
parent fa962a2672
commit bcd5932a66
2 changed files with 11 additions and 11 deletions
+10 -10
View File
@@ -9,7 +9,7 @@
来源:
- 负责人 2026-10-16 定:先做「装配两个库」;数据格式和口径以 40 例交付包为准,原话「因为数据改过很多版,所以你们需要对齐“40例交付包”那个」(design 0002 决定 5)。
- 负责人 2026-10-16 定:配置「每段一份」;交付包里的数字编码列「晚点我会找他们要映射表」,解码做成一个可选的超参数,映射表是一份独立的配置文件(`结构.md` 第五部分「配置」)。
- 负责人 2026-10-16 定:配置「每段一份」;交付包里的数字编码列(包括诊断)「晚点我会找他们要映射表」,解码做成一个可选的超参数,映射表是一份独立的配置文件(`结构.md` 第五部分「配置」)。
- 负责人 2026-10-16 定:同一个人在不同表里本应一样的值(金标准、年龄等)要逐例比对;检查没过的病例「都是遇到整个病例跳过,让医生核对去吧(可以记录是哪一个检查没过……因为遇到第一个就整个病例跳过了)」(`AGENTS.md`「错误怎么处理」、`结构.md` 第三部分)。
- 负责人 2026-10-16 定:用化名时,「保存金标准那个库中需要保存化名与真名的映射」。
- 其余做法(检查项的具体内容和顺序、文件格式、构建号、半成品目录、化名形式)是监督者 2026-10-16 提出的,负责人确认任务书时一并认可。
@@ -78,12 +78,12 @@ Sex: {1: ..., 2: ...}
Symptom_Pain: {0: ..., 1: ...}
```
需要映射的编码列共 16 列,名单是 delivery 里的常量:`Sex`;`Symptom_Pain`、`Symptom_Jaundice`、`Symptom_WeightLoss`、`Symptom_Fever`、`Symptom_Asymptomatic`;`Hx_Pancreatitis`、`Hx_Alcohol`、`Hx_Gallstones`、`Hx_Malignancy`、`Hx_Family_PC`;`CA199_Level`、`CEA_Level`、`Amylase_Level`、`Lipase_Level`、`TBil_Level`。
需要映射的编码共 17 项,名单是 delivery 里的常量:`Sex`;`Diagnosis`(同时管临床表的 `Diagnosis` 列和两张报告表的「病理类型」列,三列编码相同);`Symptom_Pain`、`Symptom_Jaundice`、`Symptom_WeightLoss`、`Symptom_Fever`、`Symptom_Asymptomatic`;`Hx_Pancreatitis`、`Hx_Alcohol`、`Hx_Gallstones`、`Hx_Malignancy`、`Hx_Family_PC`;`CA199_Level`、`CEA_Level`、`Amylase_Level`、`Lipase_Level`、`TBil_Level`。
- 映射表必须恰好覆盖这 16 列,多一列或少一列都整次构建停下(T5)。`Sex` 的含义必须是「男」「女」两个汉字,才能和报告表的性别比对(C10)。
- 这 16 列的名单定义在 delivery(它是交付包形状的一部分);T5 由 build 读配置时检查,因为映射表是配置。
- 映射表必须恰好覆盖这 17 项,多一项或少一项都整次构建停下(T5)。`Sex` 的含义必须是「男」「女」两个汉字,才能和报告表的性别比对(C10);`Diagnosis` 的含义必须恰好是 `IPMN`、`SPN`、`MCN`、`SCN` 四个,评价拿它和专家的结论比。
- 这 17 项的名单定义在 delivery(它是交付包形状的一部分);T5 由 build 读配置时检查,因为映射表是配置。
- 映射表还没拿到,**这一步不提交 `config/code_maps.yaml`**,不编造含义。解码路径只用测试里的样例映射表验证。
- 诊断编码不在映射表里:两张报告表的列名「病理类型(1 IPMN,2 SPN,3 MCN,4 SCN)」已经写明了含义,delivery 把这个对应关系写成常量,同时核对列名原文和常量一致(T3),所以不受 `decode_codes` 控制。临床表的 `Diagnosis` 列没有说明,它和报告表逐例一致(C10)才进库,所以同样适用这组含义。
- 诊断编码和其他编码列一样归 `decode_codes` 管(负责人 2026-10-16:「诊断编码归开关管,实现统一」)。报告表列名里写着「1 IPMN,2 SPN,3 MCN,4 SCN」,T3 只把它当表头原文核对,程序不从列名里取含义。诊断不进资料库,所以这个开关对诊断只影响答案库。
## 二、delivery:读交付包、逐例检查
@@ -111,7 +111,7 @@ delivery 只读交付包,交出每例读到的内容和检查结果,不决
| T2 | 每张汇总表恰好有上表那一个工作表,名字一致 |
| T3 | 表头与上表一字不差(含诊断列名里写的编码含义) |
| T4 | `Clinical_agent/`、`MR_agent/` 下各只有自己那张汇总表;`CEUS_agent/` 下只有超声汇总表和三位数字命名的病例目录。多出来的文件说明交付方式变了,不能悄悄忽略 |
| T5 | `decode_codes` 为 true 时,映射表恰好覆盖 16 个编码列,`Sex` 映射到「男」「女」(由 build 检查,见第一部分) |
| T5 | `decode_codes` 为 true 时,映射表恰好覆盖 17 项编码,`Sex` 映射到「男」「女」,`Diagnosis` 映射到四个亚型缩写(由 build 检查,见第一部分) |
交付包根目录的 `交付说明_*.md` 不读。
@@ -132,7 +132,7 @@ delivery 只读交付包,交出每例读到的内容和检查结果,不决
| C05 | 超声表的 `CEUS视频ID` 是 `U<号>`,与病例号一致 | 两者的值 |
| C06 | 单例报告表:工作表 `Sheet1`,表头同超声汇总表,恰好 1 行数据,7 格与汇总表对应行逐格相等 | 不相等的列和两边的值 |
| C07 | 临床表取值,见表下的分条 | 不合规的列和值 |
| C08 | 超声表取值:`性别` 是「男」或「女」;`年龄` 形如「数字岁」;诊断是 1–4;`推注开始时间s` 是非负整数;`超声描述` 是非空字符串 | 不合规的列和值 |
| C08 | 超声表取值:`性别` 是「男」或「女」;`年龄` 形如「数字岁」;诊断是 1–4(`decode_codes` 为 true 时还要在映射表的 `Diagnosis` 里);`推注开始时间s` 是非负整数;`超声描述` 是非空字符串 | 不合规的列和值 |
| C09 | MR 表取值:`性别`、`年龄`、诊断同 C08;`MR描述` 是非空字符串 | 不合规的列和值 |
| C10 | 跨表一致:诊断三张表两两相等;年龄三张表相等(报告表去掉「岁」后比);性别超声表与 MR 表相等;`decode_codes` 为 true 时,临床表解码后的 `Sex` 也要与超声表相等 | 对不上的字段和各表的值 |
| C11 | 报告文字(超声描述、MR 描述)里没有结论段标题:先做 NFKC(全角转半角)归一,再查「关键词 + 可选空白 + 冒号」,出现在全文开头或换行之后(段首)即不过。关键词:超声提示、超声诊断、影像学诊断、检查结论、诊断意见、印象、结论、诊断、意见、提示 | 哪份报告、命中的关键词、命中处所在的句子 |
@@ -144,7 +144,7 @@ C07 的分条:
- `Sex` 是 1 或 2;`Age` 是正整数;`Diagnosis` 是 1–4;
- 5 个症状、5 个既往史是 0 或 1,不能空;
- 5 对化验(原值和档位):两格都空表示没测,可以;两格都有值时,原值是数字(整数或浮点),档位是 0 或 1;只有一格有值不过;
- `decode_codes` 为 true 时,16 个编码列里非空的值都要在映射表里。
- `decode_codes` 为 true 时,临床表各编码列里非空的值都要在映射表里。
几点说明:
@@ -188,7 +188,7 @@ answers/<构建号>/
manifest.json 构建号(与 library 同一个)、本目录其余全部文件(含 snapshot/ 下的)的 SHA-256
snapshot/ 运行快照(第五部分)
aliases.csv 化名、病例号(三位)、视频号(U 号,「CEUS 定量」的结果按视频号接回病例)
diagnoses.csv 化名、病例号、临床表诊断编码、超声表诊断编码、MR 表诊断编码、诊断名(按诊断编码常量)
diagnoses.csv 化名、病例号、临床表诊断编码、超声表诊断编码、MR 表诊断编码、诊断名(`decode_codes` 为 true 时按映射表解码,为 false 时留空)
skipped.csv 病例号或「表名第 N 行」、检查编号、检查说明、文件、列、涉及值(JSON 字符串)
review.csv 化名、路(超声/MR)、命中的词、所在句子
```
@@ -233,7 +233,7 @@ build 是唯一同时碰到原始资料和答案的地方,也是决定谁能
- **可见性**:资料库里性别、年龄只出现在临床一路;超声、MR 两路的文件里不出现临床表的任何列名。
- **泄露扫描**:library 提供一个扫描函数:给定一次构建的目录、禁止出现的字符串列表、禁止的 JSON 键名列表,返回命中(文件、命中的词)。字符串按子串扫全部 `.txt`、`.json` 文件(含 `manifest.json`),不扫 PNG(PNG 的附加数据由「关键图」那条测试管);键名按整个键名、不分大小写比较。测试里用一份独立写的词表(不 import delivery 的常量)调用它,断言不出现:本次构建任一病例的病例号(`P001`、`U001` 两种写法)、交付包里的文件名、四种亚型的缩写和中文名、诊断列名、`Diagnosis`、`Case_ID`;键名不出现 `diagnosis`、`label`、`gold`、`pathology`、`name`、`row`。再写一条测试证明扫描函数本身管用:往资料库塞一个泄露,它能查出来。
- **化名**:同一个种子构建两次,化名相同;换种子,化名不同;化名都是 4 位小写字母加数字,互不相同。
- **解码开关**:false 时 `clinical.json` 是原始数字、`codes_decoded` 为 false;true 时按样例映射表解码;`decode_codes` 与 `code_maps` 不配套(true 配 null,false 配路径)时配置读取报错。
- **解码开关**:false 时 `clinical.json` 是原始数字、`codes_decoded` 为 false,`diagnoses.csv` 的诊断名留空;true 时两者都按样例映射表解码;`decode_codes` 与 `code_maps` 不配套(true 配 null,false 配路径)时配置读取报错。
- **关键图**:资料库里的 `key.png` 颜色模式和像素与原图相同,PNG 文本块没有了。
- **清单与读取**:改坏资料库里的一个文件,library 读取时报错;`.partial` 目录读取时报错。
- **不覆盖**:同一个构建号目录已存在时报错。