CliCR — 临床病例报告阅读理解 AI-Ready Wikipedia | 千方病案医数集

10.5 万完形填空查询 · 1.2 万份病例报告 · 人机 F1 差距 20 点的临床 MRC 基准

来源 安特卫普大学 CLiPS 研究中心(University of Antwerp) url: https://github.com/clips/clicr发布时间: 2026-09-08最后更新: 2026-09-08 阅读 4

信息速览

数据集名称CliCR — 临床病例报告阅读理解 AI-Ready Wikipedia | 千方病案医数集
数据类型104,919 个查询,11,846 份病例报告,JSON(train/dev/test 1.0),邮件申请研究用途
规模约 1.2 万名患者(对应 11,846 份已发表病例报告)
接入方式安特卫普大学 CLiPS 研究中心(University of Antwerp) url: https://github.com/clips/clicr
AI 就绪度

数据集封面

CliCR — 临床病例报告机器阅读理解数据集 AI-Ready Wikipedia

INFOBOX

数据集名称 CliCR
英文全称 Clinical Case Reports for Machine Reading Comprehension(CliCR)
别名/简称 CliCR 1.0、clicr、BMJ Case Reports 阅读理解数据集
疾病分类 全疾病谱(罕见病与常见病不常见表现为主;数据集本身不带 ICD 标签,经 UMLS CUI 可映射至 ICD-11 多章,见 §2.1)
SNOMED CT 不直接携带;经 UMLS CUI 桥接(示例:404684003 Clinical finding / 71388002 Procedure / 15220000 Laboratory test,见 §2.1b)
数据模态 临床文本(英文病例报告全文 + Learning points 摘要)
AI 任务类型 完形填空式机器阅读理解、抽取式问答、临床实体/语义类型标注
样本总数 104,919 个查询 / 11,846 份病例报告(train 91,344 / dev 6,391 / test 7,184)
数据大小 16,544,217 tokens 英文文本;三份 JSON 划分文件(字节大小未公开,以申请链接为准)
数据格式 JSON(train1.0.json / dev1.0.json / test1.0.json)+ 官方 plain / CNN-DailyMail 式转换格式
许可证 研究用途自定义许可(与 BMJ Case Reports 出版方协议;仓库无开源许可证文件)
访问级别 申请审核(邮件申请免费获取,限研究用途)
DUO 标签 官方未标注;实质限制为"研究用途、非商业"(语义 ≈ NPUNCU)
语言 英文
首发日期 2018-03-26(arXiv v1)/ 2018-06(NAACL 2018 正式发表)
最后更新 数据集 v1.0(2018 年,此后未发布新版本);官方仓库 2025-08-28 更新申请邮箱
发布机构 安特卫普大学 CLiPS 研究中心(Computational Linguistics & Psycholinguistics Research Center)
官方主页 https://github.com/clips/clicr
下载地址 邮件申请(simon@textgain.com),流程见 §6.2
DOI 10.18653/v1/N18-1140
引用次数 97+(Semantic Scholar,截至 2026-09)
AI 就绪度评分 ⭐⭐⭐(3/5)— 官方划分、转换与评估脚本齐全;扣分项:邮件申请门槛、JSON 内嵌实体标记需解析、自动实体标注仅 89% 边界精度
页面状态 published

§0 E-E-A-T 信任声明与免责声明

医学审核者:千方病案医学编辑部交叉审核:§2 医学背景(UMLS 语义类型与 ICD-11/SNOMED CT 映射、病例报告文体与临床任务定义、金标准描述)、§7 偏倚分析。

数据工程审核者:千方病案医学编辑部交叉审核:医疗 AI 数据工程师,审核范围:§4 DAIMS 数据字典(JSON 嵌套结构、实体标记解析)、§5 数据划分策略、§6 预处理 Pipeline 和坑点。

审核日期:2026-09-05

审核方式:交叉审核

利益冲突声明:千方病案医数集与安特卫普大学 CLiPS、BMJ 出版方无任何商业利益关联。本页面不销售 CliCR 数据集本身,仅提供 AI 就绪指南与学术信息服务。编辑者未接受上述机构的任何形式资助。

医疗免责声明:本页面提供的医学信息仅供研究和教育目的,不构成医疗建议、诊断或治疗方案。数据集的医学描述基于公开发表的文献,未经逐一临床验证。任何基于该数据集训练的 AI 模型在应用于临床决策前,必须经过独立的临床验证和监管审批。

技术免责声明:本页面的代码示例、预处理建议和基准性能数据基于公开资料整理,不保证在特定环境下的准确性和适用性。使用者应自行验证代码安全性和数据预处理流程的正确性。千方病案医数集不对因使用本页面信息而导致的任何直接或间接损失承担责任。

数据使用合规:使用本页面描述的数据集前,请务必阅读并遵守数据集原始许可协议。CliCR 经与 BMJ Case Reports 出版方的协议以研究用途免费分发,获取方式为邮件申请(simon@textgain.com)。DUO 标签仅供参考,具体使用限制以数据集官方协议为准。


§1 数据集概览

§1.0 📌 30 秒速览

这是什么? CliCR(读作 “clicker”,Clinical Case Reports)是 2018 年由安特卫普大学 CLiPS 研究中心发布的大规模临床文本机器阅读理解数据集。作者从全球最大的病例报告在线库 BMJ Case Reports(2005–2016 年)中收集 11,846 份英文病例报告,自动从每份报告的 “Learning points”(学习要点)摘要中挖空一个医学实体,构造出 104,919 个完形填空查询:机器需要通读平均约 1,500 tokens 的完整病例报告,才能从数百个候选实体中找出被挖掉的答案(如 “relapse”、“chest CT”)。

为什么重要? 在 CliCR 之前,医学领域的机器理解数据集普遍太小(MedHop 仅 2.5K 查询)或不是真实临床文本。CliCR 用约 10.5 万查询把这个领域推到了可用深度神经网络训练的规模,并且是首个系统分析"回答临床问题需要哪些认知技能"(13 类技能标注)的数据集。它揭示了一个至今仍有意义的发现:最佳人类与最佳机器之间存在约 20 个 F1 点的差距,其中需要医学背景知识的"桥接推理"是最难自动化的部分。

我能用它做什么? 训练和评测临床机器阅读理解模型(BERT 之前的 GA/SA 阅读器,以及今天的预训练语言模型);研究 UMLS 知识库如何帮助机器理解临床文本;评估模型对"文中根本没有答案"的不可答查询的识别能力(人类评估中约 16% 实例不可答);以及作为临床 NLP 教学/领域自适应预训练的高质量英文病例报告语料。

§1.1 技术摘要

CliCR 的构建是一条全自动流水线:爬取 BMJ Case Reports → jusText 剥离 HTML 样板 → cTakes 完成分句与分词 → Clamp 按照自然科学临床标注规范(i2b2-2010)抽取医学实体并链接 UMLS CUI → 将每份报告的 Learning points 段中一个医学实体替换为 @placeholder 占位符生成查询,报告正文(去除 Learning points)作为支撑 passage,实体边界以启发式规则精修并抽样 250 个人工核查(89% 边界正确)。数据以 JSON 分为 train 91,344 / dev 6,391 / test 7,184 三个划分(文档级不重叠),并做了两处协议设计:训练时只用答案逐字出现于 passage 的实例(59%),而 dev/test 全量评估(含答案不在文中的实例);评估时用 UMLS Metathesaurus 将每个答案扩展出平均约 4 个同义变体(56,093 → 288,211 个不同答案),以 EM、F1、BLEU-2/4 与 embedding-average 取答案集最大值计分。论文基线显示:简单嵌入相似度基线 sim-entity(F1 29.4)胜过多个神经阅读器,最好的 Gated-Attention Reader(GA-NoEnt,F1 33.9)仍落后人类专家(F1 53.7,dev 集 100 实例)约 20 点。

§1.2 战略价值

维度一:临床 MRC 的"技能探针"价值。 CliCR 是第一个对每道查询标注认知技能的数据集(100 个 dev 实例,13 类技能,平均每查询 2.85 个技能)。作者按 Sugawara et al. 2017 框架的分析表明:桥接推理(bridging,需要语法/词汇之外领域知识的推理)与对象追踪(object tracking,在长叙事中维持"症状-检查-治疗"清单)是最高频技能,且 CliCR 对元知识(meta knowledge)与对象追踪的需求高于所有对照数据集;而机器在"识别文中没有答案"(none,人类评估中占约 16%)与省略识别(ellipsis)上最弱。这意味着 CliCR 至今仍是评估"模型是否真的在阅读"而非"模式匹配"的首选探针——在 LLM 时代尤其有价值,因为 BMJ 公开文本大概率已进入预训练语料(见 §5.3、坑点 4)。

维度二:知识增强 NLP 的标准试验台。 数据集自带的 UMLS CUI 与语义类型(problem/treatment/test)标注,加上官方的答案扩展脚本(expand_answers.py),使 CliCR 成为研究"医学知识库如何注入阅读器"的天然实验场。论文的实体表示实验是这一方向的开创性结论:把实体匿名化(Anonym)能大幅提升 SA reader(11.4 → 27.2 F1),而最强配置反而是不做任何实体标记(GA-NoEnt 33.9 F1);简单嵌入相似度基线(29.4 F1)即可击败部分神经阅读器。任何"知识增强临床 QA"的新方法(UMLS 注入、RAG、医学实体链接)都应在这个数据集上与这些经典结论对照。

§1.3 同类数据集横向对比

数据集 规模(查询数) 文本来源 查询/答案生成方式 与 CliCR 的差异
CliCR 104,919 BMJ 病例报告(2005–2016,11,846 份) Learning points 挖空医学实体(自动) 唯一以"病例报告叙事体"为 passage 的大规模临床 MRC;带 UMLS CUI + 语义类型
Quasar-S 约 37K 软件实体标签社区问答 定义句挖空(自动) 非医学域;passage 由众包搜索片段构成
SciQ 约 14K 科学教科书/百科 众包考试题 + 四选一 有固定候选(4 个);CliCR 候选来自长文全部实体(数百个)
MedHop 约 2.5K MedlinePlus/DrugBank 知识库多跳合成 规模小两个数量级,只能做评估不能训练
SQuAD 107,785 Wikipedia 众包提问 + 答案为文内 span 开放域;答案保证逐字出现(CliCR 仅 59%)
emrQA 455,837 MIMIC-III 临床笔记(2,425 份) i2b2 标注逻辑形式自动展开 passage 是真实 EHR 噪声文本;CliCR 是编辑润色过的叙事体
MedQA 12,723 美中韩执业医师考试 人工考题四/五选一 考试推理型;无 passage 定位答案
PubMedQA 212,300 PubMed 摘要 标题→问题自动 + yes/no/maybe 生物医学文献域;判断式而非抽取式
MedMCQA 193,100 印度医学入学考试 人工考题四选一 考试知识型;无长文阅读负担

(CliCR/Quasar-S/SciQ/MedHop 数字来自 CliCR 论文 Table 1;SQuAD/PubMedQA/emrQA/MedQA/MedMCQA 数字来自 RoMedQA 论文对比表,截至 2026-09。)

§1.4 版本时间轴

时间 版本/事件 说明
2018-03-26 arXiv 预印本 v1(1803.09720)+ GitHub 仓库创建 论文与 dataset-code/neural-readers 代码同日公开
2018-06 NAACL-HLT 2018 正式发表(N18-1140,pp. 1551–1563) 数据集 v1.0 定版:train1.0.json / dev1.0.json / test1.0.json
2019-04-24 仓库新增 CNN/DailyMail 式导出与 pycocoevalcap 评估 方便与 CNN 式阅读器直接对接(数据本体未变)
2025-08-28 README 更新数据申请联系邮箱 数据集本体保持 v1.0,无内容修订

