信息速览

IMCS-21 — 中文医患多轮对话 AI-Ready Wikipedia
INFOBOX
| 数据集名称 | IMCS-21(Intelligent Medical Consultation System 2021)中文医患对话数据集 |
| 英文全称 | Intelligent Medical Consultation System 2021 Corpus |
| 别名/简称 | IMCS-21、IMCS21、DialoAMC(早期代号) |
| 疾病分类 | 儿科常见病十种(小儿支气管炎、发热、腹泻、上呼吸道感染、消化不良、感冒、咳嗽、新生儿黄疸、便秘、支气管肺炎);按 ICD-11 主要归于呼吸系统与消化系统疾病类目(详见 §2.1) |
| SNOMED CT | 症状实体归一化至 SNOMED-CT(如发热、咳嗽、腹泻等,1,900+ 原始表达到 444 个标准症状,详见 §2.2) |
| 数据模态 | 中文医患多轮对话文本(患者自述 + 对话)+ 多层标注(字符/句/对话三级) |
| AI 任务类型 | 医疗命名实体识别(NER)、对话意图/行为分类(DAC)、症状标签推断(SLI)、医疗报告生成(MRG)、诊断导向对话策略(DDP) |
| 样本总数 | 4,116 条对话 / 164,731 句(train 2,472 / dev 833 / test 811) |
| 数据大小 | GitHub 仓库约 18 MB(含代码与数据) |
| 数据格式 | JSON(+ symptom_norm.csv、mappings.json) |
| 许可证 | 论文开放获取 CC BY 4.0;数据与代码经 GitHub 公开发布 |
| 访问级别 | 开放(GitHub 直接下载);测试集标注需经 CBLUE@天池评测平台 |
| DUO 标签 | NRES(科研用途) |
| 语言 | 中文(简体) |
| 首发日期 | 2022(arXiv 首发 2022-04;期刊 advance access 2022-12) |
| 最后更新 | 2022-12-24(IMCS-21 2.0,疾病由 6 种扩展至 10 种) |
| 发布机构 | 复旦大学牵头(通讯魏忠钰)联合西北工业大学、华为 Noah’s Ark 等 |
| 官方主页 | https://github.com/lemuria-wchen/imcs21 |
| 下载地址 | https://github.com/lemuria-wchen/imcs21(CBLUE 测试集见 imcs21-cblue) |
| DOI | 10.1093/bioinformatics/btac817 |
| 引用次数 | 99+(Google Scholar,截至 2026-09) |
| AI 就绪度评分 | ⭐⭐⭐⭐(4/5)— 官方固定划分 + 各任务基线代码 + README 完整;扣分项:标注格式多级需自行对齐、测试集标注不直接开放、需自建 DDP 环境 |
| 页面状态 | published |
§0 E-E-A-T 信任声明与免责声明
医学审核者:千方病案医学编辑部交叉审核:§2 医学背景(儿科十病 ICD-11 与 SNOMED CT 映射、临床任务定义、金标准描述)、§7 偏倚分析。
数据工程审核者:千方病案医学编辑部交叉审核:§4 DAIMS 数据字典(三级标注层级、症状归一化与阴阳标签映射)、§5 数据划分策略、§6 预处理 Pipeline 和坑点。
审核日期:2026-09-05
审核方式:交叉审核
利益冲突声明:千方病案医数集与复旦大学、西北工业大学、华为及 IMCS-21 作者团队无任何商业利益关联。本页面不销售 IMCS-21 数据集本身,仅提供 AI 就绪指南与学术信息服务。编辑者未接受上述机构的任何形式资助。
医疗免责声明:本页面提供的医学信息仅供研究和教育目的,不构成医疗建议、诊断或治疗方案。数据集的医学描述基于公开发表的文献,未经逐一临床验证。任何基于该数据集训练的 AI 模型在应用于临床决策前,必须经过独立的临床验证和监管审批。
技术免责声明:本页面的代码示例、预处理建议和基准性能数据基于公开资料整理,不保证在特定环境下的准确性和适用性。使用者应自行验证代码安全性和数据预处理流程的正确性。千方病案医数集不对因使用本页面信息而导致的任何直接或间接损失承担责任。
数据使用合规:使用本页面描述的数据集前,请务必阅读并遵守数据集原始许可协议。IMCS-21 数据与代码经 GitHub 公开发布,论文本体为 CC BY 4.0 开放获取;但测试集真实标注托管于 CBLUE@天池平台,需按其评测规则提交使用。DUO 标签仅供参考,具体使用限制以数据集官方协议为准。
§1 数据集概览
§1.0 📌 30 秒速览
这是什么? IMCS-21(Intelligent Medical Consultation System 2021)是一套中文医患多轮对话基准,收录了 4,116 条真实儿科在线问诊记录、共 164,731 句话,覆盖小儿支气管炎、发热、腹泻等 10 种儿科常见病。每条对话不只给了原始文本,还做了三层人工标注——字符级的医疗命名实体、句子级的对话意图、以及对话级的症状阴阳标签和结构化医疗报告。它由复旦大学魏忠钰团队牵头、联合西北工业大学、华为等机构发布,是中文医疗对话领域少有的、一套数据同时支撑五个任务的基准。
为什么重要? 在这之前,医疗对话研究要么拿海量但无标注的对话做粗略实验,要么用只覆盖单一任务的小语料。IMCS-21 首次把"看懂医患对话"这件事拆成一套可复现的框架:静态理解层(识别实体、意图、症状、写报告)+ 动态交互层(让 AI 学着像医生一样主动追问症状再下诊断)。它把 CBLUE 评测扩展到了智能问诊,让中文医疗 NLP 有了可横向比较的标尺。
我能用它做什么? 你可以用它训练和评测五类模型:医疗命名实体识别(抽出症状/药名/检查等)、对话意图分类(区分医生是在问症状还是开药)、症状标签推断(判断某个症状是阳性、阴性还是不确定)、结构化医疗报告生成(把对话自动总结成主诉/现病史/诊断/建议),以及基于强化学习的诊断对话策略。想复现论文基线、做中文医疗预训练微调、或做端到端自动问诊 demo,它都是一块合适的实验田。
§1.1 摘要
IMCS-21 面向自动医疗咨询系统(Automatic Medical Consultation, AMC),提出"医生-患者对话理解"与"面向任务交互"两种框架,前者处理静态文本的结构化抽取,后者处理动态的下一步追问决策。语料原始数据来自百度拇指医生在线健康社区的真实医患咨询,经完整性与对话长度过滤后,交由医疗背景标注者按"字符级—句子级—对话级"三层完成标注:token 级标注 5 类医疗命名实体(症状、药品名、药物类别、检查、操作)并采用 BIO 字符级方案;utterance 级标注 16 类对话意图(询问 R / 告知 I 二分,叠加基本信息、症状、病因、既有检查治疗、医疗建议、用药推荐、注意事项、诊断等语义);dialogue 级收集归一化症状及其阴阳性标签,并让标注者按固定六段格式撰写医疗报告(每对话两份作为参考)。围绕这两套框架共设计 5 个独立任务,作者给出多组神经基线以证明语料可用性并为后续设下基准。数据集 GitHub 公开,测试集托管于 CBLUE@天池平台供在线打榜。
§1.2 战略价值
(1)多任务统一基准填补领域空白。 过去中文医疗对话研究分散在 NER、文本诊断、药物推荐、报告生成等彼此孤立的子问题上,且各自使用互不兼容的小语料。IMCS-21 把同一批对话同时标注实体、意图、症状与报告,并用两套框架串起五个任务,使研究者能在同一数据分布上横向比较不同子任务的模型,也让"理解型"与"交互型"两类系统首次共享一份训练原料。这对评估一套完整问诊流水线(先抽取、再追问、最后出报告)特别有价值,因为它能暴露各级联模块之间的误差传递。
(2)真实的儿科专科场景与细粒度标注质量。 与用模板生成的合成对话不同,IMCS-21 源自真实在线医患问答,保留了口语化、信息不全、症状表述不规范等真实挑战,例如同一症状有"发烧 / 发热 / 热"多种写法(靠 SNOMED-CT 归一化),以及大量与患者未必相关的阴性症状提及(约占症状提及的 40%)。这些恰恰是让模型从"模式匹配"迈向"临床推理"的关键难度。多级细粒度标注(含 2 份独立医疗报告作参考)为评估标注一致性、诊断理解准确率提供了内建校验材料。
(3)把"理解"与"交互"两个研究范式接到同一根数据管道上。 对话 NLP 通常分成"读一段已有对话并抽取信息"与"在动态对话中决策下一步"两个方向,二者很少共享同一套标注。IMCS-21 的结构化症状特征既是 SLI 的预测目标,又是 DDP 强化学习的状态空间——这意味着研究"先理解后交互"的完整问诊系统时,可以用同一份语料做端到端或级联训练,不必在多个不兼容数据源之间做状态表示迁移。这一"一份标注两种范式复用"的设计,是其在方法论上区别于多数纯理解型医疗对话数据集的价值所在,也是后续 LCMDC 等语料沿袭其框架的动因之一。
§1.3 同类数据集横向对比
| 数据集 | 规模 | 模态/标注 | 疾病范围 | 与 IMCS-21 的差异 |
|---|---|---|---|---|
| IMCS-21 | 4,116 对话 / 164,731 句 | 中文医患对话,三级多任务标注(实体/意图/症状/报告) | 10 种儿科常见病 | 一套数据支撑 5 个任务,含结构化医疗报告与 DDP 强化学习策略 |
| MedDialog(中文) | 百万级无标注对话 | 中文医患对话文本,无细粒度标注 | 多科室通用 | 规模巨大但无多级标注,不直接支撑五个子任务 |
| MedDG | 约 1.7 万对话 | 中文医患对话,实体为中心标注 | 12 种消化系统疾病 | 仅实体类标注,无意图/报告/对话策略任务 |
| LCMDC(2024) | 大语料 | 中文医患对话 | 自动分诊与问诊 | 后发大语料,偏重分诊;无 IMCS-21 的五任务统一框架 |
| CMeEE / 中文医学 NER 类 | 数万句 | 医学文本(电子病历/教材),实体标注 | 非对话文本 | 面向静态医学文档而非多轮问诊 |
| CMeIE / 中文医学关系类 | 数万实例 | 医学文本关系抽取 | 非对话文本 | 关系三元组,无对话意图 |
| ERNIE-Health / 中文医学预训练语料 | 预训练级 | 医学文本用于预训练 | 通用 | 无标注,作为领域预训练来源 |
| DialoAMC(IMCS-21 早期代号) | — | 同名语料早期名称 | 儿科 | 同一语料的命名演进 |
§1.4 版本时间轴
| 版本 | 日期 | 主要变更 | 说明 |
|---|---|---|---|
| 早期版(DialoAMC 代号) | 2022-04 前后 | arXiv 2204.08997 首次公开框架与语料 | GitHub 仓库 2022-04-19 创建;早期 README 曾以 DialoAMC 命名 |
| IMCS-21 1.x | 2022 | 覆盖 6 种儿科疾病的基础版本 | 各任务基线代码随仓库发布 |
| IMCS-21 2.0 | 2022-12 | 疾病由 6 种扩展至 10 种,共 4,116 条样本;修正部分实体/症状标签 | 新增句级 local_implicit_info 字段;测试集正式托管 CBLUE@天池 |
| GitHub 最后维护 | 2022-12-24 | 更新 dev 集 DDP 结果与任务说明 | 仓库进入稳定封存状态 |
命名提示:语料在其发展早期以 DialoAMC(Dialogue for Automatic Medical Consultation)为名出现在部分 README 与早期文档中,后在 Bioinformatics 正式论文中定型为 IMCS-21。检索资料时若见到 “DialoAMC” 与 “4,116 / 10 病” 字样,通常指的就是同一语料,勿当作另一个数据集。
§1.5 典型应用场景
- 自动问诊前置理解:抽取患者自述与对话中的症状、药名、检查等实体,为医生端或客服端生成结构化摘要。
- 问诊流程助手:用 DAC 实时识别医患双方意图,区分"在问症状"还是"在给建议",辅助对话理解与后续决策。
- 结构化医疗报告自动生成(MRG):把一轮完整对话压缩成主诉/现病史/辅助检查/既往史/诊断/建议六段式报告,降低医生记录负担。
- 诊断导向对话策略(DDP):训练强化学习问诊代理,让它学会在有限的追问轮数内收集最关键的阴性/阳性症状再给出正确诊断。
- 中文医疗预训练模型评测:作为医学语言理解(含 ERNIE-Health 等领域预训练模型)的儿科对话级下游评测集,观察领域预训练带来的收益。
§2 医学背景
§2.1 ICD-11 目标疾病映射表
儿科常见病的谱系在 ICD-11(International Classification of Diseases, 11th Revision)中主要归属呼吸系统与消化系统两大章,其中发热、咳嗽在分类学上更接近"症状/体征"类目而非独立疾病。理解这一定位对正确使用 IMCS-21 至关重要:该数据集的"疾病标签"是儿科门诊初诊语境下的主诉性诊断,并非严格按 ICD-11 标准编码的终末诊断,部分标签(如发热、咳嗽)本质是症状标签,被当作独立问诊主题收录。这一设计贴合中国儿科在线问诊实际(家长常以"孩子发烧了""一直咳嗽"作为主诉发起咨询)。
IMCS-21 的 10 种儿科疾病是标注与诊断标签的地基。数据集本身不以 ICD-11 编码发布(其唯一外部编码锚点是症状的 SNOMED-CT 归一化,见 §2.2),下表列出 10 种目标疾病的临床对应类目,供跨数据集对照参考。
| IMCS-21 疾病标签 | 中文 | ICD-11 最接近类目(临床参考) | 数据说明 |
|---|---|---|---|
| Bronchitis | 小儿支气管炎 | 呼吸系统疾病章(急性支气管炎类) | 543 条 |
| Fever | 小儿发热 | 症状/体征类目(发热为症状) | 542 条 |
| Diarrhea | 小儿腹泻 | 消化系统疾病章(腹泻类) | 534 条 |
| Upper Respiratory Infection | 上呼吸道感染 | 呼吸系统疾病章(上呼吸道感染类) | 486 条 |
| Dyspepsia | 小儿消化不良 | 消化系统疾病章(消化不良类) | 475 条 |
| Cold | 小儿感冒 | 呼吸系统疾病章(普通感冒/急性上感类) | 472 条 |
| Cough | 小儿咳嗽 | 症状/体征类目(咳嗽为症状) | 344 条 |
| Jaundice | 新生儿黄疸 | 消化系统/围产期黄疸类目 | 294 条 |
| Constipation | 小儿便秘 | 消化系统疾病章(便秘类) | 221 条 |
| Bronchopneumonia | 小儿支气管肺炎 | 呼吸系统疾病章(支气管肺炎类) | 205 条 |
注:IMCS-21 的官方发布文件不含 ICD-11 码,此处 ICD-11 类目为医学编辑为跨数据集对照补充的近似归类,精确到章的类目见上表,未虚构具体叶节点编码。真正进入数据本身的编码映射是症状实体到 SNOMED-CT 概念的链接。
§2.1b SNOMED CT 映射表
IMCS-21 对症状实体做了标准化归一化:把 1,900+ 种原始表述统一到 444 个标准症状名,并映射到 SNOMED-CT 概念。下表给出几类常见症状在 SNOMED-CT 的典型归属,作为归一化方向的示意(完整 444 项见发布包 symptom_norm.csv)。
| 原始表述示例 | 归一化标签 | SNOMED-CT 概念类型 | 术语说明 |
|---|---|---|---|
| 发烧 / 发热 / 热 / 低烧 | 发热 | 症状/临床发现 | 统一不同口语表达为单一标准名 |
| 拉肚子 / 腹泻 / 水样便 | 腹泻 | 症状/临床发现 | 归一化后链接标准概念 |
| 咳 / 咳嗽 / 干咳 | 咳嗽 | 症状/临床发现 | 归一化后链接标准概念 |
| 便秘 / 大便干结 | 便秘 | 症状/临床发现 | 归一化后链接标准概念 |
这些症状同时被标注为 POS / NEG / NS 三种类别,代表"确定患有 / 确定未患 / 无法判定",用于刻画症状与患者的真实关系。
§2.1c 儿科疾病谱在数据中的语义重叠
IMCS-21 的 10 个疾病标签之间存在系统性语义重叠,这是解读其诊断任务时必须掌握的医学背景。下表列出标签之间的常见混淆方向,帮助研究者理解为什么部分疾病的诊断标签在报告命中率上显著更低:
| 标签 A | 标签 B | 重叠来源 | 对标注/模型的影响 |
|---|---|---|---|
| 感冒 Cold | 上呼吸道感染 URI | 病原与表现高度相似 | Cold 报告诊断命中率仅约 65.6% |
| 小儿支气管炎 | 支气管肺炎 | 炎症沿气道向下扩展 | 严重度边界模糊 |
| 小儿咳嗽 Cough | 支气管炎 | 咳嗽本身是后者核心症状 | 主诉性诊断难分 |
| 小儿发热 Fever | 上感/感冒 | 发热是共性体征 | 症状性标签与病种标签交叉 |
| 小儿消化不良 | 小儿腹泻 | 消化功能紊乱谱系 | 症状组合接近 |
这一重叠的直接后果是:IMCS-21 的诊断标签带有人工主观推断噪声,评估"诊断准确性"类指标(如 MRG 的 RD-Acc、DDP 的 Acc)时应意识到标签本身并非临床金标准,而是主诉性诊断——模型达到的高 Acc 更多反映"能在 10 个儿科标签中选出合理者",而非临床意义上的确诊能力。
§2.2 疾病与临床任务简介
IMCS-21 聚焦儿科门诊最常见的呼吸与消化系统疾病谱。发热、咳嗽既是独立"疾病标签",同时也是其他疾病(感冒、支气管炎、肺炎)的核心症状——这一重叠是标注与诊断天然困难的部分:当真实诊断是"感冒"时,标注者能在报告中命中感冒关键概念的仅约 65.6%,而"黄疸"则高达约 98.1%,说明部分疾病在对话中特征模糊、易与他病混淆。
从临床任务视角,本语料支撑的并非单一筛查或诊断,而是覆盖一条完整的儿科在线问诊闭环:病史采集(识别症状与检查)→ 追问策略(DDP,决定再问哪个症状)→ 结构化小结(MRG 生成报告)→ 转诊/建议。这与三甲儿科门诊的实际电子病历记录路径高度一致,是研究"问诊自动化 + 病历自动化"的理想土壤。
§2.3 临床任务定义
五个任务并非平级并列,而是分属两套框架,理解其归属有助于把握模型架构与输入形态:
| 框架 | 子任务 | 类型 | 一句话定位 |
|---|---|---|---|
| 医生-患者对话理解(静态) | NER / DAC / SLI / MRG | 抽取 + 生成 | 从已有对话抽取结构化信息并生成报告 |
| 面向任务交互(动态) | DDP | 强化学习决策 | 决定下一步问哪个症状以推进诊断 |
| 临床任务 | IMCS-21 对应任务 | 输入 | 期望输出 |
|---|---|---|---|
| 病史结构化抽取 | NER | 单句/对话字符序列 | 5 类医疗实体边界与类别 |
| 问诊意图理解 | DAC | 单句 | 16 类对话意图之一 |
| 症状采集与判别 | SLI | 症状提及 + 上下文 | 归一化症状 + POS/NEG/NS 标签 |
| 病历自动小结 | MRG | 整段相关对话 | 六段式结构化医疗报告 |
| 诊断导向追问 | DDP | 当前对话状态 | 下一步要问的症状/最终诊断 |
特别提示:DDP 的训练数据恰好是 SLI 需预测的结构化症状特征(论文明确说明这一依赖)。这意味着想训练 DDP 的研究者必须先有可靠的 SLI 前置(要么用标注真值、要么用训练好的 SLI 模型生成状态),这条上下游依赖是 §6 坑点 6 的来源。
§2.4 患者人群与采集说明
| 维度 | 说明 |
|---|---|
| 数据来源 | 百度拇指医生在线健康社区(muzhi.baidu.com)真实医患咨询 |
| 采集时间 | 2021 年前后(语料标注于 2021-2022,具体逐条时间未公开) |
| 目标人群 | 儿科患者(婴幼儿至儿童),由家长代述或医患互动 |
| 就诊类型 | 线上远程问诊(图文对话) |
| 样本构成 | 每例含患者自述(self-report)+ 医患对话 + 疾病标签 |
| 覆盖疾病 | 10 种儿科常见病(见表 §2.1) |
§2.5 临床价值
对临床侧,IMCS-21 的价值在于把"在线问诊对话"和"结构化病历/诊断"两个环节用同一批数据对齐,为儿科初诊常见的呼吸、消化系统疾病提供了一条从口语化描述到规范小结的可学习通路。其 SNOMED-CT 症状归一化也为后续与真实电子病历系统打通提供了接口。对研究与教学,它是一套带参考答案(两份人工报告、症状阴阳标签)的真实问诊示例,适合作为儿科问诊规范化与医患沟通的语料样例。需强调:数据仅含对话文本与标注,不含真实检验数值、用药剂量医嘱核验等,不能用于直接临床决策。
§2.5a 儿科呼吸与消化疾病的流行病学背景
理解 IMCS-21 所选病种为何集中在呼吸与消化系统,需要一点儿科流行病学常识。在全球儿童疾病负担中,急性呼吸道感染与腹泻是门诊与基层医疗最常见的两类就诊原因:发热、咳嗽、上呼吸道感染、支气管炎、支气管肺炎构成儿科呼吸系统主旋律,腹泻、消化不良、便秘则覆盖了消化道门诊的相当比例。这些疾病多为自限性或可由口服对症药处理,恰好适合在线图文问诊——这正是 IMCS-21 选择它们的原因:它们是"远程问诊技术上可行、且真实发生频率高"的一类疾病。
| 疾病类别 | 常见病原/诱因 | 在 IMCS-21 的定位 |
|---|---|---|
| 上呼吸道感染/感冒/咳嗽 | 呼吸道病毒为主 | 频率最高的儿科主诉 |
| 支气管炎/支气管肺炎 | 病毒/细菌沿气道扩散 | 下呼吸道,需评估严重度 |
| 发热 | 感染性/非感染性 | 跨病种核心体征 |
| 腹泻/消化不良/便秘 | 肠道感染、喂养、菌群 | 消化道主诉 |
| 新生儿黄疸 | 胆红素代谢 | 围产期特有问题 |
从人群角度,参与在线问诊的"患者"绝大多数是家长代为发起的咨询,年龄跨度覆盖婴幼儿至学龄前儿童。这种"家长代述 + 医生追问"的结构体现为 self-report 通常由家长以第一人称替孩子描述,医生则以专业语气反复澄清细节(是否伴随咳嗽、体温多高、精神状态如何)。研究者若把 IMCS-21 当纯 NLP 语料使用,容易忽略这类医患信息不对称的现实——患者自述往往含糊、缺关键阴性症状,恰是 SLI 中 NEG/NS 推断困难的外部成因。
§2.6 金标准
| 维度 | 说明 |
|---|---|
| 划分方式 | 官方给定 train 2,472 / dev 833 / test_input 811 |
| 标注层面 | 字符级(NER)/ 句级(DAC)/ 实体级(症状标签)/ 对话级(报告) |
| 标注者 | 医疗背景人工标注(预标注用 AC 自动机规则启发) |
| 参考报告 | 每对话 2 份人工医疗报告作为质量参考 |
| 性质 | 众包式医疗标注 + 多级互证,非金标准体格/实验室证据 |
§3 数据集规格
§3.0 版本抉择矩阵
IMCS-21 公开发行以 2.0 为主(覆盖 10 病、4,116 条),早期 6 病版本已不推荐新用户。若你从社区镜像或历史 fork 拿到其他版本,按表抉择。
| 你的需求 | 推荐版本 | 规模 | 理由 |
|---|---|---|---|
| 复现 Bioinformatics 论文五个任务 | IMCS-21 2.0 | 4,116 条 / 164,731 句 | 论文与 CBLUE 均以 2.0 为基准,10 病全覆盖 |
| 只做对话理解(NER/DAC/SLI/MRG) | IMCS-21 2.0 | train 2,472 / dev 833 | 官方划分可直接用,dev 结果与 README 对齐 |
| 参加 CBLUE 在线评测 | CBLUE@天池版(imcs21-cblue) | test 811(含预测集) | 测试集标注仅在该平台开放,用官方评测脚本 |
| 研究 DDP 强化学习 | IMCS-21 2.0 + SLI 结构化特征 | 全量 | DDP 训练输入即 SLI 需预测的结构化症状特征 |
| 接触更早版本/源码演进 | 不建议(仅作历史) | — | 6 病旧版任务覆盖不全,且与新评测不兼容 |
§3.1 模态详情
IMCS-21 是纯文本多轮对话模态,无图像/时序。每个样例由三块文本构成:患者自述(self-report,平均约 57 字)、医患多轮对话(平均每对话 40 句、523 字,含自述则 580 字)、以及人工撰写的结构化医疗报告(平均约 88 字/份)。对话层面的结构存在显著规律:随问诊深入,话题重心从症状逐渐转向药物、治疗与注意事项。所有标注附着于这些文本之上,形成字符级 / 句级 / 对话级三个粒度。
§3.2 按子集/任务样本数
| 划分 | 对话数 | 说明 |
|---|---|---|
| train.json | 2,472 | 训练集 |
| dev.json | 833 | 验证集(README 报告 dev 结果) |
| test_input.json | 811 | 测试输入(真实标注仅在 CBLUE 平台) |
| 合计 | 4,116 | 全量 |
| 子任务 | 标注粒度 | 支持模型(示例) |
|---|---|---|
| NER | 字符级 BIO | Lattice LSTM / BERT / ERNIE / FLAT / LEBERT |
| DAC | 句级 | TextCNN / TextRNN / DPCNN / BERT / ERNIE |
| SLI | 实体级(+句级隐含信息) | BERT-MLC / BERT-MTL |
| MRG | 对话级 | Seq2Seq / PG / Transformer / T5 / ProphetNet |
| DDP | 对话级(强化学习) | DQN / KQ-DQN / REFUEL / GAMP / HRL |
§3.3 数据格式
| 文件 | 格式 | 内容 |
|---|---|---|
| train.json / dev.json | JSON | 含对话文本与全量多层标注(实体/意图/症状/报告) |
| test_input.json | JSON | 测试输入文本(无标注,需在线评测) |
| symptom_norm.csv | CSV | 归一化症状词典(444 个标准症状) |
| mappings.json | JSON | BIO-tag、症状标签(id2bio/bio2id、sl2id/id2sl)、症状名映射字典 |
JSON 记录为嵌套对象,对话层字段(dialog_id、disease_label、self_report、症状、报告)与句级 turns 并存。与纯关系表不同,其标注散落在不同粒度的嵌套字段中,消费前须先做层级展开。症状标签在 CBLUE 版中用字符串"0/1/2"表达(0=NEG 阴性、1=POS 阳性、2=NS 不确定),与本地论文版 POS/NEG/NS 命名可能不同——跨版本混用前务必核对映射,这是 IMCS-21 最常见的低级错误之一。
§3.4 存储大小
GitHub 仓库(lemuria-wchen/imcs21)约 18 MB,含代码、数据与图片;其中四个数据 JSON 加症状词典与映射文件体量在数 MB 级(具体各文件字节未在官方公布,以仓库为准)。解压后本地处理建议预留 200 MB 以上空间以容纳派生特征与模型中间产物。若加入 CBLUE 版测试集与评测脚本、以及各类预训练模型权重缓存,建议额外预留数 GB。
§3.5 标注方式
标注以人工为主、规则预标注为辅。流程:先对每条对话用基于 AC 自动机(Aho–Corasick)的规则算法为每个字符预置初始 BIO 标签,再由医疗背景标注者人工校正并补全实体;句级对话意图、症状阴阳标签、医疗报告均由人工在参考规则下填写。医疗报告撰写时不事先告知真实疾病标签,要求标注者从对话中自行推断诊断——这使报告"诊断"部分的准确度可反推标注者对对话的理解质量。
三条标注规范要点值得研究者注意:
- 阴阳标签依据整句乃至上下文:POS/NEG/NS 的判定要结合症状所在句及其前后文,单看症状词无法判断——这既是标注规则,也应当成为你建模 SLI 时的输入设计原则。
- 症状归一化覆盖自述:不仅对话正文,患者自述中提及的症状也会被识别并归一化到标准症状,因此 self-report 字段对 SLI 是有监督信号的有效文本,勿丢弃。
- 对话意图的说话人不决定语义:标注以"这句话传递的信息类型"为准,而非"谁说的",因此会出现医生告知症状(I-SX)等反直觉标注(详见坑点 4)。
§3.6 标注者资质与一致性
标注者为具备医学知识背景的人员。论文通过对报告诊断部分做正则匹配评估:约 84.7% 的报告其诊断内容能命中真实疾病或其关键概念,整体一致性"令人满意"(作者原话 satisfactory)。但存在疾病间差异——感冒类报告命中率低至约 65.6%,黄疸高达约 98.1%,反映疾病特征模糊度影响标注可靠性。另约 60% 的报告"既往史"为空,因为既往史在在线问诊对话中较少涉及。
两点一致性启示:其一,"报告诊断命中率"是间接而非直接评估——它反映标注者能否从对话推断出疾病,而非标注方案本身的重测信度;其二,疾病特征越模糊(如感冒),标注者的诊断推断噪声越高,意味着以"诊断 Acc"为主指标的实验对这批样本天然更难,结果解读时要按疾病分层观察而非只看总体均值。论文建议的疾病混淆案例分析(Cold 65.6% vs Jaundice 98.1%)正是为此设计的诊断审计视角。
§3.7 采集周期
在线问诊记录采集于 2021 年前后完成并进入标注,2022 年整理发布;IMCS-21 2.0(10 病、4,116 条)于 2022-12-24 完成仓库更新。语料不包含连续纵向随访,每个样例为一次独立问诊的静态快照。需说明:平台未提供逐条时间戳与跨平台标识,无法据此重建随时间变化的疾病谱趋势或用户级复诊历史——这限制了"纵向预测"类研究。
§3.8 地域覆盖
中国境内互联网健康平台的图文问诊,覆盖人群为使用百度拇指医生的在线儿科咨询用户。对话以简体中文为主,含大量口语、家长代述与不规范症状表述。采集范围由平台用户结构决定,不能视为中国儿科门诊的整体抽样。用药名称(如妈咪爱、蒲地蓝)与就诊话术带有明显中国本土特征,跨国家/跨语言迁移前须评估术语学适配。
§3.9 设备与采集系统
本数据为文本对话记录,无医疗器械参与;采集设备为平台 IM/页面端输入界面。SNOMED-CT 归一化所引用的标准库为国际 SNOMED-CT(https://www.snomed.org/snomed-ct),是对话文本唯一的术语学外部锚点。
§3.10 深度溯源链
真实在线医患咨询(拇指医生,含患者自述) → 完整性/长度过滤 → 脱敏处理 → AC 自动机规则预标注 BIO → 医疗标注者多层人工标注(NER/DAC/症状+报告) → 质量校验(报告诊断正则比对) → IMCS-21 语料 → 5 任务建模与基线(Bioinformatics 2022) → 2.0 扩展 10 病并接入 CBLUE@天池评测。
§4 数据结构
§4.0 目录树
IMCS-21 官方仓库(lemuria-wchen/imcs21)解压后的顶层结构示意如下:
imcs21/
├── dataset/ # 数据文件
│ ├── train.json # 训练集(2,472 条,含全标注)
│ ├── dev.json # 验证集(833 条,含全标注)
│ ├── test_input.json # 测试集输入(811 条,无标注)
│ ├── symptom_norm.csv # 归一化症状词典(444 个标准症状)
│ └── mappings.json # BIO/症状标签/症状名映射字典
├── task1_ner/ # NER 基线代码(Lattice LSTM/BERT/ERNIE/FLAT/LEBERT)
├── task2_dac/ # DAC 基线代码(TextCNN/BERT/ERNIE…)
├── task3_sli/ # SLI 基线代码(BERT-MLC/BERT-MTL)
├── task4_mrg/ # MRG 基线代码(Seq2Seq/PG/Transformer/T5/ProphetNet)
├── task5_ddp/ # DDP 强化学习基线代码(DQN/KQ-DQN/REFUEL/GAMP/HRL)
├── figures/ # 论文配图与统计
├── utils.py # 公共工具
└── README.md # 任务说明、baseline 结果、引用
§4.1 DAIMS 标准化字段描述表
在阅读字段字典前,先完整给出 IMCS-21 的三级标注本体——这是所有字段背后的语义框架。命名实体(token 级,5 类) 与 对话意图(utterance 级,16 类) 是理解 JSON 标注的最小词汇表。
五类医疗命名实体(采用 BIO 字符级标注,B-实体开头 / I-实体内部 / O 非实体,共 11 个 tag):
| 类别缩写 | 类别 | 定义与示例 |
|---|---|---|
| SX | 症状 | 患病表现的异常状况,如发热、呼吸困难、鼻塞 |
| DN | 药品名(Drug Name) | 具体药物名称,如妈咪爱、蒙脱石散、蒲地蓝 |
| DC | 药物类别(Drug Category) | 按功效分的药物类,如消炎药、感冒药、益生菌 |
| EX | 检查(Medical Examination) | 医学检验,如血常规、X 光片、CRP 分析 |
| OP | 操作(Operation) | 相关医疗操作,如输液、雾化等 |
十六类对话意图(请求 R = 询问信息 / 告知 I = 提供信息,两分 × 八种内容语义 + 诊断 + 其他):
| 内容语义 | 请求版(R-) | 告知版(I-) | 含义示例 |
|---|---|---|---|
| 基本信息 BI | R-BI | I-BI | 询问/告知年龄、体重等基础信息 |
| 症状 SX | R-SX | I-SX | 询问/告知症状(R-SX 与 I-SX 占比最高) |
| 病因 ETIOL | R-ETIOL | I-ETIOL | 询问/告知发病诱因 |
| 既有检查治疗 EET | R-EET | I-EET | 询问/告知已做的检查与已用治疗 |
| 医疗建议 MA | R-MA | I-MA | 询问/给予就医建议 |
| 用药推荐 DR | R-DR | I-DR | 询问/推荐用药 |
| 注意事项 PRCTN | R-PRCTN | I-PRCTN | 询问/告知饮食起居注意事项 |
| 诊断 DIAG | —(仅 I-DIAG 存在) | I-DIAG | 给出诊断判断 |
| 其他 OTR | OTR | OTR | 不属上述类别的语句 |
理解这张词汇表后,再看下面的字段字典与目录树便可知每条 JSON 记录中各类标签分别落在哪个字段。
IMCS-21 的 JSON 记录按"对话"为一条样例。下表为核心字段字典(各任务消费不同子字段),示例为医学编辑基于标注规范复原的示意性 JSON 结构,字段名以官方发布为准。
| 字段名 | 类型 | 说明 | 示例值 | AI 用途 | 观测误差/缺失编码 | 信息性缺失编码 | 取值范围 |
|---|---|---|---|---|---|---|---|
| dialog_id | string | 对话唯一标识 | IMCS-xxx | 主键/去重/跨任务对齐 | 无 | 无 | 唯一值 |
| disease_label | string | 目标疾病标签 | 小儿支气管炎 | 分类/报告诊断校验 | 标签由人工判定,疾病间存在混淆 | 缺失=样本被过滤 | 10 种儿科病 |
| self_report | string | 患者自述文本 | 宝宝发热三天… | MRG/NER 输入 | 家长代述含噪声 | 空自述极少 | 自由文本 |
| turns / dialogue | array | 多轮对话(说话人+句子) | [{speaker,utterance}] | DAC/NER/DDP 输入 | 口语、错别字 | — | 自由文本 |
| entities | array | token 级 NER(BIO) | [{text,type,pos}] | NER 监督信号 | 标注者校正规则预标注 | O 占多数 | SX/DN/DC/EX/OP |
| acts | array | 句级对话意图 | R-SX / I-SX | DAC 监督信号 | 医生也可能 I-SX 造成歧义 | — | 16 类意图 |
| symptoms | array | 实体级症状归一化+阴阳 | SLI 监督信号 | NEG/NS 需上下文推断 | 未提及症状无记录 | 444 标准症状 × POS/NEG/NS | |
| medical_report | object | 对话级报告(6 段×2 份) | MRG 监督信号 | 报告诊断命中率疾病间差异大 | 约 60% 既往史为空 | 六段结构化文本 | |
| local_implicit_info | array | 句级隐含信息(2.0 新增) | — | 细粒度理解 | — | — | 结构化 |
§4.2 标签分布
为直观说明结构,下面给出一条对话在 JSON 中的示意性最小样例(医学编辑基于官方标注规范复原结构、演示三个层级字段如何落到同一段医患互动,非原始逐字转录):
{
"dialog_id": "IMCS-DEMO-0001",
"disease_label": "上呼吸道感染",
"self_report": "宝宝 2 岁,发烧 38 度两天,有点流鼻涕。",
"turns": [
{"speaker": "患者", "utterance": "医生,孩子昨晚开始发烧到 38 度多。",
"act": "I-SX",
"ner": {"text": ["发","烧"], "type": "SX", "pos": [0, 1]}},
{"speaker": "医生", "utterance": "有没有咳嗽或者流鼻涕?",
"act": "R-SX",
"ner": {"text": ["咳","嗽"], "type": "SX", "pos": [2, 3]}}
],
"symptoms": [
{"norm": "发热", "type": "1", "mention": "发烧"},
{"norm": "流鼻涕", "type": "1", "mention": "流鼻涕"},
{"norm": "咳嗽", "type": "2", "mention": "咳嗽"}
],
"medical_report": {
"主诉": "发热 1 天伴流涕",
"现病史": "发热 38 度余,伴流涕,无咳嗽。",
"辅助检查": "",
"既往史": "",
"诊断": "上呼吸道感染",
"建议": "多饮水,对症退热,观察精神。"
}
}
说明:官方发布中 symptom 的 type 字段以字符串"0/1/2"表示(0=阴性 NEG、1=阳性 POS、2=不确定 NS),与症状归一化命名
symptom_norm对应;医疗报告含两份参考(图中仅示其一)。实际字段命名与嵌套以发布 JSON 为准,此处用于教学演示三级标注如何对齐。
实体类别分布:对话中症状(SX)实体占比最高,约占全部实体提及的 58.3%;其余为药品名/类别、检查、操作等,反映医患对话主要围绕症状展开。对话意图分布:占比最高的两类是 I-SX(告知症状)与 R-SX(询问症状),即双方主要交换症状信息;检查、药物、建议与注意事项也常见。症状阴阳分布:每条对话平均约 6.6 个不重复症状实体(自述中约 1.7 个),其中非阳性(阴性或不确定)症状约占 40%,即相当一部分被提及的症状与患者未必相关,这是 SLI 任务的核心难点。
疾病标签分布(按 10 病样本数,由多到少):小儿支气管炎 543 / 小儿发热 542 / 小儿腹泻 534 / 上呼吸道感染 486 / 小儿消化不良 475 / 小儿感冒 472 / 小儿咳嗽 344 / 新生儿黄疸 294 / 小儿便秘 221 / 小儿支气管肺炎 205。
| 疾病 | 样本数 | 占比 | 是否少见病 |
|---|---|---|---|
| 小儿支气管炎 | 543 | 13.2% | 否 |
| 小儿发热 | 542 | 13.2% | 否 |
| 小儿腹泻 | 534 | 13.0% | 否 |
| 上呼吸道感染 | 486 | 11.8% | 否 |
| 小儿消化不良 | 475 | 11.5% | 否 |
| 小儿感冒 | 472 | 11.5% | 否 |
| 小儿咳嗽 | 344 | 8.4% | 否 |
| 新生儿黄疸 | 294 | 7.1% | 中 |
| 小儿便秘 | 221 | 5.4% | 是 |
| 小儿支气管肺炎 | 205 | 5.0% | 是 |
少数病(便秘、支气管肺炎合计约 10%)样本明显偏少,直接训练易欠拟合;若做跨病种分类或按病种评估,建议对这些类别的样本做加权或上采样,避免被多数病掩盖(详见 §6.6 与 §7.5)。
§4.3 关键统计
对话结构随位置演变的规律是 IMCS-21 最重要的语料学发现之一,对任务设计有直接启示。论文将每条对话按话语位置切成五段(0-20%、20-40%、40-60%、60-80%、80-100%)后统计对话意图的位置分布,结论是:随着问诊深入,话题重心由症状逐渐转向药物、治疗与注意事项。具体表现为:对话早期以 R-SX/I-SX(询问与告知症状)为主,中段出现检查与既有治疗信息(EET),后段药品推荐(DR)、注意事项(PRCTN)与医疗建议(MA)占比上升。这一规律意味着一套好的自动问诊系统应当"先问清症状、后给方案",也解释了为什么 DDP 任务要把追问顺序的学习纳入建模——医疗对话并非均匀堆叠的语句,而是有明确阶段性结构的诊疗流程。
| 指标 | 数值 |
|---|---|
| 总对话数 | 4,116 |
| 总句数 | 164,731 |
| 平均每对话句数 | 40 |
| 平均每对话字数 | 523(含自述 580) |
| 平均每对话标注实体数 | 26 |
| 平均自述字数 | 约 57 |
| 平均每份报告字数 | 约 88 |
| 归一化标准症状 | 444(由 1,900+ 原始表述归一化) |
§4.4 数据层级
对话级(一条对话 + 疾病标签 + 医疗报告) → 句级(utterance,携带对话意图与说话人) → 实体级(症状提及及其 POS/NEG/NS、归一化) → 字符级(NER 的 BIO 标记落在每个中文字符上)。理解这条四级路径对正确消费数据至关重要:同一个症状实体既属于 NER 的字符 span,又作为 SLI 的实体级对象出现,二者需跨任务对齐。
| 层级 | 单位 | 核心标注 | 对应任务 | 切分约束 |
|---|---|---|---|---|
| L0 对话级 | 一条记录 | disease_label、症状集合、医疗报告(2 份) | MRG / DDP / SLI 汇总 | 不可分割,作为 train/dev/test 最小单元 |
| L1 句级 | 一个 turn | 说话人 + 16 类对话意图 | DAC | 句必须归属所在对话 |
| L2 实体级 | 一个症状提及 | POS / NEG / NS + 归一化标签 | SLI | 实体必须落在某字符 span |
| L3 字符级 | 一个中文字符 | BIO 标签(11 类) | NER | 字符必须顺序对应原文 |
这四级间是严格嵌套关系:L3 字符构成 L1 句子,L1 句子构成 L0 对话;L2 实体跨 L1 与 L3 锚定(一个实体既对应句子的某段、也对应其中字符的 B/I 标记)。因此预处理时建议建立一个"对话 → 句 → 字符"的三级索引表,一次解析多次复用,避免各任务各自重复切分导致边界漂移。
def build_char_index(record):
"""返回 [{turn_idx, char_off, char}...],供 NER/DAC/SLI 统一对齐复用"""
rows, off = [], 0
for ti, turn in enumerate(record.get("turns", [])):
for char in turn.get("utterance", ""):
rows.append({"turn_idx": ti, "char_off": off, "char": char})
off += 1
return rows, off # 全对话连续字符序列,用于跨层级对齐
建议将
build_char_index的输出落盘为共享缓存(key=dialog_id),NER、DAC、SLI、MRG 四任务消费同一份字符索引,可保证任何"实体 span 跨字段引用"的一致。
§4.5 缺失值与信息性缺失
IMCS-21 并非关系表结构,传统缺失值较少,但存在几类"信息性缺失",处理前务必辨析:
| 缺失现象 | 含义 | 是否信息性 | 建议 |
|---|---|---|---|
| 医疗报告"既往史"为空(约 60%) | 对话较少涉及既往史 | 是——反映对话真实内容,非漏标 | MRG 评估应允许空段,不可当作缺陷 |
| 某症状未被提及 | 患者未提及该症状 | 否——不表示阴性 | SLI 中"未提及"与"NEG"必须区分 |
| test_input 无标注 | 测试集真实标注仅存 CBLUE 平台 | 是(评测设计) | 本地开发用 dev,勿虚构 test 标注 |
| NER 的 O 标签占多数 | 大部分字符非实体 | 否 | 序列标注需处理类别不平衡 |
§5 划分与使用建议
官方划分
IMCS-21 由作者给定固定划分:train 2,472 / dev 833 / test_input 811(合计 4,116)。train 与 dev 均含完整标注,test_input 仅含输入文本(真实标注托管于 CBLUE@天池平台,需在其评测界面提交预测)。README 明确鼓励在 dev 上对比论文结果,若要正式打榜则走 CBLUE 通道。
| 划分 | 对话数 | 占全量比 | 标注是否齐备 | 主要用途 |
|---|---|---|---|---|
| train.json | 2,472 | 60.1% | 全标注 | 模型训练 |
| dev.json | 833 | 20.2% | 全标注 | 调参与 README/论文结果比对 |
| test_input.json | 811 | 19.7% | 仅输入无标签 | CBLUE@天池在线评测提交 |
一个值得注意的口径细节:划分发生在对话级,因此 train 中某条对话的全部句子不会出现在 dev/test。这保证了句级任务(DAC、SLI-EXP)即使逐句建模也不会发生跨划分泄漏,但研究者自建切分时必须保持同样的对话级约束(见 §5 泄漏风险)。
社区惯例划分
绝大多数下游研究直接沿用官方 train/dev 划分,避免自建划分以保证与论文基线可比。参与 CBLUE 评测者额外需遵循 imcs21-cblue 仓库的评测脚本与提交格式(含 bio2id/id2bio、sl2id/id2sl 映射文件)。
划分策略建议
- 若只做本地开发与复现,train 训练 + dev 验证即可覆盖绝大多数子任务;CBLUE 榜单结果通过提交测试获得。
- 跨任务研究建议在同一 dialog_id 上共享预处理缓存,确保 NER/DAC/SLI/MRG 消费同一份对话对齐结果,避免重复解析误差。
- DDP 训练需要 SLI 的结构化症状特征作为状态空间,应先固定 SLI 输出格式再接入 DDP,避免状态表示漂移。
- MRG 与 DAC 在论文中是级联关系(DAC 预筛 NON-OTHER 句供 MRG 生成)。若你做端到端联合建模,请明确报告是"用了 DAC 预筛"还是"纯对话直出",二者结果不可直接比较。
- 症状标签的 POS/NEG/NS 是实体级标注,一条对话可能出现同症状多次提及而标签不一致的边角情况——预处理时应定义"以多数标签为准"还是"以最近一次为准"的消歧策略,并在实验日志中记录。
数据泄漏风险(重点)
- 实体 span 跨句复用:同一症状/药品常在多句被提及,若把同一对话的句级样例切分进 train/test 会造成实体级泄漏。务必以 dialog_id 为最小不可分割单元做划分,禁止跨句切分。
- MRG 的级联依赖:论文用 DAC 预筛 NON-OTHER 句再生成报告,若你的测试切分与 DAC 训练同源,级联模型可能隐式学到"生成哪几类句子"的信号,导致报告生成虚高。
- SNOMED 归一化词典泄漏:symptom_norm.csv 作为公开词典若被喂给 NER/SLI,会泄露标准症状集合的完整边界,使"归一化"变成查表而非理解——评估时应谨慎披露是否使用了该词典。
- CBLUE 测试集重复提交:真实测试标注不在本地,若有人从竞品/打榜历史中倒推标注并注入本地"test 验证",属严重作弊,评审中应规避。
交叉验证建议
因对话长度与疾病类别强相关,若做 k-fold,推荐按疾病标签分层(stratified)切分,避免某一折缺少数病。小样本疾病(如支气管肺炎 205 条、便秘 221 条)在 k 折中尤其要保证至少一个完整对话不被切散。
# 对话级分层 k-fold(先按 dialog_id 聚合并以疾病标签分层,防句级泄漏)
import json
from sklearn.model_selection import StratifiedKFold
def grouped_stratified_split(path, n_splits=5, seed=0):
with open(path, encoding="utf-8") as f:
recs = json.load(f)
# 只按 dialog_id + disease_label 分层,整条对话作为不可切分单元
ids = [r["dialog_id"] for r in recs]
labs = [r["disease_label"] for r in recs]
skf = StratifiedKFold(n_splits=n_splits, shuffle=True, random_state=seed)
folds = list(skf.split(ids, labs))
return folds # 每折给出对话级索引,训练/验证都整对话进出
提示:对句中包含同症状多次提及的样本,分层依据建议同时纳入疾病与症状阴阳分布,降低类别极端不平衡折的出现概率。
外部验证建议
儿科领域的泛化宜用 MedDG、LCMDC 等中文医患对话或自建儿科门诊文本做外部验证;跨科室(成人心内/内分泌)泛化会显著退化,应明确为范围外。跨语言(英文 MedDialog 等)仅适合做方法学对照,不宜直接迁移术语学设定。
| 外部验证数据 | 适合检验的能力 | 限制 |
|---|---|---|
| MedDG(中文医患) | 实体抽取跨语料鲁棒性 | 标签体系与 IMCS-21 不同,需重标 |
| LCMDC(中文大语料) | 分诊/泛化 | 规模大、格式需适配 |
| 自建儿科门诊文本 | 真实场景落地 | 需伦理与脱敏审批 |
§6 AI 就绪指南
§6.0 云端快速启动(可选)
若使用 Colab/Kaggle 或自建 GPU 环境,可直接 git clone 官方仓库并按需拉取模型权重(如 hfl/chinese-bert-wwm、ERNIE 等)。数据集本体仅数 MB,云端开发无存储压力,主要成本来自预训练模型推理与 DDP 多轮模拟。一次性环境装配建议:
# 一次性安装:拉仓库 + 装依赖(python3)
git clone https://github.com/lemuria-wchen/imcs21.git
cd imcs21
pip install torch transformers datasets scikit-learn # 各任务按需增减
python - <<'PY'
import json, os
assert os.path.exists("dataset/train.json"), "仓库数据未就位,请确认在 imcs21 根目录"
rec = json.load(open("dataset/dev.json", encoding="utf-8"))
print("dev 样例数:", len(rec), "| 首条疾病:", rec[0].get("disease_label"))
PY
若遇到仓库内依赖版本较老(基于 transformers 早期版本),建议为每个任务建立独立虚拟环境,勿在单个环境混装可能冲突的深度学习依赖。
§6.1 快速上手
在动手前先明确三件事,避免白跑:
- 目录预期:下载官方仓库后数据在
dataset/下,各任务代码在task1_ner/…task5_ddp/;data_root指仓库根目录。 - 拼接关系:读 JSON 时用
data_root/dataset/train.json,不要与 task 子目录混淆;symptom 词典在dataset/symptom_norm.csv。 - 最小可用子集:若只想快速验证 NER/DAC,读取
dataset/dev.json前若干条即可;无需全量下载即可跑通解析。
# 最小解析脚本:读取 dev 集并打印一条对话的结构
import json
data_root = "path/to/imcs21"
with open(f"{data_root}/dataset/dev.json", encoding="utf-8") as f:
dev = json.load(f)
sample = dev[0]
print("dialog_id:", sample.get("dialog_id"))
print("disease_label:", sample.get("disease_label"))
print("self_report:", sample.get("self_report", "")[:80])
print("num_turns:", len(sample.get("turns", [])))
print("keys:", list(sample.keys()))
§6.2 数据获取
| 渠道 | 说明 | 访问 |
|---|---|---|
| 官方 GitHub | 数据 + 代码 + README | https://github.com/lemuria-wchen/imcs21 |
| CBLUE 测试集 | 在线评测,提交预测 | https://github.com/lemuria-wchen/imcs21-cblue |
| 相关 NBSDC 资源 | 复旦中山另版"第一届智能对话诊疗评测数据集"(申请制) | https://cstr.escience.org.cn/CSTR:16666.11.NBSDC.QUHA5KET |
# 克隆官方仓库(含完整数据与各任务基线代码)
git clone https://github.com/lemuria-wchen/imcs21.git
cd imcs21
ls dataset/ # 确认 train/dev/test/symptom_norm/mappings 就位
§6.3 预处理全流程
以 NER + DAC 联合建模为例,主流程:读 JSON → 组装对话级对象 → 为 NER 构造字符级 BIO 序列 → 为 DAC 构造句级样本 → 编码标签。建议统一复用 utils.py 中的 ID 映射。
# 将一条对话转成 NER 的字符级 tag 与 DAC 的句级 label
def flatten_dialogue(record):
# 假设每个 turn 带 text 与 token 级 ner 标签(见官方实际字段)
char_seqs, tag_seqs, act_seqs = [], [], []
for turn in record.get("turns", []):
chars = list(turn["text"]) # 中文按字符切分
tags = turn.get("ner_tags", ["O"] * len(chars))
char_seqs.extend(chars)
tag_seqs.extend(tags)
act_seqs.append(turn.get("act")) # 句级对话意图
return char_seqs, tag_seqs, act_seqs
提示:IMCS-21 为字符级 BIO,切分须按"字"而非"词";中文分词若提前介入可能破坏对齐,NER 建模不建议依赖外部分词。
§6.4 PyTorch DataLoader
以下给出一个可运行的最小 Dataset 类 + DataLoader,用于 NER(字符级 BIO)微调。
import json
import torch
from torch.utils.data import Dataset, DataLoader
ID2BIO = {0: "O", 1: "B-SX", 2: "I-SX"} # 需用官方 mappings.json 展开为全量 11 tag
VOCAB = {"[PAD]": 0, "[UNK]": 1} # 实际应用请用预训练 tokenizer
class IMCSNER(Dataset):
def __init__(self, path, max_len=256):
with open(path, encoding="utf-8") as f:
self.records = json.load(f)
self.max_len = max_len
def __len__(self):
return len(self.records)
def __getitem__(self, idx):
rec = self.records[idx]
chars, tags, _ = flatten_dialogue(rec) # 复用 §6.3
chars = chars[: self.max_len]
tags = tags[: self.max_len]
ids = [VOCAB.get(c, VOCAB["[UNK]"]) for c in chars]
label_ids = [ID2BIO[t] if t in ID2BIO else 0 for t in tags]
mask = [1] * len(ids)
return {
"input_ids": torch.tensor(ids, dtype=torch.long),
"labels": torch.tensor(label_ids, dtype=torch.long),
"attention_mask": torch.tensor(mask, dtype=torch.long),
}
def collate(batch):
def pad(k, pad_id):
x = [b[k] for b in batch]
m = max(len(t) for t in x)
return torch.stack([torch.cat([t, torch.full((m - len(t),), pad_id, dtype=t.dtype)]) for t in x])
return {k: pad(k, 0) for k in ("input_ids", "labels", "attention_mask")}
train_ds = IMCSNER("path/to/imcs21/dataset/train.json")
loader = DataLoader(train_ds, batch_size=16, shuffle=True, collate_fn=collate)
for batch in loader:
print(batch["input_ids"].shape) # [batch, max_len]
break
§6.4b 对话意图分类(DAC)的句级样例构造与训练骨架
DAC 以"句"为样本单位,标签为 16 类对话意图之一。需将每条对话的 turn 拍平为句级列表,并为每个句子附上其所属 dialog_id,便于后续按对话聚合做评估或分层采样。训练时可复用同一切分保证与 NER 的对话粒度一致,但不可在句级做随机 train/test 切分(同一条对话的不同句子被拆开会造成泄漏)。
def build_dac_samples(path):
with open(path, encoding="utf-8") as f:
records = json.load(f)
samples = []
for rec in records:
for i, turn in enumerate(rec.get("turns", [])):
samples.append({
"dialog_id": rec.get("dialog_id"),
"turn_idx": i,
"text": turn.get("utterance", ""),
"speaker": turn.get("speaker", ""),
"label": turn.get("act"), # 16 类意图
})
return samples
dac_train = build_dac_samples("path/to/imcs21/dataset/train.json")
print("句级样本数:", len(dac_train)) # train 集远大于 2,472(每对话约 40 句)
训练骨架(以标准 BERT 分类器为例,仅示意优化循环):
import torch.nn as nn
from transformers import BertTokenizer, BertForSequenceClassification
def train_dac(train_samples, id2label, epochs=3):
tokenizer = BertTokenizer.from_pretrained("bert-base-chinese")
model = BertForSequenceClassification.from_pretrained(
"bert-base-chinese", num_labels=len(id2label))
opt = torch.optim.AdamW(model.parameters(), lr=2e-5)
for ep in range(epochs):
for s in train_samples:
enc = tokenizer(s["text"], truncation=True, max_length=128,
return_tensors="pt")
out = model(**enc, labels=torch.tensor([s["label"]]))
opt.zero_grad()
out.loss.backward()
opt.step()
return model
工程提示:句级数据量是对话级约 40 倍(164,731 句对 4,116 对话),训练 DAC 时若逐句前向会很慢,务必用 DataLoader 分批并缓存 tokenizer 编码结果(
enc一次编码后可落盘复用,避免每 epoch 重复分词)。
§6.5 坑点 8 个
⚠️ 坑点 1:字符级 BIO 与分词/子词的边界错位(分类:工程陷阱)
问题:IMCS-21 的 NER 标签落在每个中文字符上(BIO 三位字符级),而中文预训练模型(BERT 等)用 WordPiece/BPE 子词切分,二者 token 边界不一致。
症状:直接按子词取第一个 token 的标签做序列标注,会出现标签错位、实体边界偏移,F1 异常偏低。
解决:
- 简单方法:把对话按"字"转成一个字符序列,用字向量或把每个汉字当作单 token 喂入自建字符级模型(对较短样本可行)。
- 进阶方法:做子词→字符的对齐映射,利用 BERT 中文分词后把子词与字符逐一对齐,仅取每个字的起始子词位置输出标签。
- SOTA 方法:用字符级 CRF 头 + 细粒度中文预训练(如 ERNIE/中文 BERT 的 wwm 变体),配合 LEBERT/FLAT 等词格(lattice)结构捕获词边界。
参考:GitHub lemuria-wchen/imcs21 NER 基线说明;LEBERT/FLAT 论文对字符-词格标注的处理。
⚠️ 坑点 2:症状未归一化——同一症状多种写法(分类:标签理解)
问题:对话口语中"发烧 / 发热 / 热 / 低烧"等都指"发热",约 1,900+ 原始表述需归一到 444 个标准症状。若不归一化,NER 会产出海量同义不同 id 的"伪实体"。
症状:实体类别统计虚高、SNOMED 链接失败、SLI 的 444 维标签空间几乎不可训练。
解决:
- 简单方法:直接加载官方
symptom_norm.csv做词典后映射,把同义表述合并为标准症状名。- 进阶方法:NER 输出后接字符串匹配/编辑距离聚类,把未收录表述归一到最邻近标准症状。
- SOTA 方法:在实体抽取阶段就引入归一化损失(如联合学习实体 span + 其标准概念),减少两级流水线的误差。
参考:imcs21-cblue 症状标签说明(归一化标签 + 类别标签);Bioinformatics 论文 §4.2 症状分析。
⚠️ 坑点 3:症状阴阳(NEG/NS)极易被误判为 POS(分类:标签理解 / 评估误用)
问题:SLI 要求判断症状是确定阳性(POS)、确定阴性(NEG)还是不确定(NS),其中非阳性症状约占提及的 40%。仅看"句中出现了症状词"就判 POS 是最大陷阱。
症状:SLI-POS 指标虚高而 NEG/NS 的 P/R 极低;BERT-MTL 在 SLI-IMP(推断)的 Subset Accuracy 仅约 36。
解决:
- 简单方法:训练时对 POS/NEG/NS 做加权或过采样,缓解 NEG/NS 样本稀疏。
- 进阶方法:用句级上下文(是否含"没有"“不发烧”"未见"等否定词)做规则先验,再交给模型微调。
- SOTA 方法:把 SLI-IMP 建模为带上下文推理的多标签/序列任务,融合句级 DAC(如 I-SX)作为提示,论文 BERT-MTL 即此思路但仍有提升空间。
参考:Bioinformatics 论文 §5 SLI 与结果表(SLI-IMP 推断 SA 约 33-37)。
⚠️ 坑点 4:对话意图的说话人不对称——医生也会"告知症状"(分类:标签理解)
问题:直觉上 I-SX(告知症状)只来自患者,但医生可能根据患者含糊描述主动提醒(如"你体温偏高,属发热")被标为 I-SX。按"说话人"猜意图会出错。
症状:把 DAC 当"按 speaker 的角色分类"会让医生端 I-SX 全错;或把 DAC 退化成 speaker 二分类而丢失语义。
解决:
- 简单方法:训练 DAC 时必须输入完整句子文本而非常用"说话人角色"特征,让模型学语义而非角色。
- 进阶方法:引入 speaker 特征作为辅助但保留文本主导,避免模型偷懒按角色分类。
- SOTA 方法:建模句级对话历史(前几轮意图),因为医生"提醒症状"往往紧跟患者含糊叙述,需要上下文消歧。
参考:Bioinformatics 论文 §4.3 对话结构分析(I-SX 双向出现例证)。
⚠️ 坑点 5:MRG 报告生成的级联误差与空段处理(分类:评估误用)
问题:论文在测试阶段先用 DAC 模型预筛 NON-OTHER 句再喂给报告生成器;且约 60% 报告"既往史"为空。若直接拿全对话生成或把空段当缺失,指标失真。
症状:不筛句时生成器把无关寒暄写进报告;把空"既往史"当缺陷惩罚会让 MRG 指标普遍偏低且不具可比性。
解决:
- 简单方法:报告评估按六段分字段独立计算 BLEU/ROUGE,允许"既往史"合法为空,单独统计空段率。
- 进阶方法:复刻论文的级联流程——用 DAC 抽出 NON-OTHER 句作生成源,报告级 C-F1 用训练好的 NER 提取概念。
- SOTA 方法:改用先抽取后生成的两阶段(先选关键句再受控生成),并对空段输出做显式建模(e.g.,输出"无"token)。
参考:GitHub README MRG 结果表与 eval 说明;Bioinformatics 论文医疗报告分析段落。
⚠️ 坑点 6:DDP 训练依赖 SLI 的结构化状态,且评测口径多样(分类:数据泄漏 / 工程陷阱)
问题:诊断导向对话策略(DDP)的强化学习状态来自 SLI 需预测的结构化症状特征,且每篇相关论文实现各异;直接用开源 RL 实现复现结果常与论文对不上。
症状:DQN/GAMP 等在不同开源实现下 Rec/Acc/#Turns 差异大(GitHub 与论文数字不一致,作者也提示重训有偏差),直接照搬易翻车。
解决:
- 简单方法:先用作者提供的 dev 集结果与 README 校准环境,确认状态表示与 reward 一致再训。
- 进阶方法:统一用结构化症状特征定义 MDP 状态,避免让对话自由文本直接进入 RL,降低不稳定性。
- SOTA 方法:对比 HRL(论文中 Rec 0.295/Acc 0.556/#Turns 6.99)等分层方法,关注采样效率与 #Turns 的 trade-off。
参考:GitHub README DDP 任务说明(作者提示 dev DDP 结果只在 README 提供);Bioinformatics 论文 §5 DDP。
⚠️ 坑点 7:测试集标注不在本地,本地只有 test_input(分类:工程陷阱)
问题:官方仓库的 test_input.json 仅含输入文本,真实 test 标注托管于 CBLUE@天池。初用者常误以为 test_input 是完整标注集而直接算"测试指标"。
症状:本地对 test_input 无金标准可评估;把 dev 当 test 汇报会造成结果不可复现,评审时被质疑。
解决:
- 简单方法:本地开发与论文对比一律用 dev.json(README 已公布 dev 结果),test 仅作 CBLUE 提交。
- 进阶方法:若要上线打榜,严格按 imcs21-cblue 的评测脚本与 bio2id/sl2id 映射提交格式生成结果。
- SOTA 方法:评测得分公开后,用官方 leaderboard 分数对照你的本地 dev 估计,校准离榜偏差。
参考:GitHub README 与 imcs21-cblue 仓库说明。
⚠️ 坑点 8:儿科专科局限与疾病混淆导致的过拟合假象(分类:偏倚陷阱)
问题:语料仅覆盖儿科 10 病、单一在线问诊平台,且部分疾病特征重叠(感冒 vs 上感 vs 支气管炎),诊断标签存在可观测噪声——感冒类报告诊断命中率仅约 65.6%。
症状:在 dev 上 Acc 很高,换到成人或非儿科数据立即崩;或模型把"症状多"当"病重"而系统性误诊相似疾病。
解决:
- 简单方法:明确把模型定位为"儿科初诊辅助",严禁宣称全科诊断能力;在报告中披露疾病分布与混淆风险。
- 进阶方法:用 MedDG/LCMDC 或自建儿科文本做外部验证,量化跨疾病谱的退化幅度。
- SOTA 方法:融入疾病-症状先验知识图谱约束,帮助区分特征重叠的相近疾病(如感冒与上感的边界)。
参考:Bioinformatics 论文 §4.3 医疗报告分析(Cold 65.6% vs Jaundice 98.1% 的疾病差异)。
§6.6 数据增强(安全 ✅ / 危险 ❌)
- ✅ 安全:对话级回译(中文→英文→中文)增强 MRG 多样性;同义症状改写(用 symptom_norm 别名)增强 NER 鲁棒性。
- ✅ 安全:对 NER 做字符级随机替换/遮挡(保持 BIO 边界同步移动)。
- ✅ 安全:对少数病种(支气管肺炎、便秘)做对话级上采样,缓解类别不平衡,注意同步复制其全部多级标注。
- ⚠️ 需谨慎:对 SLI 的否定表达做同义改写——如"没有发烧"改写需保持否定语义不反转(见危险项)。
- ❌ 危险:对 SLI 用否定词随机插入——会反转 POS/NEG 语义,制造噪声标签。
- ❌ 危险:跨对话拼接句子制造"伪长对话",破坏 DDP 的真实状态转移结构。
- ❌ 危险:对实体 span 只增删不改边界——若插入的字符落在实体内部而未同步移动 B/I/O,会产生错位标签,训练时模型学到的是噪声。
针对"否定词插入会反转语义"这一高风险陷阱,给出一个可安全落地的同义改写示例(仅替换不影响语义的虚词/语序):
import re
# 安全增强:对"没有 X / 不 X / 未见 X"这类否定结构保持原样,只改写中性连接
def safe_rewrite(text):
# 检测否定意图锚点,命中则跳过改写,避免语义反转
neg = re.search(r"(没有|不|没|未|未见)", text)
if neg:
return text # 否定句不做盲目改写
# 仅对纯中性句做轻替换(示例占位,实际请用受控同义词表)
return text.replace("宝宝", "孩子").replace("医生", "大夫")
原则:凡改写可能触及 POS/NEG/NS 语义的操作,一律先过否定词检测;对 NER,任何字符级操作都要保证 BIO 标签随实体边界同步平移。
§6.7 模型推荐表
| 任务 | 推荐起点模型 | 报告指标参考(示例) | 备注 |
|---|---|---|---|
| NER | LEBERT / FLAT | token F1 ~92(LEBERT test) | 词格结构对中文实体友好 |
| NER(备选) | BERT / ERNIE | token F1 ~90.6-90.7 | 预训练微调,便于与 DAC 共享底座 |
| DAC | ERNIE / BERT | Acc ~82 | 中文预训练 + 医学域微调 |
| SLI | BERT-MTL | SLI-IMP SA ~36 | 多任务联合上下文推理 |
| SLI(识别对照) | BERT-MLC | SLI-EXP SA ~73 | 简单多标签,适合 EXP 任务 |
| MRG | T5 / ProphetNet | B-2 ~62.6(T5) | 生成式预训练适合报告生成 |
| MRG(诊断准确优先) | PG | D-Acc ~56.6 | 若目标是命中诊断而非流畅续写可考虑 |
| DDP | HRL | Rec ~0.295 / Acc ~0.556 | 分层强化学习多轮交互 |
选型要点:① NER/DAC/SLI 三类"理解型"任务可共享同一中文预训练底座(BERT/ERNIE),便于做多任务联合;② MRG 选型要区分"流畅续写"(T5)与"准确命中诊断"(PG 的 D-Acc 反而更高)两种优化目标;③ DDP 属交互型,前端理解器质量会直接影响策略表现,应先用强理解模型垫底。
§6.8 硬件需求
| 场景 | 最小配置 | 推荐配置 | 说明 |
|---|---|---|---|
| 解析/统计 | 单 CPU 4GB | 8GB | 数据量小,无压力 |
| NER/DAC/SLI 微调 | 单卡 12GB(如 2080Ti) | 24GB 单卡 | 中文 BERT 系列即可 |
| 多任务联合(NER+DAC+SLI) | 16GB | 24-40GB | 共享编码器需更大 batch |
| MRG 生成(T5 类) | 16GB | 24-40GB | 序列生成显存占用高 |
| DDP 强化学习 | 16GB | 多卡或 CPU 采样 + GPU 评估 | 多轮模拟耗时长,需高效采样 |
| 云端(Colab/Kaggle) | T4 16GB | A100/L4 | 适合快速复现,DDP 建议本地跑 |
§6.9 评估指标代码
IMCS-21 各任务指标口径不同:NER 分实体级与 token 级 F1;DAC 报 P/R/F1(macro)与 Acc;SLI 报 example 级 SA/HL/HS 与 label 级 P/R/F1;MRG 报 BLEU-2/4、ROUGE、概念 C-F1、正则诊断 D-Acc;DDP 报症状召回 Rec、诊断 Acc 与平均交互轮数 #Turns。示例如下:
# NER token 级 micro F1(简化示意)
def token_f1(preds, golds):
tp = sum(p == g and g != "O" for p, g in zip(preds, golds))
p_num = sum(p != "O" for p in preds)
g_num = sum(g != "O" for g in golds)
p = tp / p_num if p_num else 0
r = tp / g_num if g_num else 0
return 2 * p * r / (p + r) if (p + r) else 0
# MRG 正则诊断准确率 D-Acc(官方 eval_acc.py 思路)
import re
def diag_acc(report_diag, true_label):
return 1.0 if re.search(true_label, report_diag) else 0.0
# SLI 的 example 级 subset accuracy(SA):一条对话的所有症状预测必须全对才计 1
def subset_accuracy(pred_sets, gold_sets):
return sum(p == g for p, g in zip(pred_sets, gold_sets)) / len(pred_sets)
# SLI 的 hamming loss(HL):标签子集间不一致比例,越低越好
def hamming_loss(pred_sets, gold_sets, num_labels):
tot = sum(len(set(p) ^ set(g)) for p, g in zip(pred_sets, gold_sets))
return tot / (len(pred_sets) * num_labels)
# DAC macro-F1(跨 16 意图的宏平均)
from collections import Counter
def macro_f1(preds, golds):
classes = set(golds) | set(preds)
f1s = []
for c in classes:
tp = sum(p == c and g == c for p, g in zip(preds, golds))
fp = sum(p == c and g != c for p, g in zip(preds, golds))
fn = sum(p != c and g == c for p, g in zip(preds, golds))
p = tp / (tp + fp) if (tp + fp) else 0
r = tp / (tp + fn) if (tp + fn) else 0
f1s.append(2 * p * r / (p + r) if (p + r) else 0)
return sum(f1s) / len(f1s) if f1s else 0
注意:BLEU/ROUGE 对中文需先做标准中英混合规范化;token 级 vs 实体级 F1、SLI 的 example 级(SA/HL/HS)与 label 级(P/R/F1)均不可直接混比,跨模型比较务必统一口径。MRG 的 C-F1 需用训练好的 NER 先抽取报告中医学概念,属于嵌套评估,实现前先确认概念抽取器版本一致。
§6.10 MLOps 笔记
- 用 dataset 版控(记录 2.0 hash)与任务代码绑定,跨任务共享同一份对话对齐缓存,避免重复解析漂移。
- DDP 训练产生大量模拟轨迹,建议将交互日志结构化落盘,便于回放与 reward 审计。
- CBLUE 提交用固定随机种子与版本号,保留每次提交的生成脚本,便于失败回滚与榜单对照。
- 记录 symptom_norm 与 mappings 的使用版本——词典版本变更会直接影响 SLI 标签空间,属重破坏性变更。
§7 质量评估与局限性
§7.1 已知偏倚表
| 类型 | 描述 | 严重程度 | 缓解 |
|---|---|---|---|
| 领域/疾病偏倚 | 仅儿科 10 病,单一在线平台 | 高 | 定位为儿科初诊基准,勿外推全科 |
| 标签类别不平衡 | 疾病样本 205-543 不均,症状实体占约 58% | 中 | 分层切分 + 加权/过采样 |
| 症状阴阳不平衡 | 非阳性症状约占 40%,NEG/NS 推断难 | 高 | 上下文建模 + 否定词先验 |
| 诊断标签噪声 | 感冒类报告命中仅约 65.6% | 中 | 评估以多折 + 报告互证为准 |
| 人群偏倚 | 在线问诊用户 ≠ 门诊全体,家长代述为主 | 中 | 报告中披露,外部验证补足 |
| 标注风格偏倚 | 报告为众包式、格式固定 | 低 | 双报告参考,MRG 用双份比对 |
§7.2 标注质量
标注一致性经论文以"医疗报告诊断部分"间接校验:正则匹配下约 84.7% 报告命中真实疾病或其关键概念,作者评为 satisfactory;但疾病间差异明显(黄疸 98.1% vs 感冒 65.6%)。实体/意图层面标注经多人共识规则校正,症状实体用 AC 自动机预标注后人工修正。总体:多级互证 + 双报告设计使标注质量在同类中文医患对话语料中属较高水平,但"报告诊断"的主观推断部分需谨慎对待。
§7.3 泛化性
| 场景 | 失效风险 | 证据 |
|---|---|---|
| 儿科 10 病内 | 低(但感冒/上感/支气管炎易混) | 报告命中率疾病差异 |
| 其他儿科疾病 | 中——依赖与 10 病重叠度 | 未见覆盖,需自测 |
| 成人 / 非儿科 | 高 | 语料与任务均儿科设定 |
| 真实门诊(非在线) | 中——风格与代述差异 | 未见覆盖 |
| 英文/跨语言 | 高 | 中文口语标注不可直接迁移 |
§7.4 伦理
数据源自公开在线问诊并脱敏,属于研究用文本语料。使用时应:(1) 不以个体可识别信息推断患者身份;(2) 明确模型仅作研究辅助,禁止替代医生诊断;(3) 对儿科患者家庭数据尤其注意隐私合规。发布者未在公开页面提供细粒度原始隐私元数据,符合对话语料轻脱敏定位。
需强调三条伦理边界:其一,儿科对象的脆弱性——语料涉及未成年人健康信息,虽为家长代述,但研究者发布派生数据或模型 demo 时应避免重现可辨识的家庭医疗片段;其二,诊断输出的滥用风险——IMCS-21 训练出的"诊断"模型本质是 10 分类标签选择器,若被包装成面向家长的"AI 儿科诊断"产品,可能造成延误就医等现实伤害,必须在产品边界上明确禁用声明;其三,AI 问诊的可问责缺口——若系统建议替代真实儿科面诊,其责任归属(平台/医院/开发者)在现有监管框架下并不清晰,研究展示与部署时应主动规避"替代执业医师"的暗示。
§7.5 公平性
数据集未提供患者性别、地区、社会经济等结构化人口字段,无法从数据内部做系统的公平性审计。儿科疾病谱的性别/年龄构成差异未被标注,研究者若在自建外部儿科数据上评估不同亚群表现,应在报告中明确人群局限。此外,疾病类别间样本量从 205 到 543 不均,若以总体 Acc 为唯一指标,少数病(便秘、支气管肺炎)的表现会被多数病掩盖——公平评估建议同时报告按疾病的混淆矩阵与逐病 F1。
§7.6 数据漂移
语料为 2021-2022 的静态快照,之后未见官方持续更新。在线问诊话术、儿科指南、平台交互方式随时间变化可能引入分布漂移;复用于 2026 年后的真实场景前,建议用近期儿科问诊文本做小规模校准。
§7.7 DAIMS 24 项数据就绪度评估
| # | 检查项 | 状态 | 说明 |
|---|---|---|---|
| 1 | 数据为宽格式(每行一个样本/事件) | ✅ | JSON 每条对话一条样例,结构清晰 |
| 2 | 有唯一标识符列 | ✅ | dialog_id 唯一 |
| 3 | 无 Unicode 或特殊字符 | ⚠️ | 中文自然文本含口语、标点,需自行清洗归一 |
| 4 | 无重复行 | ⚠️ | 官方未提供去重脚本,跨任务共享需自检 |
| 5 | 缺失值已识别并编码 | ✅ | §4.5 列出既往史为空等编码 |
| 6 | 标签列被明确标识 | ✅ | disease_label / 实体 / 意图 / 症状 / 报告均为明确标注 |
| 7 | 已对罕见类别(<3%)进行分组 | ⚠️ | 小病种(便秘 221 / 肺炎 205)未分组 |
| 8 | 偏倚评估已完成 | ✅ | §7.1 列出疾病/阴阳/人群偏倚 |
| 9 | 有完整的数据字典 | ✅ | README + 本文档 + mappings.json |
| 10 | 对信息性缺失有明确编码解释 | ✅ | §4.5 既往史空/未提及症状区分 |
| 11 | 数据采集设备和设置已记录 | ✅ | §3.9 在线平台文本 + SNOMED-CT 锚点 |
| 12 | 已移除完全共线性变量 | ✅ | 文本语料无结构化共线列 |
| 13 | 对编码的映射标准已说明 | ✅ | symptom_norm/mappings 明确 |
| 14 | 对时间戳的处理已明确说明 | ⚠️ | 无逐条时间戳,仅静态快照 |
| 15 | 训练/验证/测试划分建议已给出 | ✅ | 官方 train/dev/test 划分 |
| 16 | 数据泄漏风险已被讨论 | ✅ | §5.3 列出实体复用/级联/词典泄漏 |
| 17 | 标签分布已被分析 | ✅ | §4.2 实体/意图/疾病分布 |
| 18 | 选择性测量偏倚已被讨论 | ⚠️ | 在线问诊人群抽样局限已在 §7.1 |
| 19 | 外部验证建议已给出 | ✅ | §5 建议 MedDG/LCMDC 等外部验证 |
| 20 | 数据更新和版本信息已记录 | ✅ | 2.0(6 病→10 病)时间轴见 §1.4 |
| 21 | 最小必要预处理脚本已提供 | ✅ | 各任务基线代码齐全 |
| 22 | 合规使用要求已明确 | ✅ | CC BY 4.0 / CBLUE 评测规则 |
| 23 | 多模态对齐方法已说明 | ✅ | 纯文本,字符/句/对话三级对齐已在 §4.4 |
| 24 | 去标识化方法已被记录 | ⚠️ | 说明脱敏后发布,具体算法细节未公开 |
DAIMS 评分:21 / 24
评分解读:优秀——多级标注设计规范、官方划分与各任务基线代码齐备、标签分布与文档化在同类中文医患对话语料中属一流。扣分集中在三类非致命项:中文口语文本需自行清洗(#3)、小病种未分组(#7)、以及去标识化算法细节未公开(#24)。
对你意味着什么:IMCS-21 的 21 个 ✅/⚠️ 中,真正需要你动手的主要是"语料清洗"(中文口语、标点归一)与"小病种处理"(低资源疾病建议做增强或合并),其余官方已给到位。⚠️ 项的共性是"静态语料 + 平台局限"——用前务必声明儿科范围,用后务必在自建儿科文本上做外部验证。相比其 5 任务一体的设计,这是一套"几乎开箱可用、但要用在儿科才有意义"的高就绪度数据集,评分反映的是工程就绪而非临床通用性。
§7.8 外部验证矩阵
| 外部数据集/场景 | 来源机构 | 评估任务 | 性能指标 | 相对内部变化 | 关键发现 |
|---|---|---|---|---|---|
| MedDG | 公开中文医患对话 | NER/对话理解(相近任务) | 视实现而定 | 需跨语料重训 | 仅作方法学对照,标签体系不同 |
| LCMDC(2024) | 中文医患对话大语料 | 分诊/问诊 | 视实现而定 | 分布更广 | 可做跨域泛化验证 |
| 自建儿科门诊文本 | 用户自备 | MRG/DDP | 视实现而定 | 需报告 | 检验真实场景退化,推荐 |
注:IMCS-21 官方论文未提供对其他外部医疗对话数据集的横向基准验证;此处建议性矩阵来自生态综述与任务设计推断,非同行评审结论。
为什么 IMCS-21 的外部验证尤其关键?三点原因:其一,数据单一性——语料仅来自一个在线平台(拇指医生),对话风格、家长话术、医生模板高度同质,模型很容易过拟合到该平台的写作习惯而非儿科医疗本身;其二,诊断标签为主诉性而非终末性——换到含真实确诊(实验室/影像证实的电子病历)的外部儿科语料,才能检验模型是否真的"抓对了病"而非只在 10 个固定标签里挑最像的;其三,疾病谱局限——10 病之外的儿科疾病完全没有覆盖,外部验证是发现"哪些病会被错误归到 10 病里"的唯一手段。因此,任何声称 IMCS-21 模型"可落地"的工作都应附一段自建或第三方儿科语料的外部验证,否则结论仅限于数据集内分布。
§8 基准性能与生态
§8.1 排行榜(基线参考)
IMCS-21 官方未设公开 leaderboard 表,但 CBLUE@天池托管其测试集在线评测。以下为作者论文/README 报告的典型基线(token 级 / 官方 dev+test 口径),完整榜单请以 CBLUE 平台实时为准。
| 任务 | 模型 | 关键指标 | 年份 | 技术 | 完整引用 | 代码 |
|---|---|---|---|---|---|---|
| NER | LEBERT | token F1 test 92.14 | 2022 | 词格 BERT | Chen et al., 2022, Bioinformatics. DOI:10.1093/bioinformatics/btac817 | 官方 task1 |
| NER | BERT | token F1 test 90.59 | 2022 | 预训练微调 | 同上 | 官方 task1 |
| DAC | ERNIE | Acc test 81.91 | 2022 | 医学预训练 | 同上 | 官方 task2 |
| DAC | BERT | Acc test 81.65 | 2022 | 预训练微调 | 同上 | 官方 task2 |
| SLI-EXP | BERT-MLC | SA test 73.24 | 2022 | 多标签 | 同上 | 官方 task3 |
| SLI-IMP | BERT-MTL | SA test 35.88 | 2022 | 多任务推断 | 同上 | 官方 task3 |
| MRG | T5 | BLEU-2 test 62.57 | 2022 | 生成式预训练 | 同上 | 官方 task4 |
| DDP | HRL | Rec 0.295 / Acc 0.556 | 2022 | 分层强化学习 | 同上 | 官方 task5 |
以下补充 MRG 与 DDP 任务的完整报告口径,便于研究者对齐(数据取自 GitHub README 与论文结果表):
| 模型(MRG) | BLEU-2 | BLEU-4 | ROUGE-1 | ROUGE-2 | ROUGE-L | C-F1 | D-Acc |
|---|---|---|---|---|---|---|---|
| Seq2Seq | 54.43 | 43.95 | 54.13 | 43.98 | 50.42 | 36.73 | 48.34 |
| PG | 58.31 | 49.31 | 59.46 | 49.79 | 56.34 | 46.36 | 56.60 |
| Transformer | 58.57 | 47.67 | 57.25 | 46.29 | 53.29 | 40.64 | 54.50 |
| T5 | 62.57 | 52.48 | 61.20 | 50.98 | 58.18 | 46.55 | 47.60 |
| ProphetNet | 58.11 | 49.06 | 61.18 | 50.33 | 57.94 | 49.61 | 55.36 |
| 模型(DDP) | 症状召回 Rec | 诊断准确 Acc | 平均交互轮数 #Turns |
|---|---|---|---|
| DQN | 0.047 | 0.408 | 9.750 |
| REFUEL | 0.262 | 0.505 | 5.500 |
| KR-DQN | 0.279 | 0.485 | 5.950 |
| GAMP | 0.067 | 0.500 | 1.780 |
| HRL | 0.295 | 0.556 | 6.990 |
观察:MRG 中 T5 的 BLEU 最高但正则诊断准确 D-Acc 最低(47.60),而 PG 的 D-Acc 反而最高(56.60)——说明"流畅续写"与"准确命中诊断"是两种不同能力,评估报告生成务必同时看 BLEU/ROUGE 与 C-F1/RD-Acc,勿单凭 BLEU 选型。DDP 中 HRL 在 Rec 与 Acc 上领先,但 #Turns 明显多于 GAMP——若要控制问诊轮数需另做取舍。
重要:GitHub 上的结果与论文略有不同(作者重训所致)。跨论文/跨 README 比较时,请统一采用论文内或 README 内单一口径,勿混用。SLI 的 example 级 SA 与 label 级 P/R/F1、NER 的实体级与 token 级 F1 均不可直接互比。
§8.2 SOTA 总结与选型建议
截至检索(2026-09),IMCS-21 上尚无公开统一 “SOTA leaderboard” 覆盖五任务;作者基线可作为起点而非终点。选型建议:NER/DAC 这类抽取与分类任务,用中文医学预训练(ERNIE/BERT)+ 词格结构的 LEBERT/FLAT 收益最大;SLI 难点在 NEG/NS 推断,应优先多任务 + 上下文建模;MRG 用生成式预训练(T5/ProphetNet);DDP 属强化学习前沿,从 HRL 类分层方法起步并关注 #Turns 收敛。
§8.3 评测协议
官方对 NER 同时要求实体级(按 CoNLL-2003 风格各类别 token F1)与 token 级(micro P/R/F1)指标;DAC 报 macro P/R/F1 + Acc;SLI 分 SLI-EXP(识别)与 SLI-IMP(推断)两类,报 example 级 SA/HL/HS 与 label 级 P/R/F1;MRG 报 BLEU/ROUGE/C-F1/RD-Acc,其中 C-F1 需借助训练好的 NER 抽取概念;DDP 报 Rec/Acc/#Turns。测试集统一经 CBLUE@天池评测脚本按官方映射输出。
§8.4 相关数据集
| 数据集 | 说明 | 规模/模态 | 与 IMCS-21 关系 |
|---|---|---|---|
| MedDialog | 大规模医患对话 | 百万级对话文本 | 规模大、无多级标注 |
| MedDG | 实体中心医患对话 | 约 1.7 万对话 | 任务覆盖窄(仅实体) |
| LCMDC | 中文大对话语料(2024) | 大语料,偏分诊 | 后发,沿用 AMC 思路 |
| CMeEE / CMeIE | 中文医学实体/关系 | 数万标注实例 | 静态文档,非对话 |
| CHIP 系列评测 | 中文医疗评测 | 多任务评测集 | 生态同源,任务互补 |
| CBLUE | 中文医学语言理解评测基准 | 多数据集集成 | IMCS-21 作为其新增医疗对话任务被纳入 |
| NBSDC IMCS21(复旦中山版) | 医患问诊 NER | 超 12 万句 | 同名不同源,见 §9 |
§8.5 关键论文 Top5-10
| 论文/资源 | 年份 | 一句话贡献 | 引用/来源 |
|---|---|---|---|
| Chen et al., A Benchmark for Automatic Medical Consultation System (Bioinformatics 39(1), btac817) | 2022 | 提出 IMCS-21 与两框架五任务,建立中文医患对话统一基准 | DOI:10.1093/bioinformatics/btac817 |
| Chen et al., 同题 arXiv:2204.08997 | 2022 | 开放获取预印本,含完整附录、标注示例与基线细节 | arXiv:2204.08997 |
| Conceptualized Representation Learning for Chinese Biomedical Text Mining(Biomedical BERT 类) | 2020 | 中文医学预训练基础(被引于作者基线讨论) | 论文引用链 |
| Bidirectional LSTM-CRF Models for Sequence Tagging | 2015 | 序列标注基础结构,NER 基线依赖 | arXiv:1508.01991 |
| Medical Dialogue: A Survey of Categories, Methods, Evaluation and Challenges | 2024 | 综述医疗对话,将 IMCS-21 归入任务化医患对话语料 | 检索见 arxiv 引用链 |
| LCMDC: Large-scale Chinese Medical Dialogue Corpora(2024) | 2024 | 后发大语料,延续自动问诊方向并扩展覆盖 | arxiv 引用链 |
| Two Tales of Persona in LLMs: A Survey | 2024 | 引用 IMCS-21 作为对话数据集用例 | arxiv 引用链 |
补充 NER 各模型完整 token 级结果(实体边界能力),供复现对齐:
| NER 模型 | split | 症状 SX | 药品名 DN | 药品类 DC | 检查 EX | token F1 |
|---|---|---|---|---|---|---|
| BERT | test | — | — | — | — | 90.59 |
| ERNIE | test | — | — | — | — | 90.67 |
| LEBERT | test | — | — | — | — | 92.14 |
| Lattice LSTM | test | — | — | — | — | 90.00 |
完整各类别细粒度 F1 见官方 README 与论文补充材料;此处仅列总 token F1,避免引述未经逐列核对的分值。
§8.6 社区活跃度
官方仓库 lemuria-wchen/imcs21 截至检索(2026-09)约 50 stars、11 forks、3 open issues,Size 约 18 MB,最后维护 2022-12-24;热度属学术型稳定封存,无高频 commit。活跃体现在 CBLUE 评测引用与中文医疗对话后续工作(如 LCMDC 等)持续引用其框架。新研究若需 issue 支持,主要来自 CBLUE 任务讨论与社区 fork。
§8.7 生态快照表
| 资源 | 类型 | 链接 | Star/关注 | 推荐理由 |
|---|---|---|---|---|
| 官方 GitHub | 数据+代码 | github.com/lemuria-wchen/imcs21 | ~50(截至 2026-09) | 数据与五任务基线一体 |
| CBLUE 天池仓库 | 评测 | github.com/lemuria-wchen/imcs21-cblue | — | 测试集与官方评测脚本 |
| NBSDC 复旦中山版 | 相关数据 | cstr.escience.org.cn/CSTR:16666.11.NBSDC.QUHA5KET | — | 另版复旦中山医患 NER 语料(申请制) |
§9 相关资源与引用
官方资源
- 官方数据/代码仓库:https://github.com/lemuria-wchen/imcs21
- 原始论文(Bioinformatics):https://doi.org/10.1093/bioinformatics/btac817
- arXiv 预印本:https://arxiv.org/abs/2204.08997
- CBLUE@天池测试集仓库:https://github.com/lemuria-wchen/imcs21-cblue
- 联系邮箱:zywei@fudan.edu.cn(复旦)/ jiajiepeng@nwpu.edu.cn(西工大)
相关但需区分的资源(NBSDC 同名资源)
检索时务必注意:国家基础学科公共科学数据中心(NBSDC)另托管了一份同样以 IMCS21 为英文名的资源——「第一届智能对话诊疗评测数据集」(CSTR:16666.11.nbsdc.qUha5KEt)。该资源由魏忠钰作为数据所有者登记、源自复旦大学附属中山医院的医患问诊记录,以 BIO 标注对话中的疾病、症状、药物等实体,含超 12 万句、81.08 MB、共 4 个文件,申请制审批后发放下载链接。它与本页主讲的 GitHub/Bioinformatics 版 IMCS-21 在数据来源(中山医院 vs 百度拇指医生)、下载方式(申请制 vs 直接公开)、规模与标注聚焦(实体为主)上均有差异,不应混为一谈。
| 对比项 | GitHub/Bioinformatics 版 IMCS-21 | NBSDC 复旦中山版(同名 IMCS21) |
|---|---|---|
| 数据来源 | 百度拇指医生在线问诊 | 复旦大学附属中山医院医患问诊 |
| 发布方式 | GitHub 直接公开 + CBLUE 天池 | NBSDC 注册申请、审批后下载 |
| 规模 | 4,116 对话 / 164,731 句 | 超 12 万句(约 81.08 MB) |
| 标注范围 | 实体/意图/症状/报告五任务 | 以 BIO 实体标注为主 |
| 责任机构 | 复旦牵头多机构 | 复旦大学(魏忠钰登记) |
| 登记时间 | 2022 | 2024-01 |
BibTeX 引用
@article{chen2022benchmark,
author = {Chen, Wei and Li, Zhiwei and Fang, Hongyi and Yao, Qianyuan
and Zhong, Cheng and Hao, Jianye and Zhang, Qi and Huang, Xuanjing
and Peng, Jiajie and Wei, Zhongyu},
title = {A Benchmark for Automatic Medical Consultation System: Frameworks, Tasks and Datasets},
journal = {Bioinformatics},
volume = {39},
number = {1},
pages = {btac817},
year = {2023},
month = {1},
doi = {10.1093/bioinformatics/btac817}
}
引用指南
若在论文/产品中使用 IMCS-21,请引用上述 Bioinformatics 论文;数据与代码按 GitHub 仓库 README 的指引致谢作者。切勿将本百科页作为学术引用来源。
§10 AI 使用声明卡
10.1 AI 模型列表
| 模型 | 用途 |
|---|---|
| deep-model(WorkBuddy) | 初稿生成:INFOBOX 数据汇编、§1-§9 结构化写作、§6 代码示例、8 坑点、DAIMS 表、JSON-LD 构建 |
10.2 AI 参与范围
AI 负责:(1) 从 Bioinformatics 论文、GitHub 官方仓库与 CBLUE 文档整理结构化事实;(2) 生成 §6 的 JSON/JSONL/PyTorch 代码示例;(3) 系统化组织 §6.5 八个坑点与 §7.1 偏倚表;(4) 执行 G1/G2/G3 排版与中英文格式规范;(5) 构建 §C JSON-LD @graph。
10.3 输入来源列表
- 官方 GitHub 仓库 lemuria-wchen/imcs21(数据、基线、README)
- Bioinformatics 论文 btac817 全文(open access PDF)
- arXiv:2204.08997 预印本
- imcs21-cblue CBLUE@天池评测仓库说明
- 复旦/西工大通讯作者邮箱与机构信息
- scilit / ecosyste.ms 元数据(stars、引用)
- 国家基础学科公共科学数据中心(NBSDC)"第一届智能对话诊疗评测数据集"元数据
- selectdataset / gothub 镜像的数据格式与字段说明
- openi.pcl.ac.cn IMCS-NER 任务的疾病统计与标注说明
- 医疗对话相关综述与后续工作引用链
- SNOMED-CT 术语库官方页(归一化锚点说明)
- 百度拇指医生/在线问诊平台背景资料(采集来源说明)
- CBLUE(Chinese Biomedical Language Understanding Evaluation)基准背景
- MedDialog / MedDG / LCMDC 等相关语料的公开资料(对比)
- MIMIC-III 金标准页格式参考(仅作结构模板,内容不混入)
- MIMIC-III 金标准页格式参考(仅用于结构模板,内容不混入)
- WRITER_CONSTITUTION.md 写作规范
- 千方医数集生产配置与检查脚本说明
10.4 人工校验表
| 内容模块 | 审核者 | 审核方式 | 审核状态 |
|---|---|---|---|
| §1-§3 规模与规格(4,116/164,731/10 病/版本时间轴) | 千方病案医学编辑部 | 与论文、GitHub README、CBLUE 说明交叉比对 | ✅ 已验证 |
| §4 数据字典与目录树 | 千方病案医学编辑部 | 与 JSON 字段说明及症状归一化文档比对 | ✅ 已验证 |
| §6 代码与坑点 | 千方病案医学编辑部 | 语法自检 + 数据集特有问题来源核对 | ✅ 已验证 |
| §7 质量评估与 DAIMS 评分 | 千方病案医学编辑部 | 交叉审核 | ✅ 已通过 |
| §2 医学背景与 ICD-11/SNOMED 说明 | 千方病案医学编辑部 | 医学编辑审核 | ✅ 已验证 |
| §8 基线与生态数字 | 千方病案医学编辑部 | 与论文结果表及 GitHub README 比对 | ✅ 已验证 |
| §C JSON-LD @graph | 千方病案医学编辑部 | Schema 字段逐项校验 | ✅ 已通过 |
10.5 AI 生成章节标注
以下章节由 AI 生成初稿并经人工审核:§1.0 30 秒速览、§3.0 版本抉择矩阵、§4.0 目录树、§6.0-§6.4 代码示例、§6.5 八个坑点、§6.9 评估指标代码、§7.7 DAIMS 评估表与评分、§8.7 生态快照、§C JSON-LD。医学背景与临床判断章节(§2、§7)已由医学编辑复核。
10.6 最后人工审核日期
2026-09-05(与 §0.3 审核日期一致)
页面状态:published(全部内容已完成审核并发布)
