外观
别人给你一份规则包,怎么验它对不对
本章解决:信息科、厂商、外包或同事交给你一份"从政策文件抽出来的目录表"或"打包好的规则包",你怎么在用它之前判断它是对的。
1. 先给结论
- 抽取产物默认不可信,直到验过。 从 PDF 或 Word 抽出来的表格会静默出错——不是报错,是给你一张看起来正常的表。
- 验收要有数字对得上,不能靠"看着差不多"。 每一项检查都要输出一个可比对的数,并留下记录。
- 三种验收形态解决三类问题:抽取校验管"有没有抽全抽对"、全量回归管"用起来结果对不对"、跨版本一致性管"和上一版比变化合不合理"。
- 验不过的包不要"先用着"。 规则包是所有下游结论的地基,地基错了,上面每一层都要返工。
- 验收脚本本身要能复跑。 一次性目视检查不叫验收,因为下次换版你还得从头再来一遍。
2. 抽取产物会怎样静默出错
这一节先建立警惕心。从政策文件抽表格,常见的失败方式都不报错:
| 失败方式 | 长什么样 | 为什么危险 |
|---|---|---|
| 字符编码丢失 | 中文变成 <e5><b8><b8> 这类十六进制转义 | 文件能打开、行数也对,只是内容不是字 |
| 跨页表格断行 | 一行被拆成两行,或两行被并成一行 | 行数变了,但你不知道应该是多少 |
| 合并单元格展开错位 | 某列的值错行填充 | 每一行看着都完整,对应关系全错 |
| 区间行没展开 | "第 1–200 组"这样的一行代表 200 条 | 行数看着少一大截,比对时全被当成"删除" |
| 数字被当成文本 | 045 变 45,或 1.50 变 1.5 | 编码匹配时对不上,表现为大量"未找到" |
| 前导零丢失 | ICD 编码 01.234 变 1.234 | 同上,且更隐蔽 |
共同点:它们都不会让程序崩溃。 所以"跑通了"不等于"抽对了"。
区间行是最容易吃亏的一种
常德目录的实测里,原始目录 8718 行,其中 79 行是区间写法。展开后是 15381 行。
如果不展开就去跟上一年的 7085 行比对,你会得到一个完全错误的差异清单——而且它内部自洽,不会有任何东西提醒你。
3. 三种验收形态
形态一:抽取校验——抽全了吗、抽对了吗
在拿到抽取产物、还没用它做任何事之前做。
逐张表核这几项:
| 检查 | 怎么做 | 通过标准 |
|---|---|---|
| 行数 | 与文件里写明的条目数比 | 完全相等,不接受"差不多" |
| 序号连续性 | 最小值、最大值、去重后个数 | max − min + 1 == 去重个数,即无跳号无重号 |
| 主键唯一 | 目录编码去重计数 | 等于总行数 |
| 关键列非空 | 分值、诊断编码、操作编码 | 空值数为 0 |
| 字符完整性 | 搜 < 或 ? 这类异常字符 | 命中数为 0 |
| 区间已展开 | 展开后行数 vs 展开前 + 生成数 | 对得上 |
每一项都输出一个数,写进一份 JSON 或表格。 不写下来的检查等于没做——下次换版时你不记得上次查过什么。
形态二:全量回归——用起来结果对不对
抽取校验只保证"表是对的",不保证"规则跑起来是对的"。
做法:拿一批病例,在这份规则包下全量跑一遍,输出结果分布。
要看的不是"有没有跑通",而是这三类数:
| 看什么 | 为什么 |
|---|---|
| 入组率 | 突然下降通常意味着编码匹配出了问题 |
| 各病种类型的分布 | 核心/综合/基层的条数应与目录里的计数一致 |
| 未入组原因分布 | 集中在某一类,往往是规则包问题而不是病例问题 |
关键在于"预期值从哪来":它应该来自目录本身的统计,而不是"上次跑出来是这样"。用上次的结果当预期,会把上次的错误一起继承下来。
抽样回归也可以:跑一个固定的小样本(几百到一千条),结果与全量的关键指标对得上即可。小样本回归的价值在于快——换版时能天天跑。
形态三:跨版本一致性——变化合不合理
新旧两版都验过之后,再看它们之间的差异是否讲得通。
text
新增数 + 删除数 + 保留数 == 两版并集这个恒等式必须成立。不成立说明比对逻辑本身有问题(最常见的原因是归一化没做)。
然后看差异的形态:
| 现象 | 通常意味着 |
|---|---|
| 新增数与删除数非常接近,而净变化很小 | 归一化没做——同一条被算成一删一增 |
| 某一类整体消失 | 编码方案变了(前缀、后缀、分隔符) |
| 分值全部同向变动且幅度接近 | 整体缩放,不是逐条调整 |
| 差异集中在某几章 | 该临床领域做了专项调整,值得单独看 |
第一条是最常见也最容易骗过人的。 征求意见稿和正式版对照里,未归一化时报告"新增 1477、删除 1471",实际是 400 和 394——差异被放大了 3.7 倍。
4. 一份验收记录该长什么样
text
一、包的身份
来源文件全名、文号(无则注明)、版本、拿到日期、交付方
二、抽取校验
逐表:期望行数 / 实际行数 / 是否通过
序号连续性、主键唯一、关键列非空、字符完整性
区间展开前后行数对账
三、全量或抽样回归
参与病例数(写明分母)
入组率、病种类型分布、未入组原因分布
与目录统计的对账结果
四、跨版本一致性(若有上一版)
新增 / 删除 / 保留 / 并集恒等式
差异形态判断
编码方案是否变化
五、结论
通过 / 有条件通过 / 不通过
有条件通过时:哪些条目不可用、影响哪些下游分析
六、复跑方式
脚本路径与运行命令,任何人能重跑一遍第六项决定这份验收有没有长期价值。 一次性的目视检查下次换版还要从头做;可复跑的脚本下次只要改个文件名。
5. 常见错误
| 错误 | 后果 |
|---|---|
| 只看"跑通了"就当验过 | 抽取错误全部不报错,跑通说明不了任何事 |
| 用上次的结果当预期值 | 继承上次的错误,且越传越难发现 |
| 目视抽查几行代替全量校验 | 抽到的十行正确,不代表另外八千行正确 |
| 区间行不展开就比对 | 差异清单整体错误,且内部自洽 |
| 比对前不归一化 | 新增与删除同时虚高,方向判断出错 |
| 验不过但"先用着,回头再修" | 下游全部结论要返工,成本远高于当场修 |
| 验收结果不落盘 | 下次换版重来一遍,且无法回答"上次是怎么过的" |
6. 岗位行动
| 岗位 | 该做什么 |
|---|---|
| 信息 | 把三种形态的校验脚本化,纳入换版流程;输出机器可读的验收记录 |
| 医保 | 定验收标准:哪些项必须全过、哪些可有条件通过;不接受无记录的交付 |
| 数据分析 | 用包之前先看验收记录;没有记录就自己跑一遍形态一 |
| 采购/对接 | 把"交付验收记录"写进对厂商的要求,而不是只要一个文件包 |
7. 读完你应该能
- 说出抽取产物至少四种不报错的失败方式。
- 对一份新目录跑完形态一的六项检查,并输出可比对的数。
- 判断一份跨版本差异清单是否因为没归一化而失真。
- 写一份别人能照着复跑的验收记录。
- 说明为什么"验不过先用着"的代价比当场修更高。
8. 来源
本章不直接引用政策文件条文;涉及的规则口径见各处内链指向的篇目。
本书的实测依据
下面这些不是政策文件,是本书自己跑出来或整理的东西。可以用来理解方法,不要当规则引用——要写进正式材料,回到上面的官方来源。
- 一次完整的抽取与验收实测:从 PDF 到可研究数据:一次目录抽取的四道校验。属实测数据。
- 未归一化导致差异虚报的实测:征求意见稿和正式版,到底差了多少。属实测数据。
- 本章的三种验收形态、检查清单与记录结构属实务经验整理。
9. 下一步
- 差异算出来之后怎么用:规则切换影响测算
- 怎么判断源文件本身现行有效:怎么读一份地方文件
- 交付前的通用自检:A04|交付前自检清单