§1.5 典型应用场景

  1. 临床阅读理解模型评测:以官方划分与评估协议(含 UMLS 答案扩展)复现/对比 GA、SA、BERT 系与 LLM 阅读器,量化"领域知识推理"缺口(§8.3)。
  2. 不可答问题识别研究:约 16% 人类判定不可答的实例 + 答案不在文中的 41% 实例,是研究拒答/校准行为的天然素材(坑点 2、3)。
  3. 知识增强阅读器研发:用 UMLS CUI/语义类型做实体类型化、候选约束或 RAG 注入,与论文"Anonym 化增益、NoEnt 反而最强"的经典结论对照(§6.7)。
  4. 临床语言模型领域自适应预训练:1,650 万 tokens 的真实病例报告叙事文本(实体已标注),可用于医学 LM 的继续预训练与实体感知表示学习。
  5. 教学与技能分析:13 类认知技能标注适合作为临床 NLP 课程"机器为什么读不懂病历"的案例教材(§2.3、§7.1)。

§2 医学背景

§2.1 疾病/概念分类与 ICD-11 映射

CliCR 本身不带 ICD 编码;其标签体系是 UMLS CUI + 三类语义类型(sem_type:problem / treatment / test,遵循 i2b2-2010 标注规范)。下表给出语义类型与 ICD-11 章节/示例条目的桥接关系,供下游把查询分布映射到疾病分类学:

sem_type 标签 占比 ICD-11 章节归属(示例) ICD-11 示例条目(编码 + 中文名)
problem(问题/疾病/症状) 67% 第一章 感染性疾病;第五章 内分泌;第十章 循环;第十六章 皮肤等 5A11(2 型糖尿病)、1B10(呼吸系统结核)、CA23(哮喘)、BA41(急性心肌梗死)
treatment(治疗/操作) 22% 各系统操作章节(ICD-11 操作类目以数字起始编码);药物通常以扩展码表达 治疗类实体多为手术/操作名称或药物(药物归类依赖 UMLS 扩展码而非 ICD-11 独立章节)
test(检查/检验) 11% ICD-11 对具体检验项目覆盖有限,属第 21 章"影响健康状态的功能"边缘情形 检验/影像项目惯例映射至 LOINC 概念体系(UMLS 已收录其与 CUI 的对应)

注:病例报告主题横跨全疾病谱,且刻意偏向罕见病与常见病的不常见表现(作者选择 BMJ Case Reports 正因如此)。上表 ICD-11 条目仅为桥接示例,数据集内不存在 ICD 标签字段——这一点与 MIMIC-III 等携带 ICD-9 编码的数据库本质不同(见 §4.1)。

§2.1b SNOMED CT 映射

UMLS Metathesaurus 是 CUI ↔ SNOMED CT 的标准桥梁;CliCR 每个答案实体的 CUI 可经 UMLS 交叉表映射到 SNOMED CT 概念。语义类型层的典型映射如下:

数据集标签体系(sem_type) UMLS 语义类型 SNOMED CT 示例码 SNOMED 术语
problem Injury or Poisoning / Disease or Syndrome / Sign or Symptom 404684003 Clinical finding(临床发现)
problem Disease or Syndrome 64572001 Disease(疾病)
treatment Therapeutic or Preventive Procedure 71388002 Procedure(操作/处置)
treatment Pharmacologic Substance 373873005 Pharmaceutical / biologic product(药物/生物制品)
test Laboratory Procedure / Diagnostic Procedure 15220000 Laboratory test(实验室检验)

(映射示例基于 UMLS 语义网络与 SNOMED CT 国际版通用概念;具体每个 CUI 的映射结果以 UMLS Metathesaurus 当前版本为准,见 https://www.nlm.nih.gov/research/umls/ 。)

§2.2 病例报告文体与流行病学背景

病例报告(case report)是医学文献中最古老、最低层级(evidence hierarchy)的文体:详尽描述单个患者的症状演变、检查、诊断、治疗与结局,聚焦罕见病、常见病的不常见表现与新型治疗。BMJ Case Reports 是全球最大的此类在线库(2005 年上线),要求每篇报告附 “Learning points” 段——由作者提炼的本案例关键教学要点,通常是对正文若干句子的转述而非逐字摘录。CliCR 的查询正是从这段转述中挖空生成,因此答案不会以完全相同的形式出现在正文里(仅 59% 逐字出现),这是该数据集区别于 SQuAD 式"答案必在文中"范式的根本特征。流行病学上,数据集没有确定的疾病谱分布——它是按"教学价值"而非疾病构成抽样的语料,语义类型层面 problem 占 67%、treatment 22%、test 11%,可以理解为"每道查询都是一次以疾病/症状为主、治疗与检查为辅的临床事实问答"。

§2.3 临床任务定义

  • 任务形式:给定完整病例报告(passage)与一条挖空查询(query,含 @placeholder),从 passage 中的全部医学实体(候选集合,数百量级)里选出被挖空的答案。这是完形填空式抽取式阅读理解(cloze-style extractive MRC)。
  • 对应临床信息需求:查询天然对应三类临床事实——“患者得了什么/出现了什么问题”(problem,67%)、“接受了什么治疗”(treatment,22%)、“做了什么检查、结果如何”(test,11%)。这与临床信息抽取经典框架(问题-治疗-检验三元组,i2b2-2010)一致,可视为对"临床决策支持中,医生快速检索病历中的具体事实"这一场景的模拟。
  • 认知技能构成:官方 100 实例技能标注显示,回答平均需要 2.85 项技能,核心是桥接推理(用 query 里没有直接出现的医学背景知识连接 query 与 passage)与对象追踪(在约 1,466 tokens 的叙事中维持实体状态);不可答识别(约 16% 实例文中无答案)与省略识别对机器最难。
§2.3b 十三类认知技能与机器难度画像

官方技能标注沿用 Sugawara et al. 2017 框架,13 类技能按"在 CliCR 中的需求频率"与"机器相对人类的薄弱程度"归纳如下(频率与难度为论文定性结论,论文以图表而非数值表呈现分布):

技能 含义 在 CliCR 中的地位 机器相对薄弱程度
Bridging(桥接推理) 用语法/词汇之外的医学背景知识连接 query 与 passage 最常见技能之一 高(专家在此类上比新手约高 10 F1)
Object tracking(对象追踪) 在长叙事中维持症状/检查/治疗实体的状态 最常见技能之一,需求高于全部对照数据集
Meta knowledge(元知识) 需要知道"这类文本通常会怎么说"的领域惯例 需求高于全部对照数据集 中高
None(不可答识别) 判断文中没有答案(人类评估约 16%) 关键甄别技能 极高(机器倾向硬猜)
Ellipsis(省略识别) 识别被省略/隐含的信息 关键甄别技能 极高
Spatio-temporal relations(时空关系) 时间线与空间方位推理
Elaboration(常识展开) 常识性推进推理
Causal relation(因果关系) 病因-检查-治疗因果链
Coreference resolution(共指消解) 患者主体与实体的共指
Logical reasoning(逻辑推理) 条件与否定逻辑
Analogy(类比) 比喻/类比理解
Mathematical reasoning(数学推理) 剂量/数值计算
Punctuation(标点理解) 括号/斜体等标点语义
Schematic clause relation(从句关系) 从属/并列句法关系

§2.4 患者人群表

维度 描述
数据来源 BMJ Case Reports 在线库(全球临床医生投稿,同行评审后发表)
时间范围 2005–2016 年发表的报告(passage 长度因此呈双峰:2008 年改版前文章明显更短)
样本构成 11,846 份报告,每份对应一位患者的完整临床叙事
年龄/性别 数据集未提供结构化人口学字段;这些信息散布于自由文本中
疾病构成 全疾病谱,刻意偏向罕见病与不常见表现(教学价值导向抽样,非流行病学抽样)
就医类型 覆盖门诊、住院与随访全过程叙事;单中心/多中心取决于原报告作者机构(未在数据集层标注)
语言/地域 英文;作者机构遍布全球(BMJ 为国际期刊),但行文经过编辑规范化

§2.5 临床价值

对临床 AI 而言,CliCR 的价值不在"直接可部署",而在三件事:其一,它把"读病历"这一临床信息需求形式化为可量化任务,1,466 tokens 的长文档 + 数百候选实体 + 需要背景知识的桥接推理,共同模拟了医生在病历中定位事实的真实认知负担;其二,它的 UMLS 标注为"知识增强临床 NLP"提供了可控变量——可以直接检验把 UMLS 同义词、语义类型注入模型后各技能的表现变化;其三,它的人类研究(专家 53.7 vs 新手 45.1 vs 最佳机器 33.9 F1)给出了一个持久参照:医学背景知识贡献约 8 个 F1 点,"读懂文本之外的知识"正是临床 NLP 最稀缺的能力

§2.6 金标准参考表

项目 内容
划分 官方三划分,文档级不重叠:train 91,344 / dev 6,391 / test 7,184 查询
标注方式 全自动生成(挖空 + UMLS 扩展),无逐例人工标注;质量靠抽样审计与清洗规则保证
标注者 实体边界由 Clamp 自动标注(89% 抽样正确率);技能分类由论文作者人工标注 100 个 dev 实例;人类基线由 1 名"语言学+医学"专家与 1 名"仅语言学"新手各完成 100 题(每题约 15 分钟)
性质 完形填空式(cloze);答案集经 UMLS 扩展(每答案平均约 4 个变体);59% 答案逐字出现于 passage
评估口径 训练仅用逐字实例;dev/test 全量评估(含 A∩E=∅ 实例);对答案集取 max 计分

§3 数据集规格

§3.0 版本抉择矩阵

你的需求 推荐版本/格式 大小 理由
复现论文基线(GA/SA reader) 官方 JSON v1.0 + json_to_plain.py 转 plain 格式 原始 JSON + 转换产物 官方 Theano 阅读器按 plain 格式输入(gareader/sareader 目录结构)
训练 BERT 系/LLM 阅读器 官方 JSON v1.0,自行解析 BEG__...__END 标记 原始 JSON 即可 需要控制大小写/实体标记策略(Ent/Anonym/NoEnt 三种设置自选,见坑点 3)
与 CNN/DailyMail 式阅读器对接 json_to_plain.py 的 cnnlike 导出 转换产物 2019-04 官方新增,候选实体改写为 @entityN 编号形式
教学演示/快速上手 dev1.0.json(6,391 查询) 三份中最小 最小可用子集,格式与 train/test 完全一致

§3.1 模态详情

单一模态:英文自由文本。每条样本由三部分构成——(1)passage:病例报告正文(去除 Learning points 后的全部文本,保留章节结构与换行),平均 1,466 tokens,双峰分布(2008 年前发表的文章偏短);(2)query:从 Learning points 挖空一个医学实体得到的单句查询,占位符为 @placeholder;(3)answers:一个答案集合,首元素为构建时挖掉的实体(origin=“dataset”,附 CUI 与 sem_type),其余为 UMLS Metathesaurus 扩展的同义词/缩写/首字母缩略词变体(origin=“UMLS”)。title+context 中所有实体以 BEG__词1 词2__END 内联标记,构成候选答案空间(官方不单独分发候选文件,由 passage 实时派生)。

§3.2 按子集样本数表

子集 文件 查询数 报告数(约) 用途
训练集 train1.0.json 91,344 10,300+ 官方训练(协议上仅用答案逐字出现的实例)
验证集 dev1.0.json 6,391 720+ 调参、人类评估抽样(100 实例技能标注)
测试集 test1.0.json 7,184 810+ 最终评估(全量含非逐字实例)
合计 三份 JSON 104,919 11,846 报告数合计

(报告数三列合计 11,846;单划分报告数论文未逐项列出,按查询/报告比 ≈ 8.9 估算,估算值仅供参考,精确值以 describe_data.py 实测为准。)

§3.3 数据格式表

格式 提供方 结构 适用场景
JSON v1.0(官方) 邮件申请分发 嵌套:data → document{title, context, qas} → answers[] 一切下游用法的源头格式
plain(gareader/sareader) 官方 json_to_plain.py 转换 逐实例文本文件(id/p/q/a/c 五字段) 复现 Theano 神经阅读器
cnnlike 官方 json_to_plain.py 转换 CNN/DailyMail 式:候选实体 @entityN 编号 对接 CNN 式阅读器与指针网络

§3.4 存储大小

官方口径:passage 总计 16,544,217 tokens(112,673 个词类型),查询 104,919 条。数据文件的字节大小未在论文与仓库中公布(数据经邮件链接分发);按平均 token≈6 字符与 JSON 转义开销粗估,三份 JSON 合计在百 MB 量级——该估算仅供参考,请以实际下载为准。转换后的 plain 格式与 cnnlike 格式大小与 JSON 同量级。

§3.5 标注方式

  • 实体与答案标注:自动(弱监督)。Clamp 按 i2b2-2010 规范标注 problem/treatment/test 实体并赋 UMLS CUI;查询由挖空自动生成;答案扩展由 UMLS Metathesaurus 自动完成(expand_answers.py)。
  • 清洗规则(自动):实体起始的功能词(限定词/代词)移出实体;实体末尾括号内容排除;Learning points 与 passage 大面积重复的实例整体删除(数据集缩减约 5%)。
  • 人工部分:250 实体边界抽查(89% 正确);100 个 dev 实例的 13 类认知技能标注;人类基线评估(专家/新手各 100 题)。除此之外不存在逐例人工验证的"金标签"——这决定了它的标注质量上限(见 §7.2)。

§3.6 标注者资质与一致性

实体标注"标注者"为 NLP 工具链(Clamp,医学 NLP 系统),一致性概念不适用,质量以抽样精度衡量(89%)。技能标注与人类评估由论文作者团队执行:专家评估者具备语言学与医学双重背景,新手仅语言学背景——专家比新手高 7 个 F1 点(53.7 vs 45.1),其中在需要桥接推理的实例上专家优势扩大到约 10 分。数据集未公布标注者间一致性系数(如 Cohen’s κ),这是评估复现时需要注意的空白。

§3.7 采集周期

文本采集与处理完成于 2017–2018 年(论文 2018-03 提交);语料内容覆盖 2005–2016 年发表的 BMJ 病例报告。数据集为静态快照,v1.0 之后无新增采集。

§3.8 地域覆盖

单库来源(BMJ Case Reports),但投稿作者机构遍布全球,患者来自报告作者的执业地——因此数据集在"文体与术语规范"上是单一化的(英文、BMJ 编辑规范),在"患者地域与医疗系统"上是全球混杂的。注意这与"多中心 EHR 数据集"(如 MIMIC 的单中心、eICU 的多中心)语义不同。

§3.9 工具链规格(NLP"设备")

文本类数据集没有采集设备,但预处理工具链等效于"设备规格"。官方记录如下:jusText(HTML 样板剥离)、cTakes(Apache 临床 NLP 系统,负责分句与分词)、Clamp(医学实体标注,i2b2-2010 规范)、UMLS Metathesaurus(CUI 链接与答案扩展)、word2vec(>90 亿 tokens 语料上的词向量,CliCR 训练语料 + PubMed/PMC)。论文与仓库均未公布各工具的具体版本号,复现需自行固定版本并记录。

§3.10 深度溯源链

层级 内容 可追溯性
原始文献 BMJ Case Reports 单篇 HTML(2005–2016) data[].source 字段保留报告来源标识
清洗产物 jusText 去样板后的正文 不可追溯(中间产物未分发)
标注产物 cTakes 分句 + Clamp 实体(CUI/sem_type) 部分可追溯(answers[] 保留 origin 字段区分 dataset/UMLS)
查询产物 Learning points 挖空(build_queries.py) 可复现(官方脚本)
发布产物 train/dev/test 1.0.json + 官方代码 GitHub 仓库提交历史(2018-03 至 2025-08)

§4 数据结构

§4.0 目录树

数据经邮件申请获得后(解压即三份 JSON;官方代码另从 GitHub clone):

clicr/
├── train1.0.json            # 训练集:91,344 查询
├── dev1.0.json              # 验证集:6,391 查询
├── test1.0.json             # 测试集:7,184 查询
└── clicr/                   # git clone https://github.com/clips/clicr
    ├── README.md
    ├── dataset-code/        # 数据处理与评估
    │   ├── describe_data.py       # 统计 + 定义 JSON schema 常量
    │   ├── build_queries.py       # 从 Learning points 生成查询
    │   ├── refine_json_dataset.py # 删除与 passage 部分重复的实例
    │   ├── expand_answers.py      # UMLS 答案集扩展
    │   ├── evaluate.py            # EM / F1 / BLEU-2 / BLEU-4 / E-avg
    │   ├── embedding_eval.py      # 嵌入类指标
    │   ├── json_to_plain.py       # → gareader / sareader / cnnlike
    │   ├── baselines.py           # rand/maxfreq/sim-entity 等基线
    │   └── util.py
    └── neural-readers/      # Theano 实现的 SA 与 GA 阅读器

§4.1 DAIMS 字段字典

字段(层级路径) 类型 说明 示例值 AI 用途 观测误差/注意 信息性缺失编码 取值范围
version string 数据集版本号 “1.0” 版本控制 单版本,无变更历史 无缺失 常量
data list 文档数组,每元素一份报告 遍历语料 顺序无语义 无缺失 11,846 个元素
data[].source string 报告来源标识(BMJ 文章标识) 报告 ID 文档级分组/防泄漏 不同划分间必然不同 无缺失 非空字符串
data[].document.title string 报告标题,含实体标记 “BEG__Celiac disease__END…” 候选实体来源之一 标记语法需解析 无缺失 自由文本
data[].document.context string 报告正文(去除 Learning points),含实体标记,保留换行 “…avoided __END …” passage(模型输入主体) 平均 1,466 tokens;双峰长度 无缺失 自由文本
data[].document.qas list 该文档全部查询 查询级训练 一文档多查询(均值 ≈ 8.9) 空列表=该文档无查询 ≥0 个元素
qas[].id string 查询唯一 ID 见实例 主键/结果对齐 全局唯一 无缺失 非空字符串
qas[].query string 挖空查询,占位符 @placeholder “If steroids are used … avoid @placeholder.” 模型输入 由 Learning points 转述生成,与 passage 非逐字 无缺失 单句
qas[].answers list 答案集合(首元素为 dataset 原生,余为 UMLS 变体) 评估取 max 集合内不是互斥选项而是同义变体 无缺失 ≥1 个元素
answers[].text string 答案文本 “relapse” EM/F1 计算 平均 2.3–2.5 tokens 无缺失 1–n 个词
answers[].origin string 答案来源 “dataset” 或 “UMLS” 区分原生/扩展答案 原生答案有且仅有一个 无缺失 枚举二值
answers[].cui string UMLS 概念唯一标识 “C0035020” 知识库链接/类型化 UMLS 版本未固定 仅原生答案带 Cxxxxxxx
answers[].sem_type string 语义类型(i2b2-2010) “problem” 分层评估/任务路由 三类不平衡 67/22/11 仅原生答案带 problem/treatment/test
@placeholder(标记) 语法元素 query 中的挖空占位符 @placeholder 定位空槽 非独立字段 query 内固定
BEG__…__END(标记) 语法元素 title/context 内联实体标记 BEG__chest pain__END 派生候选实体集合 嵌套边界错误率约 11% 成对出现

§4.1b 示例记录(基于官方 schema 与论文 Figure 1 重构)

以下 JSON 片段按官方 schema 重构论文图 1 的经典实例(抗结核治疗与激素撤药),展示各字段的实际形态:

{
  "version": "1.0",
  "data": [
    {
      "source": "<BMJ 报告标识>",
      "document": {
        "title": "BEG__Tuberculous__END meningitis ...",
        "context": "... taping of BEG__corticosteroids__END was initiated
                    with no clinical BEG__relapse__END ...",
        "qas": [
          {
            "id": "<查询唯一 ID>",
            "query": "If steroids are used , great caution should be
                      exercised on their gradual tapering to avoid
                      @placeholder .",
            "answers": [
              {"text": "relapse",
               "origin": "dataset",
               "cui": "C0035020",
               "sem_type": "problem"},
              {"text": "recurrence",  "origin": "UMLS"},
              {"text": "relapses",    "origin": "UMLS"}
            ]
          }
        ]
      }
    }
  ]
}

三个阅读要点:(1)query 由 Learning points 转述而来,与 context 中的原句并非逐字对应——这正是 41% 实例答案不逐字出现的根源;(2)answers 首元素(origin=“dataset”)是唯一原生答案并携带 C0035020 与语义类型,其余为 UMLS 同义变体,评估对整个集合取 max;(3)context/title 中的 BEG__…__END 标记定义了候选空间,解析方式见 §6.3。

§4.2 标签分布

  • 语义类型(原生答案):problem 67% / treatment 22% / test 11%——三类不均衡,分层评估或按类加权时应注意。
  • 答案形态:不同答案 56,093 个(对应约 10.5 万查询,答案重复率低);UMLS 扩展后 288,211 个(平均每答案约 4 个变体);答案平均长度 2.3–2.5 tokens(多为 1–4 词的医学实体)。
  • 可答性:59% 的答案逐字出现于 passage;41% 不逐字出现(评估协议里靠 UMLS 扩展与 max 取分消化);人类评估中约 16% 实例被判定为"文中无答案"(none)。

§4.3 关键统计

统计项 数值 出处
查询总数 / 报告总数 104,919 / 11,846 论文 Table 2
划分(train/dev/test) 91,344 / 6,391 / 7,184 论文 Table 2
passage 平均长度 1,466 tokens(双峰分布) 论文 §4
passage 总 tokens / 词类型 16,544,217 / 112,673 论文 §4
passage 内实体实例数 591,960 论文 §4
不同答案数(原生 → UMLS 扩展) 56,093 → 288,211 论文 §4
每查询平均技能数 2.85(13 类技能体系) 论文附录 B
每文档平均查询数 ≈ 8.9(104,919 ÷ 11,846,计算值) 本页按官方数字计算

§4.4 数据层级

语料(version 1.0)
└── 文档 data[](11,846 份病例报告,source 标识)
    └── 查询 qas[](104,919 条,id 主键)
        └── 答案变体 answers[](原生 1 条 + UMLS 扩展若干条)
            └── 实体属性:text / origin / cui / sem_type

与影像数据集"患者→检查→序列→切片"的层级不同,CliCR 的层级是文档→查询→答案变体:文档是防泄漏的天然分组单元(同一文档的查询绝不能跨划分,官方划分已保证,见 §5.3);查询是训练/评估原子单元;答案变体是评估集合而非多重标签。

§4.5 缺失值与信息性缺失编码

情形 表现 处理建议
答案不逐字出现于 passage 41% 实例;answers[] 仍非空(原生答案在,但 passage 中无该字符串) 训练时按官方协议过滤(remove_notfound=True);评估时用答案集 max(坑点 2)
文中确无答案(不可答) 人类评估约 16% 实例(none 技能);数据集内没有显式"unanswerable"字段 自行用"A∩E=∅ 且 UMLS 扩展后仍 ∅"规则近似识别(坑点 3)
cui / sem_type 仅 origin=“dataset” 的原生答案携带;UMLS 扩展答案不带 用原生答案字段做类型分析
时间戳 无任何时间字段 以 source 对应报告的发表年份为唯一时间锚(需自查 BMJ 元数据)
人口学字段 无结构化 age/sex 字段 文本内自行抽取;勿假设可全量恢复

§5 划分与使用建议

§5.1 官方划分

官方三划分以文档为单位切分(同一报告的全部查询在同一划分内),比例约为 train 87% / dev 6% / test 7%(91,344 / 6,391 / 7,184)。文件名 train1.0.json / dev1.0.json / test1.0.json 中的 “1.0” 即版本号。官方还有一条训练协议:训练集仅保留答案逐字出现于 passage 的实例(官方阅读器代码默认 remove_notfound=True),而 dev/test 全量评估——复现论文数字必须遵守这条不对称协议。

§5.2 社区惯例划分

无广泛采用的社区替代划分(该数据集引用规模适中,多数后续工作直接沿用官方划分与代码)。常见变体仅为实体表示设置的选择:Ent(标记实体)/ Anonym(标记并匿名化)/ NoEnt(不标记)三种输入配置,本质是"同一划分、不同输入预处理",对比时必须注明设置。

§5.3 泄漏风险(重点)

  1. 转述近重复泄漏(数据集内建):查询来自 Learning points 对正文的转述,官方只删除了"大面积完全重复"的实例(约 5%);剩余实例中 query 与 passage 的词汇重叠仍远高于真实问答,模型可借词汇桥捷径得分。缓解:评估时同时报告 sim-entity 基线,凡低于 sim-entity(F1 29.4)的神经模型应视为未学到阅读能力。
  2. 划分间 UMLS 概念重叠:同一疾病概念可出现在不同文档的不同查询中;这是知识重叠而非实例泄漏,属可接受范围,但做"概念级 held-out"分析时需按 CUI 分组重切。
  3. LLM 预训练污染(时代性风险):BMJ Case Reports 2005–2016 全部公开可访问,大概率已被收入主流 LLM 预训练语料;现代 LLM 的"高分"可能是记忆而非阅读(坑点 4)。
  4. 技能标注单点性:100 实例技能标注由论文作者完成且未公布一致性系数,用技能分层结论做模型选型时应视为单评估者证据。

§5.4 交叉验证建议

若需自定义重切(如概念级 held-out):以 data[].source(文档)为分组键做 GroupShuffleSplit,禁止让同一文档的查询跨集合;按发表年份分层(覆盖 2008 前后的两种长度模式),并按 sem_type 分层保持 67/22/11 比例;报告至少 3 个随机种子的均值±标准差(数据集文档级分组后 test 侧仅约 800 份报告,方差不可忽略)。

# 自定义重切的最小可行实现:文档级分组 + 概念级防重叠可选
import json
from collections import defaultdict
from sklearn.model_selection import GroupShuffleSplit

blob = json.load(open("./clicr/train1.0.json", encoding="utf-8"))
cuis = defaultdict(set)                     # 文档 → 出现过的 CUI 集合
for doc in blob["data"]:
    for qa in doc["document"]["qas"]:
        for a in qa["answers"]:
            if a["origin"] == "dataset":
                cuis[doc["source"]].add(a.get("cui", ""))

docs   = [d["source"] for d in blob["data"]]
groups = ["|".join(sorted(cuis[s])) for s in docs]   # 概念级分组(更严格)
gss = GroupShuffleSplit(n_splits=1, test_size=0.1, random_state=42)
tr, te = next(gss.split(docs, groups=groups))
overlap = set(groups[tr]) & set(groups[te])
assert not overlap          # CUI 级零泄漏:同一概念不出现在两侧文档中

§5.5 外部验证建议

训练于 CliCR 的阅读器,建议在以下外部语料上验证泛化(数字与出处见 §1.3):emrQA(真实 EHR 笔记,i2b2 标注体系与 CliCR 同源但文本噪声大得多)、PubMedQA(文献判断式)、MedQA(考试推理)、SQuAD(开放域对照,检验"临床迁移是否反而掉点")。CliCR 与 emrQA 共享 i2b2-2010 语义类型体系,是最直接的外部对照对;两者之间的性能落差量化了"编辑润色叙事体 → 噪声 EHR 文体"的迁移鸿沟(§7.3)。


§6 AI 就绪指南 ⭐

§6.1 快速上手(Python 解析版)

<details>
<summary>JSON 解析 + 宽表展平完整脚本(约 45 行,点击展开)</summary>

# ========================================
# CliCR 快速上手 — JSON 解析 + 宽表展平
# 环境要求:python3.8+,无特殊依赖(演示用 pandas)
#
# 目录结构预期(data_root 需指向邮件申请获得的解压目录):
#   data_root/
#   ├── train1.0.json      # 91,344 查询
#   ├── dev1.0.json        #  6,391 查询
#   └── test1.0.json       #  7,184 查询
#
# data_root 拼接关系:代码内 open(os.path.join(data_root, split_fn))
# 最小可用子集:dev1.0.json(6,391 查询,分钟级跑通全流程)
# ========================================
import json, os, re
import pandas as pd

DATA_ROOT = "./clicr"          # ← 改为你的解压目录

MARK_RE = re.compile(r"BEG__(.+?)__END")   # 实体内联标记

def strip_marks(text: str) -> str:
    """去掉 BEG__/__END 标记,保留纯文本(官方同款逻辑)"""
    return text.replace("BEG__", "").replace("__END", "")

def load_split(fn: str) -> pd.DataFrame:
    """把官方嵌套 JSON 展平为查询级宽表:一行 = 一条查询"""
    with open(os.path.join(DATA_ROOT, fn), encoding="utf-8") as f:
        blob = json.load(f)
    rows = []
    for doc in blob["data"]:                       # 11,846 份报告
        passage = (doc["document"]["title"] + " " +
                   doc["document"]["context"])
        for qa in doc["document"]["qas"]:          # 平均 ≈8.9 查询/文档
            native = [a for a in qa["answers"] if a["origin"] == "dataset"]
            rows.append({
                "id":       qa["id"],
                "source":   doc["source"],
                "passage":  strip_marks(passage).replace("\n", " ").lower(),
                "query":    strip_marks(qa["query"]).replace("\n", " ").lower(),
                "answer":   native[0]["text"].lower(),
                "cui":      native[0].get("cui", ""),
                "sem_type": native[0].get("sem_type", ""),
                "n_answers": len(qa["answers"]),   # 含 UMLS 扩展变体数
            })
    return pd.DataFrame(rows)

dev = load_split("dev1.0.json")
print(dev.shape)                                   # (6391, 8)
print(dev["sem_type"].value_counts(normalize=True))  # ≈ problem .67 / treatment .22 / test .11
print(dev["passage"].str.split().str.len().mean())   # ≈ 1466 tokens

</details>

§6.1b 复现官方基线(官方命令)

官方仓库提供两条复现路径(Theano 遗留环境,仅建议"读协议"而非重跑;参数取自官方 README):

# 路径一:Stanford Attentive Reader(SA)
THEANO_FLAGS=mode=FAST_RUN,device=gpu,floatX=float32 \
python main.py \
    --train_file PATH/TO/train1.0.json \
    --dev_file   PATH/TO/dev1.0.json \
    --embedding_file PATH/TO/embeddings \
    --log_file best.log --att_output False
# 默认行为:hidden size 与 dropout 在 dev 上调优;
# 且默认剔除"答案不逐字出现于 passage"的训练实例(config.py 可改)

# 路径二:Gated-Attention Reader(GA,带实体标记)
THEANO_FLAGS=mode=FAST_RUN,device=gpu,floatX=float32 \
python3 run.py --dataset clicr_plain --mode 1 \
    --nhidden 67 --dropout 0.4 --use_feat 1 \
    --data_path PATH/TO/dataset_plain/ent/gareader/ \
    --experiments_path experiments/
# mode 1 = 训练,mode 2 = 测试;数据需先用 json_to_plain.py 转换

# 官方评估(与论文数字可比的口径)
python3 dataset-code/evaluate.py \
    -test_file PATH/TO/dev1.0.json \
    -prediction_file predictions \
    -embeddings_file PATH/TO/embeddings \
    -downcase -extended
# -downcase:小写归一化;-extended:追加 BLEU-2/4 与 embedding-average

复现提示:SA/GA 输出的是 plain 格式(§4.0 的 id/p/q/a/c 五字段文件),由 json_to_plain.py -reader gareader/sareader/cnnlike -stp ent/no-ent 从官方 JSON 生成;训练/验证/测试三目录名在脚本内部映射为 training/validation/test(§4.0)。现代 GPU/PyTorch 用户建议直接用 §6.3/§6.4 管线自训,仅复用这里的协议(过滤规则、归一化、指标口径)。

§6.2 数据获取

步骤 操作 说明
1 发送邮件至 simon@textgain.com 说明研究用途与单位;README 2025-08-28 更新了该联系人
2 等待作者回复下载链接 因与 BMJ Case Reports 出版方的协议,研究用途免费分发
3 下载并解压三份 JSON train1.0.json / dev1.0.json / test1.0.json
4 clone 官方代码库 git clone https://github.com/clips/clicr(154 star,2026-09)
5 (可选)安装 UMLS 运行 expand_answers.py 重新扩展答案集需要 UMLS Metathesaurus 许可(NLM 免费)
# 获取流程命令行版
git clone https://github.com/clips/clicr.git        # 官方代码(公开)
# 数据本体不含在仓库中;向 simon@textgain.com 邮件申请后:
unzip clicr_data.zip -d ./clicr                     # 得到三份 1.0.json
python3 clicr/dataset-code/describe_data.py \
    -train_file ./clicr/train1.0.json \
    -dev_file   ./clicr/dev1.0.json \
    -test_file  ./clicr/test1.0.json               # 校验数字:91,344/6,391/7,184

§6.3 预处理全流程

从官方 JSON 到可训练张量,共四步:解析实体标记 → 派生候选集合 → 归一化 → 答案集扩展。以下脚本完整可运行(含官方协议的不对称过滤):

<details>
<summary>完整预处理脚本(约 60 行,点击展开)</summary>

# clicr_preprocess.py — 官方 JSON → 模型就绪实例
# 输入:DATA_ROOT 下三份 1.0.json;输出:query 级实例列表
# 协议要点:train 只留答案逐字出现实例;dev/test 全量保留
import json, os, re
from typing import Dict, List

MARK_RE = re.compile(r"BEG__(.+?)__END")

def to_entities(text: str) -> List[str]:
    """把 BEG__w1 w2__END 标记转为候选实体列表(小写、下划线连接)"""
    cands, inside, buf = [], False, []
    for w in text.split():
        if w.startswith("BEG__") and w.endswith("__END"):
            cands.append(w[5:-5]); continue
        if w.startswith("BEG__"):
            inside, buf = True, [w[5:]]; continue
        if w.endswith("__END") and inside:
            buf.append(w[:-5]); cands.append("_".join(buf)); inside = False
            continue
        if inside:
            buf.append(w)
        elif w.startswith("@entity"):
            cands.append(w)
    return [c.replace("_", " ").lower() for c in cands]

def parse_file(path: str, is_train: bool) -> List[Dict]:
    with open(path, encoding="utf-8") as f:
        blob = json.load(f)
    out = []
    for doc in blob["data"]:
        marked = doc["document"]["title"] + " " + doc["document"]["context"]
        cands = list(dict.fromkeys(to_entities(marked)))      # 去重保序
        plain  = marked.replace("BEG__", "").replace("__END", "") \
                       .replace("\n", " ").lower()
        for qa in doc["document"]["qas"]:
            native = next(a for a in qa["answers"] if a["origin"] == "dataset")
            answer_set = sorted({a["text"].lower() for a in qa["answers"]})
            found = any(a in plain for a in answer_set)
            if is_train and not found:            # 官方训练协议
                continue
            out.append({
                "id": qa["id"], "source": doc["source"],
                "passage": plain,
                "query": qa["query"].replace("\n", " ").lower()
                                    .replace("@placeholder", "[BLANK]"),
                "answer_set": answer_set,         # UMLS 扩展后取 max 计分
                "sem_type": native.get("sem_type", ""),
                "verbatim": found,                # 59% True / 41% False
            })
    return out

train = parse_file(os.path.join(DATA_ROOT, "train1.0.json"), is_train=True)
dev   = parse_file(os.path.join(DATA_ROOT, "dev1.0.json"),   is_train=False)
test  = parse_file(os.path.join(DATA_ROOT, "test1.0.json"),  is_train=False)
print(len(train), len(dev), len(test))  # train < 91,344(过滤后);dev/test = 6,391/7,184

</details>

清洗与标准化要点:(1)实体标记解析是第一坑——官方标记 BEG__…__END 嵌套边界有约 11% 错误,解析函数必须容错(坑点 8);(2)归一化:官方阅读器与评估默认全小写(evaluate.py 提供 -downcase),保持与论文可比就必须小写化(坑点 5);(3)答案扩展:评估前务必用 answers[] 全集(或自行跑 expand_answers.py 接 UMLS),对单答案直接算 EM 会把约 41% 实例判零(坑点 2)。文本增强在 MRC 场景受限(见 §6.6),本流程不做同义替换类增强。

自行扩展答案集(当拿到原始实体表、需要重新链接 UMLS 时):

# umls_expand.py — 用 UMLS API 重做答案扩展(替代/核对官方 expand_answers.py)
# 前置:向 NLM 申请 UMLS License(免费),获取 api-key 后填入环境变量
import os, requests

def umls_variants(surface: str, api_key: str, tgt: str) -> set:
    """给定答案原文,检索 UMLS 同源概念的其他表述(缩写/全称/同义词)"""
    r = requests.get(
        "https://uts-ws.nlm.nih.gov/rest/search/current",
        params={"string": surface, "ticket": tgt},
        timeout=10,
    ).json()
    variants = set()
    for hit in r.get("result", {}).get("results", [])[:5]:
        cui = hit["ui"]
        v = requests.get(
            f"https://uts-ws.nlm.nih.gov/rest/content/current/CUI/{cui}/atoms",
            params={"ticket": tgt, "sabs": "SNOMEDCT_US,MSH"},
            timeout=10,
        ).json()
        for atom in v.get("result", []):
            variants.add(atom["name"].lower())
    return {surface.lower()} | variants

# 用法:answer_set = sorted(umls_variants("relapse", KEY, tgt))
# 注意:UMLS 版本必须写进实验记录(current 会漂移,见 §7.6)

§6.4 PyTorch DataLoader 完整代码

<details>
<summary>Dataset + collate + DataLoader 实例化(约 70 行,点击展开)</summary>

# clicr_torch.py — CliCR 抽取式 MRC 的 PyTorch Dataset
# 依赖:torch>=1.10;分词器以空格 + 简单标点切分为例(换成 BERT tokenizer 亦可)
import json, os, random
import torch
from torch.utils.data import Dataset, DataLoader
from clicr_preprocess import parse_file        # §6.3 的解析函数

MAX_LEN = 640        # 约 1,466 tokens 的 passage 需截断/滑窗;此处演示单窗截断

class CliCRDataset(Dataset):
    """一行 = 一条查询;标签为候选集合中的答案索引(指针式训练)"""
    def __init__(self, path: str, is_train: bool):
        self.rows = parse_file(path, is_train=is_train)
        self.is_train = is_train

    def __len__(self):
        return len(self.rows)

    def __getitem__(self, i):
        r = self.rows[i]
        p_toks = r["passage"].split()[:MAX_LEN]
        q_toks = r["query"].split()
        # 候选 = passage 中的 unigram/bigram 简化实现(生产建议用实体标记派生)
        cands = list(dict.fromkeys(
            p_toks + [f"{p_toks[j]} {p_toks[j+1]}" for j in range(len(p_toks)-1)]))
        cand2idx = {c: k for k, c in enumerate(cands)}
        gold = next((cand2idx[c] for c in r["answer_set"] if c in cand2idx), -1)
        if gold == -1 and self.is_train:                      # 防御:训练期不应发生
            return self.__getitem__(random.randrange(len(self.rows)))
        return {
            "passage": p_toks, "query": q_toks,
            "cands": cands, "gold": gold, "id": r["id"],
            "verbatim": r["verbatim"], "sem_type": r["sem_type"],
        }

def collate(batch):
    # 词表共享的简化实现:生产环境替换为 tokenizer + attention mask
    return {
        "id":      [b["id"] for b in batch],
        "gold":    torch.tensor([b["gold"] for b in batch]),
        "verbatim": torch.tensor([b["verbatim"] for b in batch]),
        "raw":     batch,   # passage/query/cands 交给模型侧 embedder 处理
    }

train_ds = CliCRDataset(os.path.join(DATA_ROOT, "train1.0.json"), is_train=True)
dev_ds   = CliCRDataset(os.path.join(DATA_ROOT, "dev1.0.json"),  is_train=False)
train_loader = DataLoader(train_ds, batch_size=8, shuffle=True,
                          collate_fn=collate, num_workers=2, drop_last=True)
dev_loader   = DataLoader(dev_ds, batch_size=16, shuffle=False,
                          collate_fn=collate, num_workers=2)
batch = next(iter(dev_loader))
print(len(train_ds), len(dev_ds), batch["gold"].shape)   # 抽查形状

</details>

生产建议:把"简化 unigram/bigram 候选"替换为 §6.3 的实体标记派生候选(与论文口径一致);MAX_LEN=640 的单窗截断会切掉长报告尾部信息,更好的做法是滑窗 + 跨窗聚合(坑点 7);verbatim 标志要一直带到评估侧,用于分开报告逐字/非逐字子集分数。

§6.5 八个坑点

⚠️ 坑点 1:查询是 Learning points 挖空自动生成的,不是真实临床提问(分类:偏倚陷阱)

问题:全部 104,919 条查询由同一模板化流程生成(Learning points 转述 + 挖一个医学实体),查询句式、信息密度与医生真实提问分布差异巨大;模型在该分布上的高分不代表能回答真实临床问题。
症状:在 CliCR 上微调的阅读器迁移到 emrQA/MedQA 等真实问句数据集时性能大幅下滑;模型学会了"找与查询词汇最相似的实体"这种学习点风格捷径。
解决

  1. 简单方法:把 CliCR 定位为"技能探针"而非产品 QA 训练集;论文结论只对同分布查询负责。
  2. 进阶方法:与其他问句风格语料(emrQA、MedQA)混合训练,并在 CliCR 的 dev 上按"查询与 passage 的词汇重叠率"分层报告成绩,暴露捷径依赖。
  3. SOTA 方法:训练查询改写器(把挖空查询改写为自然疑问句)做风格不变性训练;或用 LLM 在 passage 上合成多风格问句与 CliCR 原生查询联合训练。
    参考CliCR 论文 §3(查询构建与清洗);技能分类框架 Sugawara et al., 2017。

⚠️ 坑点 2:41% 的答案不逐字出现在 passage 里——直接算 EM/F1 会系统性低评(分类:评估误用)

问题:查询是 Learning points 的转述,仅 59% 答案逐字存在;官方协议下训练集过滤掉非逐字实例、dev/test 却全量评估,且计分对 UMLS 扩展答案集取 max。忽略这条不对称协议,复现数字必然对不上。
症状:自训模型 dev F1 远低于训练 F1;非逐字子集 EM 接近 0;论文数字怎么调参都差 10 分以上。
解决

  1. 简单方法:严格照搬官方评估——evaluate.py-downcase -extended,评估对象是 answers[] 全集取 max,而非单答案。
  2. 进阶方法:自己实现时按官方公式(答案集 max + 小写/标点归一化)重写 F1,并分开报告 verbatim(59%)与非 verbatim(41%)两个子集,附 BLEU-2/4 与 embedding-average。
  3. SOTA 方法:生成式阅读器直接产出规范化短语,用 UMLS CUI 级匹配(答案同义变体映射到同一 CUI 再判对);对约 16% 不可答实例单独报告拒答指标(AUPRC)。
    参考:官方 evaluate.pyexpand_answers.py;论文公式 4。

⚠️ 坑点 3:候选答案数百个且同指多现——完形填空的答案歧义被低估(分类:标签理解)

问题:候选集合 = passage 全部医学实体(长报告数百个),同一概念在文中多次出现且表述不一;query 单独看常有多个合理填充。评估只认一个答案集合,"对了一半"的同指实体不得分。
症状:不看 passage 的嵌入相似度基线 sim-entity(F1 29.4)居然胜过多个神经阅读器;GA-NoEnt 预测偏长(平均 3.7 tokens vs 真值 2.3–2.5,如真值 “chest CT” 被预测为 “interval CT scans of the chest”)。
解决

  1. 简单方法:报告 F1 而非只报 EM(部分字符重叠可得部分分);对预测做长度正则(论文发现 GA 累加注意力不归一化导致偏长)。
  2. 进阶方法:用 Ent/Anonym 输入设置收缩输出空间——论文证明 Anonym 化让 SA reader 从 11.4 涨到 27.2 F1;或按 CUI 合并同指候选后再判分。
  3. SOTA 方法:UMLS 类型化候选 + 候选排序器(把"选实体"重构为"选 CUI"),从根本上消解表形歧义。
    参考论文实体表示实验(Ent/Anonym/NoEnt 对照)

⚠️ 坑点 4:测试文本大概率已进入 LLM 预训练语料——污染让基准失真(分类:数据泄漏)

问题:BMJ Case Reports 2005–2016 全部公网可访问,主流 LLM 预训练语料(Common Crawl 系)大概率覆盖;模型可能靠"背答案"而非阅读 passage 答题。
症状:零样本 LLM 分数远超 2018 年微调基线且对"替换 passage"不敏感;删除 passage 后模型仍能答对相当比例的知名病例查询。
解决

  1. 简单方法:报告 zero-shot 与"删 passage"对照(no-context baseline)两栏,两者差值才是真实阅读贡献。
  2. 进阶方法:CUI 保持不变的实体扰动(把答案实体替换为同语义类型的罕见实体后重测),记忆型模型分数会塌、阅读型模型应稳定。
  3. SOTA 方法:在许可允许下用 2016 年后新发表报告构建 held-out 补充集;或采用成员推断/规范 n-gram 污染检测(如 13-gram 重合法)先量化污染规模再解读分数。
    参考官方仓库与数据获取协议;语料污染检测方法学见 Dodge et al., 2021(C4 文档审计)。

⚠️ 坑点 5:大小写/标点归一化直接改写你的分数——官方默认全小写(分类:预处理陷阱)

问题:官方阅读器与评估脚本默认把 passage/query/answer 全部 lower()(json_to_plain.py 内联 .lower()evaluate.py 提供 -downcase 参数)。你的模型若保留大小写或用 cased tokenizer,与论文数字不可比。
症状:BERT-cased 复现分数比论文基线还低;同样的预测,带大写字母的答案被判 EM=0;换 uncased 模型分数跳变数点。
解决

  1. 简单方法:统一走官方归一化(小写 + 去换行 + 空格化标点),评估前对预测与答案做同一变换。
  2. 进阶方法:归一化函数与评估卡片(metric card)一起入库存档;同时报告 normalized 与 strict(保留大小写/标点)两套分数,量化归一化的分差。
  3. SOTA 方法:评估管线内置 SQuAD 式 normalize_answer(小写、去标点、去冠词)+ UMLS CUI 归一化双轨,论文式分数与知识级分数并存。
    参考:官方 json_to_plain.pyevaluate.py 参数列表。

⚠️ 坑点 6:单一来源的"杂志文风"——与真实 EHR 文本差一个时代(分类:偏倚陷阱)

问题:全部文本来自 BMJ Case Reports(2005–2016):经过编辑润色的叙事体、刻意收录罕见病与不常见表现、passage 长度因 2008 年改版呈双峰。它与缩写连篇、电报体、充满复制粘贴的 EHR 文本是两个世界。
症状:CliCR 上微调的阅读器在 MIMIC 出院小结、i2b2 笔记上大幅掉点;按 passage 长度分桶评估发现 2008 前后桶的性能结构不同;"罕见病偏置"让常见病查询的表现被低估。
解决

  1. 简单方法:按发表年份与 passage 长度分层报告;不要把 CliCR 分数当作"EHR 理解能力"。
  2. 进阶方法:与 emrQA(真实 EHR + 同源 i2b2 语义类型)做跨域对照实验,量化文体迁移鸿沟;训练混入 EHR 文本。
  3. SOTA 方法:文体对抗/风格不变表示学习;或先在 CliCR 学技能、再在 EHR 语料做领域自适应续训(两阶段)。
    参考论文 Fig. 2(a)(长度双峰)与 §3 数据构建;emrQA(Pampari et al., 2018, ACL)。

⚠️ 坑点 7:没有支撑句/证据位置标注——长文档阅读负担无处安放(分类:工程陷阱)

问题:数据集只给 passage + query + answers 三元组,没有证据句索引(论文图中的斜体句子仅为示意);平均 1,466 tokens 的 passage 远超 BERT-512 窗口,且无法做证据溯源。
症状:BERT 系模型被迫截断,长报告尾部事实全丢、分数低估;模型给出答案但无法解释"依据哪一句";滑窗实现不同导致各家分数不可比。
解决

  1. 简单方法:滑窗切分 + 跨窗最大概率聚合(记录窗口重叠策略)。
  2. 进阶方法:用答案包含句做远程监督训练句级选择器,先检索后阅读(两阶段),顺手获得可解释的证据定位。
  3. SOTA 方法:Longformer/长上下文 LLM 直接建模全文;把"证据句定位"作为辅助任务联合训练,用 dev 上答案逐字实例(59%)自动构造定位标签。
    参考论文 §4(passage 统计)json_to_plain.py(确认无位置字段)

⚠️ 坑点 8:自动实体标注的边界噪声与缩写残留——89% 精度的天花板(分类:标签理解)

问题:实体由 Clamp 自动标注(i2b2-2010 规范),250 实例抽查仅 89% 边界正确(典型错误:并列实体合并、动词误入、修饰语遗漏);医学缩写靠 UMLS 扩展只部分覆盖(平均每答案 4 个变体);数据内联的 BEG__…__END 标记本身嵌套边界也可能错。
症状:挖空位置落在"半个实体"上;UMLS 变体覆盖不到报告私用缩写导致该实例被判错;自写解析器把 BEG__ 残片带进词表,训练集词表被噪声污染。
解决

  1. 简单方法:直接复用官方 to_entities()/remove_entity_marks()(json_to_plain.py),不要重写解析;跑 describe_data.py 校验解析后统计。
  2. 进阶方法:按论文的两条启发式再清洗(实体起始限定词/代词移出、末尾括号内容剔除);用 QuickUMLS/MedCAT 对答案重链接,补充 UMLS 扩展未覆盖的局部缩写。
  3. SOTA 方法:抽 1–2K 实例人工重标做"标注噪声灵敏度"实验(报告 89% 假设下的性能上下界);或训练序列标注纠错器对边界再修正。
    参考论文 §3 质量检查(250 实例 89%)expand_answers.py

§6.6 数据增强(安全 ✅ / 危险 ❌)

操作 判定 说明
随机截断 passage 至 ≤512 tokens(训练期) ✅ 安全 等效于滑窗采样;验证评估必须用完整/滑窗策略
实体标记设置切换(Ent/Anonym/NoEnt) ✅ 安全 论文原生实验维度;对比实验注明设置即可
查询词序打乱/同义词替换 ❌ 危险 挖空查询是转述句,替换会破坏 CUI 对应关系并引入标注噪声
用 UMLS 随机替换答案实体 ❌ 危险 破坏"Learning points ⇄ 正文"的转述关系,制造事实性错误监督信号
passage 域内回译 ⚠️ 谨慎 医学实体极易被回译改写(drug→medication 尚可,检查名常失真);必须校验实体无损后才可用
抽取训练文档做 LLM 问题改写扩充 ✅ 安全(建议) 保持答案实体与 CUI 不变的问句改写,可缓解坑点 1 的风格偏置

实体保持型查询改写的最小实现(坑点 1 的缓解方案):

# paraphrase.py — 保持答案实体不变的查询风格改写骨架
# 原则:@placeholder 与医学实体字符串逐字保留;只改写"疑问框架"
TEMPLATES = [
    "What did the patient develop according to the case?",
    "Which condition is described as the key risk here?",
    "What should clinicians be cautious of in this scenario?",
]

def paraphrase(query: str, answer: str, rng) -> str:
    """把挖空查询改写为自然疑问句;answer 字符串原样保留为监督目标"""
    assert "@placeholder" in query
    body = query.replace("@placeholder", answer)      # 先还原完整句
    _ = body                                          # 供 LLM/规则改写器使用
    return rng.choice(TEMPLATES), answer              # 目标答案不变

# 两个硬约束(违反即破坏标签):
# 1) 改写后的正确答案必须仍唯一由 passage 支撑——不得引入新医学事实;
# 2) CUI 与 sem_type 沿用原生答案,禁止重算。

§6.7 模型推荐表

模型 适用设置 预期表现 备注
Gated-Attention Reader(官方 Theano) NoEnt 设置 F1 33.9(论文最优机器) 仅作历史基线复现;Theano 环境难维护
sim-entity 嵌入基线 词向量相似度 F1 29.4 必报的体检基线:神经模型低于它即未学到阅读能力
PubMedBERT / Bio+Clinical BERT + 指针头 NoEnt/Ent 未见可靠公开数字——自行报告 需处理 >512 截断(坑点 7)
Longformer / BigBird 级长文模型 全文输入 未见可靠公开数字——自行报告 直接消化 1,466 tokens,最贴合任务形态
生成式 LLM(零样本/微调) 归一化短语输出 大概率超基线,但受污染干扰(坑点 4) 必须配 no-context 对照与实体扰动实验

§6.8 硬件需求表

阶段 最低配置 推荐配置 说明
JSON 解析 + 统计 4 GB 内存 CPU 8 GB 内存 三份 JSON 单机内存即可容纳
嵌入基线(sim-entity) CPU 任意 单卡 GPU(训练词向量时) 论文用 >90 亿 tokens 语料训练 word2vec,自训需 GPU;加载现成向量可 CPU
BERT 系微调 单卡 16 GB(滑窗 batch 累积) 单卡 24–40 GB 滑窗 × 长序列显存放大明显
长文模型(Longformer 级) 单卡 24 GB 2× A100/H100 全文 1,466 tokens + 数百候选打分
官方 Theano 阅读器复现 单卡 8 GB 遗留环境(Python 2/Theano) 复现成本高,建议读代码取协议而非重跑

§6.9 评估指标代码

<details>
<summary>官方口径 EM/F1 实现(约 35 行,点击展开)</summary>

# clicr_eval.py — 与官方口径对齐的 EM/F1(答案集 max + 官方归一化)
import re, string

def normalize(s: str) -> str:
    """官方式归一化:小写 → 去标点 → 去冠词 → 压空白(对应 -downcase)"""
    s = s.lower()
    s = "".join(ch for ch in s if ch not in set(string.punctuation))
    s = re.sub(r"\b(a|an|the)\b", " ", s)
    return " ".join(s.split())

def f1_em(pred: str, answer_set: list) -> tuple:
    """对 UMLS 扩展答案集取 max(论文公式 4 的核心)"""
    best = (0.0, 0.0)
    p_toks = normalize(pred).split()
    for gold in answer_set:
        g_toks = normalize(gold).split()
        common = set(p_toks) & set(g_toks)
        if not p_toks or not g_toks:
            em = float(p_toks == g_toks)
            f1 = em
        else:
            em = float(p_toks == g_toks)
            prec = len(common) / len(p_toks)
            rec  = len(common) / len(g_toks)
            f1 = 2 * prec * rec / (prec + rec) if common else 0.0
        if (f1, em) > best:
            best = (f1, em)
    return best  # (f1, em)

</details>

# 分层评估模板:论文口径之外的必报维度(坑点 2/3/5 的落地)
def stratified_report(rows, predictions):
    """rows 来自 §6.3 parse_file;predictions: {id: 预测文本}"""
    from collections import defaultdict
    buckets = defaultdict(list)
    for r in rows:
        f1, em = f1_em(predictions[r["id"]], r["answer_set"])
        buckets["overall"].append((f1, em))
        buckets[f"verbatim={r['verbatim']}"].append((f1, em))
        buckets[f"sem_type={r['sem_type']}"].append((f1, em))
    out = {}
    for name, scores in buckets.items():
        n = len(scores)
        out[name] = (sum(s[0] for s in scores) / n,
                     sum(s[1] for s in scores) / n, n)
    return out
# 解读要点:verbatim=False 子集 F1 显著低属正常(任务更难);
# 但若 verbatim=True 子集也低于 sim-entity(F1 29.4),说明模型没学到阅读能力。

用法与核对:rows = parse_file("dev1.0.json", is_train=False);建议同时跑官方 evaluate.py 交叉核对(§6.1b 命令)。

§6.10 MLOps 笔记

  • 数据版本:数据集本体无版本演进(v1.0 终版),把"申请获得的文件 + SHA256"登记进 DVC/数据目录;官方仓库代码用 git commit 固定(注意 2025-08-28 邮箱更新不涉及数据)。
  • 评估可复现:把 §6.9 的归一化函数、答案扩展来源(自带 answers[] 还是自行接 UMLS、UMLS 版本号)写入评估卡片;官方 evaluate.py 作为第二裁判交叉核对。
  • 污染治理:任何 LLM 实验(§6.7)自动附带 no-context 对照与实体扰动两组数字,缺一不入报告。
  • 分层监控:训练/评估指标固定按 sem_type(67/22/11)与 verbatim(59/41)两个维度分层,回归一票否决以最差分层为准。
  • 许可合规:数据与派生模型仅限研究用途;对外发布预测演示时确认 BMJ 协议边界(§7.4)。

§7 质量评估与局限性

§7.1 已知偏倚表

偏倚类型 描述 严重程度 缓解措施
来源单一偏倚 全部文本来自 BMJ Case Reports 单一期刊(2005–2016) 跨域评估(emrQA/EHR 文本);结论限定"叙事体病例"
罕见病选择偏倚 BMJ 收录导向罕见病/不常见表现,非疾病谱自然分布 按 CUI/sem_type 分层评估;勿外推常见病结论
查询风格偏倚 挖空模板生成,非真实临床提问(坑点 1) 混合问句风格训练;查询改写增强
标注噪声 自动实体边界 89% 抽查正确率(坑点 8) 官方清洗规则 + 重链接;报告噪声灵敏度
语义类型不平衡 problem 67% / treatment 22% / test 11% 分层报告与类加权
长度双峰 2008 年改版前后文章长度两个模式 按年份/长度分层;抽样时两模式兼顾
语言/地域 英文、全球作者、BMJ 编辑规范 明确适用边界(英文叙事体)
时代污染 公开文本进入 LLM 预训练语料(坑点 4) 高(对 LLM 实验) no-context 对照 + 实体扰动

§7.2 标注质量

  • 实体边界:250 实例人工抽查,89% 完全正确;错误类型为并列实体合并、动词误入实体、前置修饰语遗漏(论文 §3)。以此推算,约 1/9 的候选/答案边界存在瑕疵——这是全自动构建换规模的固有代价。
  • 答案集合:原生答案(origin=“dataset”)唯一且带 CUI/sem_type;UMLS 扩展答案(origin=“UMLS”)系统生成,无逐例人工验证。
  • 技能标注:100 个 dev 实例,13 类技能,平均 2.85 技能/查询;单评估者、无一致性系数公布。
  • 人类基线质量:专家(语言学+医学)F1 53.7 / EM 35,新手(仅语言学)F1 45.1 / EM 31,各基于 dev 的 100 实例、每题约 15 分钟——样本量小,只能视为参照而非统计推断。
§7.2b 实体边界错误类型分布(官方 250 实例审计)

论文公布了抽样审计的错误类型学,可直接用作下游清洗的检查单:

错误类型 表现 下游影响 检查方法
并列实体合并 “nausea and vomiting” 被标为一个实体 挖空答案过长、候选含伪实体 含 " and " 的候选人工复核
动词误入实体 治疗类实体吞并相邻动词 答案含非名词成分,F1 虚低 候选尾部为动词词形的过滤规则
前置修饰语遗漏 “recurrent” 未并入 “pneumonia” 同一概念分裂为两个候选 CUI 重链接合并同指候选

(正确边界占 89%;错误类型占比论文未给出数值分布。)

§7.3 泛化性表

目标场景 失效风险 证据
真实 EHR 文本问答(出院小结/病程记录) 高:文体(润色叙事 vs 电报体噪声)、缩写密度、复制粘贴重复完全不同 数据来源与文体对比(§7.1);emrQA 使用同源语义类型但不同文本层
执业考试型 QA(MedQA 类) 高:任务形态不同(选择题推理 vs 文内定位),技能集不重叠 论文技能分析:CliCR 以 bridging/object tracking 为主
生物医学文献 QA(PubMedQA 类) 中高:域相近但判断式输出与长文抽取不同 任务形式对比(§1.3)
不可答/拒答场景 高:约 16% 不可答实例,机器最难技能之一(none/ellipsis) 论文人类评估与技能分析
非英文临床文本 极高:单语言数据集 语料构成(§3.8)
现代 LLM 零样本评测 中:污染干扰解读 时代性风险(坑点 4)

§7.4 伦理

数据来源是已发表、经出版方知情同意流程的病例报告,而非原始病历;分发 JSON 中不含姓名、日期等标识符。风险点有三:(1)罕见病案例的理论再识别风险虽低但非零——协议明令禁止再识别;(2)病例报告作者的知情同意覆盖"出版",未必覆盖大规模二次机器学习用途,这属于学界仍在讨论的灰色地带(同团队对临床 NLP 伦理挑战有专门综述:Šuster, Tulkens & Daelemans, 2017, ACL Ethics Workshop);(3)使用限制为研究用途(与 BMJ 出版方协议),任何产品化使用需另行授权。

§7.5 公平性

数据集不含结构化人口学字段(年龄/性别/种族),无法做标准公平性审计;文本中的人口学信息未做标注与均衡性设计。已知风险:罕见病与不常见表现的选择导向,使模型在常见病、典型表现上的能力被系统性低估;全球投稿来源使患者人群地域混杂但行文规范单一(英语、期刊文体)。任何下游部署前,应在目标人群数据上重新校准。

§7.6 数据漂移

  • 文体漂移:2008 年 BMJ 改版导致 passage 长度双峰——按年份分桶评估是必做项。
  • 术语漂移:UMLS Metathesaurus 版本演进会改变 CUI 覆盖与同义词扩展结果;固定 UMLS 版本并记录。
  • 基准漂移:LLM 时代该数据集的"含答案记忆"比例只增不减,跨年复测需重新估计污染(坑点 4)。

§7.7 DAIMS 24 项数据就绪度评估

# 检查项 状态 说明
1 数据为宽格式(每行一个样本/事件) JSON 嵌套但查询级展平直接可得(§6.1)
2 有唯一标识符列 qas[].id 全局唯一;data[].source 为文档键
3 无 Unicode 或特殊字符 ⚠️ 内联 BEG__/__END 标记与换行符需解析清洗
4 无重复行 构建时已删除与 passage 大面积重复的实例(约 5%)
5 缺失值已识别并编码 结构固定、字段齐全(§4.5)
6 标签列被明确标识 answers[].text/origin/cui/sem_type 语义明确
7 已对罕见类别(<3%)进行分组 ⚠️ sem_type 三类外,病种长尾(5.6 万不同答案)未分组
8 偏倚评估已完成 §7.1 八类偏倚 + 论文技能分析
9 有完整的数据字典 describe_data.py 定义 + 官方脚本 + 本页 §4.1
10 对"信息性缺失"有明确编码解释 ⚠️ 41% 非逐字/16% 不可答无显式字段,需按 A∩E=∅ 规则推断(坑点 2/3)
11 数据采集设备和设置已记录 ⚠️ NLP 工具链(jusText/cTakes/Clamp)已记录但无版本号
12 已移除完全共线性变量 纯文本模态不适用
13 对编码的映射标准已说明 i2b2-2010 规范 + UMLS CUI 链接(§2.1b 桥接)
14 对时间戳的处理已明确说明 ⚠️ 无时间字段;仅能借 source 追溯发表年份(2005–2016)
15 训练/验证/测试划分建议已给出 官方文档级三划分(91,344/6,391/7,184)
16 数据泄漏风险已被讨论 §5.3 四类泄漏 + 坑点 4
17 标签分布已被分析 sem_type 67/22/11、答案长度、可答性(§4.2)
18 选择性测量偏倚已被讨论 罕见病选择导向与 89% 边界精度已量化(§7.1/7.2)
19 外部验证建议已给出 §5.5 emrQA/PubMedQA/MedQA 路径(§7.8 如实报告空白)
20 数据更新和版本信息已记录 version 字段 + v1.0 终版声明 + 仓库提交历史
21 最小必要预处理脚本已提供 官方 dataset-code 全套(解析/扩展/评估/基线)
22 合规使用要求已明确 研究用途、邮件申请、BMJ 出版方协议
23 多模态对齐方法已说明 纯文本单模态,无对齐需求
24 去标识化方法已被记录 ⚠️ 来源为已发表报告而非病历,无独立去标识化文档;再识别禁令依协议执行

DAIMS 评分:18.0 / 24

评分解读良好——结构清晰、划分/脚本/协议齐全是它超越同年代数据集的硬实力;扣分项集中在"自动构建的先天属性"(标记解析噪声、无时间/人口学字段、无显式不可答编码、无独立去标识化文档),以及外部验证的长期空白。

对你意味着什么:CliCR 的 18 个 ✅ 几乎全部来自"小而整齐":三份 JSON、一套官方脚本、一条不对称训练协议,半小时即可跑通——这是它作为基准的工程红利。六个 ⚠️ 则决定了你必须自带四件套:①实体标记解析用官方函数(别重写,坑点 8);②评估必须答案集 max + 归一化 + verbatim 分层(坑点 2/5);③LLM 实验强制 no-context 对照(坑点 4);④按 sem_type/年份分层监控(坑点 6)。与 MIMIC-III 的 18.5/24 对照很有启示:两者总分相当,但 MIMIC 扣分在"历史遗留的脏",CliCR 扣分在"自动构建的浅"——前者靠清洗补救,后者只能靠明确边界与外部验证补救。

§7.8 外部验证矩阵

外部数据集/场景 来源机构 评估任务 性能指标 相对内部测试集变化 关键发现
人类专家(dev 集 100 实例) CLiPS(论文内置研究) 与机器同题对照 F1 53.7 vs 最佳机器 33.9 ≈ +20 F1(dev 子集 vs test,口径注明) 人机差距约 20 F1 点,大于 SQuAD 的 12.2 与 NewsQA 的 19.8;桥接推理是差距主因
跨数据集技能需求对照 CLiPS(论文 Fig. 4) 13 类技能需求频率 定性频率图 CliCR 的 meta knowledge 与 object tracking 需求高于全部对照数据集;none/ellipsis 对机器最难
独立机构 × 独立语料的外部验证 截至 2026-09 未检索到已发表的独立外部验证结果(公共榜单亦无收录)——使用本数据集的研究者应优先补齐 emrQA/EHR 文本上的外部验证(§5.5)

§8 基准性能与生态

§8.1 排行榜

数字出自 CliCR 论文 Table 4(测试集,Ent/Anonym/NoEnt 为实体表示设置);完整引用:Šuster & Daelemans, 2018, NAACL-HLT. DOI 10.18653/v1/N18-1140。数值不可直接比较的原因:人类行基于 dev 集 100 实例(非测试集);Ent/Anonym/NoEnt 改变任务难度与输出空间;无公共榜单收录后续成绩(截至 2026-09)。

排名 模型(设置) EM / F1 (%) 年份 关键技术 完整引用 代码
🏆 1 GA reader(NoEnt) 14.9 / 33.9 2018 门控注意力循环阅读器,不标记实体 Šuster & Daelemans, 2018, NAACL-HLT. DOI 10.18653/v1/N18-1140 官方仓库 neural-readers
2 GA reader(Anonym) 24.5 / 33.2 2018 同上 + 实体匿名化收缩输出空间 Šuster & Daelemans, 2018, NAACL-HLT. DOI 10.18653/v1/N18-1140 官方仓库
3 GA reader(Ent) 22.2 / 30.2 2018 同上 + 实体标记 Šuster & Daelemans, 2018, NAACL-HLT. DOI 10.18653/v1/N18-1140 官方仓库
4 sim-entity(基线) 20.8 / 29.4 2018 750 维 CBOW 词向量相似度,无深度模型 Šuster & Daelemans, 2018, NAACL-HLT. DOI 10.18653/v1/N18-1140 官方仓库 baselines.py
5 SA reader(Anonym) 19.6 / 27.2 2018 Stanford Attentive Reader + 匿名化 Šuster & Daelemans, 2018, NAACL-HLT. DOI 10.18653/v1/N18-1140 官方仓库
6 SA reader(Ent) 6.1 / 11.4 2018 Stanford Attentive Reader + 实体标记 Šuster & Daelemans, 2018, NAACL-HLT. DOI 10.18653/v1/N18-1140 官方仓库
7 maxfreq-entity(基线) 8.5 / 12.6 2018 预测 passage 中最高频实体 Šuster & Daelemans, 2018, NAACL-HLT. DOI 10.18653/v1/N18-1140 官方仓库
8 lang-model(基线) 2.1 / 3.5 2018 4-gram 语言模型打分 Šuster & Daelemans, 2018, NAACL-HLT. DOI 10.18653/v1/N18-1140 官方仓库
9 rand-entity(基线) 1.4 / 5.1 2018 随机实体 Šuster & Daelemans, 2018, NAACL-HLT. DOI 10.18653/v1/N18-1140 官方仓库
参照 human-expert(dev-100) 35 / 53.7 2018 语言学+医学双背景评估者 Šuster & Daelemans, 2018, NAACL-HLT. DOI 10.18653/v1/N18-1140
参照 human-novice(dev-100) 31 / 45.1 2018 仅语言学背景评估者 Šuster & Daelemans, 2018, NAACL-HLT. DOI 10.18653/v1/N18-1140

§8.2 SOTA 总结与选型建议

截至 2026-09,公开渠道(论文本身与第三方基准聚合站)未收录比 GA-NoEnt 33.9 F1 更高的、方法学可比的后续成绩——这与该数据集"邮件申请 + 非标准任务形态"导致的低复测率有关,而非问题已解决。选型建议:(1)复现历史基线选官方 Theano 代码读协议、选 §6.3/6.4 管线重训现代模型;(2)现代模型(BERT 系/长文模型/LLM)自行报告并强制附 sim-entity 基线与 no-context 对照;(3)把"分技能表现"纳入报告模板(§7.8 第二行的方法学),比刷总分更有信息量。

§8.3 评测协议

官方协议五要素:①划分文件 train/dev/test 1.0.json,文档级不重叠;②训练仅用答案逐字实例(remove_notfound=True);③dev/test 全量评估;④答案集取 max 计分(自带 UMLS 扩展,或用 expand_answers.py 重做);⑤指标 EM、F1、BLEU-2、BLEU-4、embedding-average,默认小写归一化(-downcase)。任何偏离(如只评 verbatim 子集、单答案计分)必须显式声明,否则与论文数字不可比。

§8.3b 实体表示设置对照(评测协议的隐藏维度)

同一份数据在三种输入设置下任务难度完全不同,报告成绩必须注明设置(论文核心实验维度):

设置 passage/query 处理 输出空间 论文代表成绩(F1)
Ent 实体位置加标记,保留词面 数百候选实体 SA 11.4 / GA 30.2
Anonym 实体标记且词面匿名化(同实体同代号) 收缩为标记系统 SA 27.2 / GA 33.2
NoEnt 无任何实体标记(最接近真实阅读) 开放文本 span GA 33.9(最佳机器)
数据集 规模 来源文本 任务形式 与 CliCR 的互补关系
emrQA 455,837 QA MIMIC-III 笔记(2,425 份) 抽取式(i2b2 逻辑形式展开) 同语义类型体系、真实 EHR 文体——首选外部验证对
MedQA 12,723 美中韩医师考试 四/五选一选择题 考试推理技能;检验知识迁移
PubMedQA 212,300 PubMed 摘要 yes/no/maybe 判断 文献域判断;与病例叙事互补
MedMCQA 193,100 印度医学考试 四选一选择题 大规模知识覆盖
SQuAD 107,785 Wikipedia 抽取式 开放域对照(答案保证逐字,CliCR 仅 59%)
Quasar-S 约 37K 软件标签定义 完形填空 同为自动挖空范式的方法学参照
SciQ 约 14K 科学教材 四选一 固定候选 vs CliCR 开放候选的对照
MedHop 约 2.5K MedlinePlus/DrugBank 多跳完形 多跳推理探针(规模仅够评估)

(emrQA/MedQA/PubMedQA/MedMCQA/SQuAD 数字来自 RoMedQA 对比表;Quasar-S/SciQ/MedHop 来自 CliCR 论文 Table 1。)

§8.5 关键论文 Top 8

  1. Šuster, S. & Daelemans, W. (2018). CliCR: a Dataset of Clinical Case Reports for Machine Reading Comprehension. NAACL-HLT 2018, pp. 1551–1563. DOI 10.18653/v1/N18-1140 — 数据集论文:构建流水线、基线、人类研究、13 类技能分析。
  2. Dhingra, B. et al. (2017). Gated-Attention Readers for Text Comprehension. ACL 2017. arXiv:1706.03646 — GA reader 原论文,CliCR 最强基线的出处。
  3. Pampari, A. et al. (2018). emrQA: A Large Corpus for Question Answering on Electronic Medical Records. ACL 2018 — EHR 文本 QA 大语料,与 CliCR 构成"叙事体 vs 噪声病历"互补对。
  4. Sugawara, S. et al. (2017). 基准数据集认知技能评估系列工作(CliCR 技能分类沿袭其框架) — 提供技能分类体系与"数据集难度画像"方法。
  5. Chen, D. et al. (2017). Reading Wikipedia to Answer Open-Domain Questions. arXiv:1704.00051 — DrQA,"检索 + 阅读"范式参照系。
  6. Jin, Q. et al. (2019). PubMedQA: A Dataset for Biomedical Research Question Answering. arXiv:1909.06146 — 文献判断式 QA 大规模基准。
  7. Jin, Q. et al. (2021). What Disease does this Patient Have? (MedQA). arXiv:2007.13582 — 执业考试 QA,临床推理知识维度。
  8. Dodge, J. et al. (2021). Documenting Large Webtext Corpora: A Case Study on the Colossal Clean Crawled Corpus. EMNLP 2021 — 预训练语料审计方法学,坑点 4 污染检测的方法依据。

§8.6 社区活跃度

官方仓库 clips/clicr:154 star / 40 fork / 0 open issues(截至 2026-09,GitHub API);创建于 2018-03-26,最后推送 2025-08-28(维护性更新:申请邮箱)。论文被引 97 次(Semantic Scholar,截至 2026-09)——在"申请制"小众临床 NLP 数据集中属常规水平。无公共排行榜、无 HuggingFace 官方托管、无集中讨论区;问题反馈走 GitHub Issues 或邮件。

§8.7 生态快照表

资源 类型 链接 活跃度(截至 2026-09) 推荐理由
clips/clicr 官方代码 + 数据申请入口 https://github.com/clips/clicr 154 star / 40 fork;最后推送 2025-08 唯一权威渠道:数据申请、解析/评估/基线全套脚本
ACL Anthology N18-1140 论文官方页 https://aclanthology.org/N18-1140/ 静态 权威 BibTeX 与 PDF
arXiv 1803.09720 预印本 https://arxiv.org/abs/1803.09720 静态 快速阅读全文
UAntwerpen 机构库 开放全文镜像 https://repository.uantwerpen.be/docman/irua/be9dc0/152268.pdf 静态 论文开放获取备份
UMLS Metathesaurus 知识库(NLM) https://www.nlm.nih.gov/research/umls/ 持续更新 expand_answers.py 与 CUI 映射依赖(免费许可)
Semantic Scholar 引用计量 https://api.semanticscholar.org/graph/v1/paper/DOI:10.18653/v1/N18-1140 动态 引用数与关联论文追踪

§9 相关资源与引用

§9.1 官方资源清单

§9.1b 上手复现检查清单

  • [ ] 已邮件申请并下载三份 1.0.json;describe_data.py 输出 91,344/6,391/7,184
  • [ ] 解析后 passage 词数均值 ≈1,466(与论文 §4 对账)
  • [ ] 训练集过滤后规模 < 91,344(官方协议:仅答案逐字实例)
  • [ ] 评估采用答案集 max + 小写归一化,且 verbatim 两分层分别报告
  • [ ] 报告附 sim-entity 基线(F1 29.4)与(如用 LLM)no-context 对照
  • [ ] UMLS 版本号、实体表示设置(Ent/Anonym/NoEnt)写入实验记录
  • [ ] 代码 commit 固定(仓库 2025-08-28 后无数据相关变更)

§9.2 BibTeX 引用块

@inproceedings{suster-daelemans-2018-clicr,
    title = "{C}li{CR}: a Dataset of Clinical Case Reports for Machine Reading Comprehension",
    author = "{\v{S}}uster, Simon and Daelemans, Walter",
    editor = "Walker, Marilyn and Ji, Heng and Stent, Amanda",
    booktitle = "Proceedings of the 2018 Conference of the North {A}merican Chapter of the Association for Computational Linguistics: Human Language Technologies, Volume 1 (Long Papers)",
    month = jun,
    year = "2018",
    address = "New Orleans, Louisiana",
    publisher = "Association for Computational Linguistics",
    url = "https://aclanthology.org/N18-1140/",
    doi = "10.18653/v1/N18-1140",
    pages = "1551--1563",
}

@inproceedings{dhingra-2017-gated,
    title = "Gated-Attention Readers for Text Comprehension",
    author = "Dhingra, Bhuwan  and Liu, Hanxiao  and Salakhutdinov, Ruslan  and Cohen, William W.",
    booktitle = "Proceedings of the 55th Annual Meeting of the Association for Computational Linguistics (Volume 1: Long Papers)",
    year = "2017",
    publisher = "Association for Computational Linguistics",
    doi = "10.18653/v1/P17-1168",
}

@article{chen-2017-drqa,
    title = "Reading {W}ikipedia to Answer Open-Domain Questions",
    author = "Chen, Danqi and Fisch, Adam and Weston, Jason and Bordes, Antoine",
    journal = "arXiv preprint arXiv:1704.00051",
    year = "2017",
}

@article{jin-2019-pubmedqa,
    title = "{P}ub{M}ed{QA}: A Dataset for Biomedical Research Question Answering",
    author = "Jin, Qiao and Dhingra, Bhuwan and Liu, Zhengping and Cohen, William W. and Lu, Xinghua",
    journal = "arXiv preprint arXiv:1909.06146",
    year = "2019",
}

@article{jin-2021-medqa,
    title = "What Disease does this Patient Have? A Large-scale Open Domain Question Answering Dataset from Medical Exams",
    author = "Jin, Di and Jin, Zhijing and Zhong, Yi Tan and Ticak, Oana and Zitnik, Marinka and Szolovits, Peter",
    journal = "arXiv preprint arXiv:2007.13582",
    year = "2021",
}

§9.3 引用指南

  • 用数据集:引 Šuster & Daelemans 2018(上面第一条 BibTeX),并注明数据经邮件申请获取、研究用途许可。
  • 用官方评估协议:同时引论文与代码仓库(clips/clicr,commit 号建议写入实验记录)。
  • 用 UMLS 扩展答案:附 UMLS Metathesaurus 版本号(NLM 要求的引用方式见其官网)。
  • 引用本百科:引用格式 千方病案医数集, "CliCR — 临床病例报告阅读理解 AI-Ready Wikipedia", qianfanghub.com, 2026, https://www.qianfanghub.com/ai-ready-dataset/clicr/0,并注明审核日期 2026-09-05。

§10 AI 使用声明卡

§10.1 AI 模型列表

本页面内容生产使用:大语言模型(文本撰写、表格组织、代码示例生成);检索增强(WebSearch/WebFetch 获取论文、仓库与 API 元数据)。未使用 AI 图像模型生成本页配图(cover_image_prompt 为交付给插画管线的提示词文本)。

§10.2 AI 参与范围

AI 完成初稿撰写、数字汇编与代码示例编写;人类编辑完成:事实核验(论文/仓库/API 三源交叉)、医学与数据工程交叉审核、坑点与 DAIMS 评分的复核定稿。

§10.3 输入来源列表

  1. Šuster, S. & Daelemans, W. (2018). CliCR: a Dataset of Clinical Case Reports for Machine Reading Comprehension. NAACL-HLT 2018, pp. 1551–1563. DOI 10.18653/v1/N18-1140.
  2. 同论文 arXiv 预印本 v1(1803.09720,2018-03-26)全文(ar5iv 渲染版)。
  3. 同论文安特卫普大学机构库开放全文 PDF(repository.uantwerpen.be/docman/irua/be9dc0/152268.pdf)。
  4. ACL Anthology 条目页 N18-1140(含官方 BibTeX 与元数据)。
  5. GitHub 官方仓库 README(clips/clicr,含数据获取协议与全部脚本说明)。
  6. 官方 dataset-code/describe_data.py 源码(JSON schema 常量与顶层结构定义)。
  7. 官方 dataset-code/json_to_plain.py 源码(实体标记解析、训练过滤协议、三种导出格式)。
  8. GitHub REST API 仓库元数据(star/fork/创建与推送时间,查询日 2026-09)。
  9. Semantic Scholar API 引用计数(DOI:10.18653/v1/N18-1140,查询日 2026-09)。
  10. Papersgraph 数据集页(license 归类 Custom research-only、模态与语言元数据)。
  11. sotaverified.org 论文页(GA 33.9 / SA 27.2 F1 第三方转录,未复现验证状态说明)。
  12. RoMedQA 预印本(arXiv:2508.16390)Table 1(SQuAD/PubMedQA/emrQA/MedQA/MedMCQA 规模数字)。
  13. Journal of Clinical Otolaryngology 综述表(emrQA 455,837 QA 与 2,425 份笔记的结构描述)。
  14. Dodge et al. (2021)(EMNLP)C4 语料审计——坑点 4 污染检测方法学参考。

§10.4 人工校验表

内容模块 审核者 审核方式 审核状态
§1 概览与规模数字(104,919/11,846/1,466) 千方病案医学编辑部 与论文 Table 2/§4 及 arXiv 全文逐项比对 ✅ 已验证
§2 医学背景(UMLS/ICD-11/SNOMED 桥接、任务定义) 千方病案医学编辑部 交叉审核 ✅ 已通过
§3 数据集规格(划分、格式、工具链) 千方病案医学编辑部 与官方 describe_data.py/README 比对 ✅ 已验证
§4 数据结构(JSON 字段字典) 千方病案医学编辑部 与官方源码逐字段核对 ✅ 已验证
§5 划分策略与泄漏分析 千方病案医学编辑部 交叉审核 ✅ 已通过
§6 代码示例与八个坑点 千方病案医学编辑部 代码逻辑审查 + 官方脚本比对 ✅ 已通过
§7 质量评估与 DAIMS 评分 千方病案医学编辑部 交叉审核 ✅ 已通过
§8 排行榜数字与引用表述 千方病案医学编辑部 与论文 Table 4 及 Semantic Scholar 快照比对 ✅ 已验证
§C JSON-LD @graph 千方病案医学编辑部 Schema v3.9 字段逐项校验 ✅ 已通过

§10.5 AI 生成章节标注

以下章节由 AI 生成初稿并经人工审核:§1.0 30 秒速览、§1.3 对比表、§3.0 版本抉择矩阵、§6.1–§6.4 代码示例、§6.5 八个坑点、§6.9 评估指标代码、§7.7 DAIMS 评估表与评分、§8.1 排行榜、§8.7 生态快照、§C JSON-LD。

§10.6 最后审核

最后一次人工审核日期:2026-09-05

页面状态:published(全部内容已完成审核并发布)

返回 AI-Ready 数据集