八类物质使用句级标注 — MIMIC-Ext-DrugDetection

8053 句发布实例 / 八类多标签二值标注 / 源自 MIMIC-III 与 MIMIC-IV

来源 https://physionet.org/content/mimic-ext-drug-detection/1.0.0/发布时间: 2026-10-28最后更新: 2026-10-31 阅读 11
八类物质使用句级标注 — MIMIC-Ext-DrugDetection

信息速览

数据集名称八类物质使用句级标注 — MIMIC-Ext-DrugDetection
数据类型临床自由文本,出院小结,句子级标注,多标签二值标签,CSV
规模1151 份含关键词病历 / 句子为实例
接入方式https://physionet.org/content/mimic-ext-drug-detection/1.0.0/

一份出院小结里可以同时出现两句话:「患者否认使用海洛因」与「每日静脉注射海洛因约十年」。对结构化字段来说这两句毫无区别——它们都只贡献同一个诊断码或干脆什么都不贡献;对临床判断来说它们方向相反。物质使用信息的特殊性就在这里:它几乎只以自由文本的形态存在于电子病历里,而且决定其含义的不是药物名词本身,而是围绕这个名词的时态、否定、主体与语境。任何只做关键词匹配的抽取器,在这两句话上的输出都是一样的,而这个「一样」正是过去十几年物质使用监测口径混乱的技术根因。

公共卫生侧的需求与此正面相撞。药物过量死亡的归因、注射吸毒相关感染的随访、处方阿片类滥用的早期识别,都需要把散落在病历叙述里的信息变成可聚合的变量。自然语言处理(Natural Language Processing, NLP)被寄望于完成这一步,但长期缺少一个「带人工标注、类别明确、可公开复现」的基准——早期工作要么用规则与词典,要么在单一物质上做二分类,无法处理多种物质并存的真实情形。

MIMIC-Ext-DrugDetection 就是为了补这个基准而做的。它从 MIMIC-III 与 MIMIC-IV 的出院小结里筛出 1,151 份含相关关键词的病历,由五名标注员按预设指南做跨度(span)标注,一致性达到 kappa 大于 0.80 后转为单人标注并复核,再把病历切成句子、降维成多标签句级分类问题。官方页面给出的两个数量级需要放在一起读:切句后共 274,602 句、其中 3,948 句含药物提及;而随版本发布的划分合计 8,053 句。这两个数字并不相等,理解它们的差别是正确使用本数据集的第一道门槛。一屏速览见下表。

维度 内容
全名 MIMIC-Ext-DrugDetection
发布方 PhysioNet(数据由加州大学洛杉矶分校等机构团队贡献)
首次发布 2025 年 9 月 25 日,版本 1.0.0
最近改动 2025 年 9 月 25 日,目前仅一个版本,无修订记录
上游数据集 MIMIC-III Clinical Database v1.4 与 MIMIC-IV v3.0
标注病历数 1,151 份含关键词的出院小结
切句后规模 274,602 句,其中 3,948 句含药物提及
发布实例数 8,053 句:TRAIN 804、VALIDATION 806、TEST 6,443
标签结构 8 个二值标签列,多标签,可同时为 1
标注粒度 句子级(一句一实例),由跨度标注降维而来
标注方式 五名团队成员按标注指南标注文本跨度,kappa 大于 0.80 后转单标注并全量复核
数据来源机构 贝斯以色列女执事医疗中心(波士顿,单一中心)
时间覆盖 MIMIC-III 2001–2012,MIMIC-IV 2008–2019
文件格式 CSV,每行一句,列含 doc_id、sentence_id、text 与八个标签列
许可 PhysioNet Credentialed Health Data License 1.5.0
访问条件 凭证用户 + CITI「Data or Specimens Only Research」培训 + 数据使用协议 1.5.0
典型用途 物质使用检测的 NLP 与大模型基准、临床决策辅助原型、公共卫生监测方法学研究

§1 它要解决的具体麻烦

1.1 「否认使用」这句话本身就是最难的样本

病历里的药物提及至少分五种情形,每一种的流行病学含义都不同:当前使用、既往使用、他人使用(家属代述)、否定使用(患者否认)、以及纯粹的给药记录(术中使用芬太尼)。这五种情形在字面上高度相似,差别全靠上下文里的一两个词——一个「否认」、一个「既往」、一个「母亲代述」、一个「术中」。

结构化数据完全无法承载这个差别。诊断编码只记录「是否被医生认定为障碍」,用药医嘱只记录「是否开了这个药」,二者都不能表达「提到了但没有使用」这类信息。于是出现一个吊诡的局面:越是需要精细监测的场景,越依赖最不可聚合的那一类数据。

更麻烦的是多物质共存。真实临床里单一物质使用者是少数,合并使用(polysubstance use)才是常态。把任务设计成八选一的单标签分类,等于在数据层面否认了这个事实;而设计成多标签,标注成本与一致性维护的难度会陡增。本数据集选择的是后者——八个二值列,允许一行同时点亮多个。

1.2 三条常见的错误期待

第一条,期待拿到的是全量切句语料。官方页面在「数据处理」一节给出 274,602 句,在「汇总统计」一节给出的 TRAIN、VALIDATION、TEST 合计是 8,053 句。把这两个数字当成同一个东西,会在实验设计上直接出错:用 8,053 句跑出来的「低频类别样本极少」的结论,不能推到全量语料上;反过来,用 27 万句的设想去做算力预算,实际下载到的文件会小得多。官方页面没有逐字说明两者的关系,本文在 §7.3 与附录 B 里把它单列为待向发布方确认的事项。

第二条,期待它是文档级标签。它的实例是句子,不是病历。句子级的代价是上下文被切断——指代、段落级的时间状语、前后句的转折关系在切句后可能丢失。官方把这一点明确写进了已知局限。

第三条,期待它覆盖当下主流药物。官方明确提到芬太尼在本数据集中出现很少。上游 MIMIC-III 覆盖 2001–2012、MIMIC-IV 覆盖 2008–2019,而这十几年恰好是阿片类流行从处方药转向合成阿片类的转折期。用它训练出的模型,对近年药物格局的外推能力要打问号。

1.3 它能给到的与给不到的

你的需求 它给的 够不够
多标签句级分类基准 8,053 句、八个二值列、三划分齐全 够,且划分比例已由官方固定
大模型的零样本与微调对照 配套论文给出零样本、少样本、微调三种配置 够,模型与代码均开源
否定与历史提及的判别研究 标注指南要求识别显式与细微提及 可做,但句子级上下文有限
合并使用的建模 多标签结构天然支持 够,这是它相对单标签资源的主要优势
文档级或患者级推断 只给 doc_id,不给文档级标签 不够,需自己按 doc_id 聚合
时间趋势监测 时间范围固定在 2001–2019 不够,无法反映近年药物格局
多中心泛化验证 单一中心(波士顿) 不够,只能做跨数据集而非跨中心
芬太尼与合成阿片类 官方明确说芬太尼少见 不够

1.4 你的处境与它能帮到的事

你的处境 它能帮你什么 下一步该做什么
你在做临床大模型评测,缺一个有人工金标的物质使用任务 提供八类多标签金标与固定划分 直接按官方划分跑零样本与微调,报告八类分别的分数
你在做物质使用流行病学,想知道 NLP 抽取能不能替代人工病历回顾 提供可对照的人工标注基线 用它估计抽取误差的量级,再决定抽样复核比例
你在做否定与时序判别(NegEx 一类)的方法学研究 标注指南覆盖细微提及,句子短便于定位 按 sentence_id 回看,把否定与历史提及单独分组报告
你想复现论文里的 Llama-DrugDetector 结果 数据、模型权重、推理封装三者都公开 走 §9.2 的最短流程,先跑 8B 再跑 70B
你在做类别不平衡方法研究 官方划分本身就是类别平衡后的产物 注意:这既是便利也是限制,见 §7.3
你在做中文或其他语言的迁移 英文语料,术语体系为美国临床习惯 只能做跨语言迁移的英文侧基线
你想做实时临床预警 只有回顾性标注,无时间戳、无结局变量 不适合,见 §1.6

1.5 一句话判断

它不适合当「更大的训练集」,而适合当「有金标的尺子」:在一个人工一致性被量化、类别定义被写进指南、划分被固定下来的任务上,量出不同模型对同一段临床叙述的判断差异。

1.6 不适合谁:四条边界

不适合拿来做规模预训练。 发布规模 8,053 句、单句长度有限,深度学习模型一两轮就能记全。想用数据量换性能的项目,用它会立刻过拟合。

不适合拿来做患者的纵向分析。 数据只有 doc_id 与 sentence_id,没有患者标识、没有入院时间、没有结局。想按人聚合、按时间排序,需要自己回到 MIMIC-III/IV 去关联,那又是一整套凭证与映射工作。

不适合拿来做近年药物格局的推断。 时间上限 2019 年,官方明确说芬太尼少见。把它当成当下阿片类流行的抽样框,结论会系统性偏旧。

不适合直接做临床决策支持产品。 官方在伦理一节把用途限定在研究、监测与人群层面,配套论文也强调需人工复核。它提供的是方法学证据,不是可部署的判定规则。

§2 数据构成与规格

2.1 三个划分与一张宽表

官方的数据描述把结构讲得很直接:数据存放在 CSV(逗号分隔值)文件中,每一行代表从病历中抽出的一句话,任务被组织为多标签句子分类,每行的输出是一个表示八类物质使用有无的二值向量。

与常见的纵向表不同,这是一张「宽表」:文本列只有一列,标签列横向铺开八列。这种形态对多标签训练最省事——不需要做长表转宽表,也不需要在标签列里做字符串切分;但对「想知道某一类到底对应什么」的人来说,八个列名就是全部文档。官方对每个列名的语义逐条给了定义,§2.2 完整转述。

三个划分的规模并不均匀,官方给出的是约 10% TRAIN、10% VALIDATION、80% TEST。这与机器学习惯用的「大头在训练」正好相反,原因在 §4.1 里展开。

2.2 字段字典

列名 取值形态 含义(据官方列定义) 使用注意
doc_id 标识符 该句被抽出的原始病历文档标识 回看上下文、按文档聚合、做分组划分的唯一钥匙
sentence_id 序号 该句在其所属文档内的序号 与 doc_id 联合可重建句子在文档中的相对位置
text 自由文本 句子文本 已去标识(继承 MIMIC 的去标识流程)
heroin 0 / 1 是否存在海洛因使用 官方定义为「海洛因使用」
cocaine 0 / 1 是否存在可卡因使用 同上
methamphetamine 0 / 1 是否存在甲基苯丙胺使用 官方列为低频类别之一
benzodiazepine 0 / 1 是否存在苯二氮卓类的非法使用 注意限定语是「非法使用」,不是「使用」
rx_opioid_misuse 0 / 1 是否存在处方阿片类的非法使用 限定语是「非法使用」,合法处方使用不算
cannabis 0 / 1 是否存在大麻使用 官方定义为「大麻使用」
injection_drug_use 0 / 1 是否存在非法注射吸毒 这是给药途径而非物质,见 §2.6
general_drug_use 0 / 1 是否存在非特异性的药物使用 官方说明:上述任一类出现,或提及非特异性药物使用时为 1

官方同时给出各划分内每一类的条数,这是判断「能不能做某个类别」的直接依据。下表完整转述官方汇总统计,未作任何再加工:

划分 总句数 海洛因 可卡因 甲基苯丙胺 苯二氮卓类 处方阿片类滥用 大麻 注射吸毒 Any None
TRAIN 804 93 65 9 26 13 13 128 402 402
VALIDATION 806 94 66 9 26 14 14 128 403 403
TEST 6,443 749 528 72 232 122 121 1,041 3,143 3,300
合计 8,053 936 659 90 284 149 148 1,297 3,948 4,105

读这张表需要注意三点:一是 Any 与 None 的合计数恰为总句数,说明二者是按「有无任何药物提及」做的互斥划分;二是甲基苯丙胺、处方阿片类滥用、大麻三个类别的规模明显小于海洛因、可卡因与注射吸毒,官方把类别不平衡明确列为已知局限;三是 TRAIN 与 VALIDATION 里 Any 与 None 各占一半,TEST 里两者接近但不相等,这个细节在 §5.6 会再提。

2.3 一行的完整解剖

以官方字段定义拼出的示意行为例(这不是原始文件内容,仅用于说明列的含义与顺序):

doc_id,sentence_id,text,heroin,cocaine,methamphetamine,benzodiazepine,rx_opioid_misuse,cannabis,injection_drug_use,general_drug_use
d0917,42,He denies current heroin use but reports daily cocaine.,0,1,0,0,0,0,0,1

拆开看:这一句来自文档 d0917,是该文档的第 42 句;文本里同时出现了海洛因与可卡因两个名词,但海洛因前有否定词、可卡因是正向陈述,所以 heroin 为 0、cocaine 为 1;general_drug_use 为 1,因为存在有效的药物使用提及。这正是 §1.1 讲的那种句子,也是标注指南要求标注员分辨的情形。

一行里最容易看漏的是 general_drug_use 与其余七列的关系。按官方定义它是一个派生列:其余七列任一为 1 时它必为 1,此外非特异性的药物提及也会让它为 1。这意味着它不是一个独立的第九个类别,把它和前七列一起当「八个平权标签」喂给模型,会让标签向量带上结构性冗余。

读取与基本校验的写法:

import pandas as pd

LABELS = ["heroin", "cocaine", "methamphetamine", "benzodiazepine",
          "rx_opioid_misuse", "cannabis", "injection_drug_use",
          "general_drug_use"]

#-- 官方说明数据以 CSV 存放,每行一句;按划分分别读取
tr = pd.read_csv("train.csv")
va = pd.read_csv("validation.csv")
te = pd.read_csv("test.csv")

print(tr.shape, va.shape, te.shape)      #-- 官方给出的规模为 804 / 806 / 6443 行
print(tr.columns.tolist())

#-- 多标签向量:八个标签列直接取 0/1
y = tr[LABELS].to_numpy(dtype="int8")
print(y.shape, int(y.sum()))

2.4 doc_id 与 sentence_id 的映射关系

这两个标识列是数据集中唯一保留文档结构的痕迹。它们支持三件事,也都有各自的限制:

用法 怎么做 限制
回看上下文 按 doc_id 分组,按 sentence_id 排序,取目标句前后若干句 只有同文档内的邻近句,文档全文不在本数据集中
按文档分组划分 以 doc_id 为分组键,用 GroupKFold 或按文档切 同一文档的句子高度相关,随机按行切分会泄漏
合并为文档级标签 按 doc_id 对八列取最大值 官方未给出文档级金标,结果是自造标签,须在论文里写明

第三条值得展开。把句子级标签聚合到文档级,是很多人拿到这份数据后的第一反应,因为它更接近「这个患者有没有物质使用问题」这个临床问题。但聚合方式本身会带来误差:取最大值会放大偶然提及的影响,取「是否存在正向陈述」则需要重新判读否定与历史提及,而这部分判断正是句子级标注里最依赖上下文的部分。官方明确说句子级切分可能导致上下文丢失、影响复杂情形的判读,这句提醒在聚合时同样成立。

泄漏的机制要说清。同一份出院小结切出的若干句,共享同一位医生、同一次入院、同一套叙述习惯。如果按行随机划分,同一份病历的句子会分别落进训练与测试,模型只要学会「这份病历的措辞风格」就能在测试上拿分,而这个能力换到另一家医院完全失效。正确做法很朴素:把 doc_id 作为分组键,同一文档绝不出现在两侧。

2.5 与同类资源的字段差异

对比项 MIMIC-Ext-DrugDetection 一般病历级标注集 词典或规则抽取的流水线 影像衍生标注集
实例单位 句子 整份病历 视实现而定 影像或检查
标签结构 8 个二值列,多标签 多为单标签或单一二分类 命中即 1 多为单标签
标签来源 人工跨度标注后降维 人工或半自动 规则,无金标 人工或报告解析
一致性指标 官方给出 kappa 大于 0.80 视项目而定 不适用 视项目而定
文本是否可得 句子文本在表内 需另取病历 需另取病历 无文本
上游依赖 需同时有 MIMIC 凭证 视项目而定 视项目而定 视项目而定

这张表要说的只有一件事:它的独特之处不在「有文本」,而在「文本与人工多标签金标在同一个 CSV 里,且一致性有量化门槛」。这让它可以被直接用作评测集,而不必先自建标注。

2.6 八个标签列的语义并不在同一层

把八个列名并排看,会发现它们分属三种不同的东西:

层次 列 判断的是什么 混用的风险
物质层 heroin、cocaine、methamphetamine、cannabis 是否使用了某种具体物质 无
物质加限定层 benzodiazepine、rx_opioid_misuse 是否非法使用了某种本身可能是合法处方的药物 把「使用」当「滥用」会系统性高估
行为层 injection_drug_use 是否采用注射这一给药途径 它与物质层正交,同一句可同时点亮
派生层 general_drug_use 上述任一成立,或有非特异性药物提及 与前七列不独立,不能当第九个平权类别

这个分层有两个直接后果。第一,injection_drug_use 与物质列不是互斥关系——「注射海洛因」会同时点亮 heroin 与 injection_drug_use,这是设计如此,不是标注错误。第二,benzodiazepine 与 rx_opioid_misuse 的限定语是「非法使用」,而 heroin、cocaine、cannabis 没有这个限定语,因为后者本身就不存在合法处方语境。做类别合并或做「八类平均」的报告时,这个差别会被抹掉,报告出来的数字也就失去了临床意义。

§3 它是谁的数据

3.1 贡献者与机构

官方页面列出七位作者:Fabrice Harel-Canada、Nanyun Peng、David Goodman、Ruby Romero、Allan Nguyen、Brandon Moghanian、Anabel Salimian。署名机构以加州大学洛杉矶分校(UCLA)为主,含 UCLA 大卫·格芬医学院,另有一位作者来自澳大利亚新南威尔士大学。通讯作者信息需登录 PhysioNet 才能查看。

这是一个典型的「临床信息学加成瘾医学」组合:标注团队由五名成员构成,按预设的标注指南识别显式与细微的物质使用提及。资助方为美国国立卫生研究院下属的国家药物滥用研究所(NIDA),官方致谢列出 K01-DA050771、K08-DA048163-03 与 R01-DA57630 三项基金,并声明资助方未参与研究设计、实施与发表决定。

3.2 时间线

时间 事件
2001–2012 上游 MIMIC-III 覆盖的住院时间段
2008–2019 上游 MIMIC-IV 覆盖的住院时间段
2025 年 9 月 25 日 版本 1.0.0 在 PhysioNet 首次发布,为初版,与配套论文一致
2025 年 配套论文以预印本形式发布,后正式发表于同行评议期刊
2026 年 10 月 本次核验时点,仍只有 1.0.0 一个版本,无修订记录

只有一个版本这件事有两面。好处是引用简单、不存在版本混淆;代价是官方页面里那些已知局限没有后续的修正机会,用户必须自己记住它们。

3.3 采集场景:为监测而做的回顾性标注

这不是一次前瞻性采集。官方把研究定性为回顾性研究,用的是已经去标识、公开可得的 MIMIC-III 与 MIMIC-IV 数据,两家上游都来自波士顿的贝斯以色列女执事医疗中心。UCLA 的机构审查委员会(IRB)认定该研究因仅涉及去标识的公开数据而豁免审查。

采集逻辑是「关键词召回加人工判读」:先筛出 1,151 份含相关关键词的病历,再由标注员在跨度层面判读。这个流程有一个隐含后果——召回面由关键词表决定,关键词表之外的表述方式(缩写、俚语、拼写变体)可能从未进入标注池。官方没有公开关键词表的全文,这一点在附录 B 里列为未核验内容。

3.4 数据来源的三个层次

层次 内容 谁负责
第一层 波士顿一家医疗中心的住院电子病历 原始诊疗过程,非为研究而采集
第二层 MIMIC-III v1.4 与 MIMIC-IV v3.0 的去标识与发布 MIT 计算生理实验室与 PhysioNet
第三层 出院小结的筛选、跨度标注、切句与划分 本数据集作者团队

三层各有各的约束叠加到用户身上:第一层决定了人群与时间的边界(单一中心、2001–2019);第二层决定了访问门槛(凭证、CITI 培训、数据使用协议);第三层决定了标签口径(句子级、八类、多标签)。想越过其中任何一层都会出问题——比如想做多中心验证,卡在第三层上游的第一层;想省掉凭证,卡在第二层的法律要求。

§4 它最独特的东西

4.1 反常规的划分比例

TRAIN 804、VALIDATION 806、TEST 6,443,约 10%、10%、80%。机器学习实践里「训练大头」几乎是默认设置,这里被反过来了。

这个设计透露了作者的真实定位:他们把这份数据主要当成评测集而不是训练集。配套论文的核心实验是零样本、少样本与微调三种配置的对照,微调只需要少量样本,而评测需要足够大的测试集才能让类别级别的分数稳定——尤其是那些低频类别。TEST 里甲基苯丙胺 72 句、处方阿片类滥用 122 句、大麻 121 句,若按常规 10% 测试划分,这些类别的分数会被抽样噪声淹没。

对用户来说这是一个明确信号:如果你打算用它做主训练集,就在使用作者预留的 80% 之外;如果你打算用它做评测,那么官方划分本身就是可以直接引用的口径,改动它会让结果无法与论文对照。

4.2 多标签是设计选择,不是妥协

单标签八选一的做法在物质使用任务上会说不通,因为它预设了「一个患者只碰一种东西」。官方把任务明确定框为多标签,正是为了捕捉并存的物质使用,配套论文也把合并使用单独列为一个评测维度。

多标签带来的直接好处是能回答「模型能不能同时认出两三种物质」。代价是评价指标变复杂:逐类的精确率与召回率、样本级的完全匹配率、以及合并使用这一类复合情形,都需要分别报告。只报一个宏平均,会把低频类别的表现藏起来。

4.3 案例:同一句里的两个相反方向

回到 §2.3 的那句示意:「否认当前使用海洛因,但报告每日使用可卡因」。这句话浓缩了本数据集的全部技术难度:

  • 两个物质名词都出现了,关键词系统会同时命中;
  • 一个被否定词翻转,一个没有;
  • 时态与「当前」这个限定词决定了它属于当前使用还是其他;
  • 正确输出是 heroin=0、cocaine=1、general_drug_use=1。

官方在背景里把这类判别写得很清楚:关键细节埋在使用了多样术语与否定的非结构化叙述里,需要仔细的语境判读才能把「相关使用」与「历史提及」或「否认」区分开。这句话就是这段话的最小实例。

4.4 标注的粒度:跨度标注降维成句级

标注员做的是跨度标注——在病历文本里高亮一段文字并分类。最终发布的是句子级标签。这个降维有得有失。

维度 跨度标注 句子级标签
定位精度 精确到词组 只到句子
与上下文的关系 标注时可见全篇 发布时上下文被切
使用门槛 需要跨度解析工具 直接当表格用
下游适配 适合序列标注模型 适合句级分类与大模型提示

官方选择降维的理由很实际:病历太长,跨度级的序列标注对下游不友好,而句级分类既能接 BERT 类编码器也能接大模型提示。代价被官方明确写进局限:切句可能丢失关键上下文,影响复杂情形的判读。

对使用者的具体建议是:把 sentence_id 当成上下文的坐标而不是装饰。遇到判读困难的句子,按 doc_id 与 sentence_id 回到 MIMIC 原文去看前后句——这一步在论文的方法部分往往值一行说明。

4.5 边界条件:什么情况下它不再适用

情形 还能不能用 原因
评测英文临床文本的物质使用抽取 能 这正是它被造出来的用途
训练一个通用临床文本编码器 勉强 8,053 句规模太小
研究近年合成阿片类 不能 时间上限 2019,官方说芬太尼少见
做跨中心泛化 不能 单一中心
做患者级风险预测 不能 无患者标识、无时间、无结局
做非英语语种的迁移 只能做英文侧基线 术语体系为美国临床习惯
直接部署为临床预警 不能 官方把用途限定在研究、监测与人群层面

§5 怎么拿到

5.1 目录结构与下载面

数据按 PhysioNet 的凭证模式分发:项目主页挂在项目路径下,实际文件在文件目录下,只有签署数据使用协议并完成 CITI 培训的凭证用户才能访问。本次核验时,文件目录在核验者所在地区返回「因法律或政策限制不可用」,因此具体的文件名与目录层级未经直接访问确认,下表按官方页面描述给出,实际名称以登录后的文件浏览器为准。

层级 内容 确认状态
项目主页 摘要、背景、方法、数据描述、使用说明、发布说明、伦理、参考文献 已确认
文件目录 存放 CSV 数据文件的版本目录 页面存在,文件名未确认
CSV 数据文件 按 TRAIN / VALIDATION / TEST 划分,每行一句 结构与列定义已确认,文件名未确认
许可文件 PhysioNet 凭证健康数据许可 1.5.0 全文 许可名称与版本已确认

这一条要写进任何引用它的论文的方法部分:如果连文件名都没法独立核验,复现性声明就要相应收窄。

5.2 批量下载

#-- 前提:已在 PhysioNet 完成 CITI「Data or Specimens Only Research」培训并签署 DUA
#-- 方式一:wget 递归拉取整个版本目录(会提示输入 PhysioNet 密码)
wget -r -N -c -np --user <你的用户名> --ask-password \
  https://physionet.org/files/mimic-ext-drug-detection/1.0.0/

#-- 方式二:用官方 CLI,先登录再下载到当前目录
physionet login
physionet download mimic-ext-drug-detection

#-- 下载后核对文件数与行数
ls -la
wc -l *.csv

wc -l 的行数会比 CSV 的记录数多一行(表头),且若句子文本内含换行,行计数会与实际记录数不符。核对规模请以 pandas 读出的形状为准,不要以 wc -l 为准。

5.3 直接读取与形状核对

import pandas as pd

#-- 依次读三个划分并核对官方给出的规模
for name, expect in [("train.csv", 804), ("validation.csv", 806), ("test.csv", 6443)]:
    df = pd.read_csv(name)
    assert len(df) == expect, (name, len(df))
    print(name, df.shape)

#-- 抽查标签列取值是否只有 0/1
LABELS = ["heroin", "cocaine", "methamphetamine", "benzodiazepine",
          "rx_opioid_misuse", "cannabis", "injection_drug_use",
          "general_drug_use"]
df = pd.read_csv("test.csv")
print(df[LABELS].apply(lambda s: sorted(s.unique().tolist())).to_dict())

5.4 转成通用的训练张量

import pandas as pd
import numpy as np

LABELS = ["heroin", "cocaine", "methamphetamine", "benzodiazepine",
          "rx_opioid_misuse", "cannabis", "injection_drug_use",
          "general_drug_use"]

def load(path):
    #-- 文本列取 text,标签列取八个二值列
    df = pd.read_csv(path, dtype={"doc_id": str, "sentence_id": str})
    return df["text"].tolist(), df[LABELS].to_numpy(dtype="int8"), df["doc_id"].tolist()

x_tr, y_tr, g_tr = load("train.csv")
x_te, y_te, g_te = load("test.csv")
print(len(x_tr), y_tr.shape, len(set(g_tr)))

doc_id 那一路返回值别丢。它是做分组划分与上下文回填的唯一钥匙,丢掉之后再想补,就得回 MIMIC 重新关联。

5.5 标签映射与上下文回填

import pandas as pd

LABELS = ["heroin", "cocaine", "methamphetamine", "benzodiazepine",
          "rx_opioid_misuse", "cannabis", "injection_drug_use",
          "general_drug_use"]

df = pd.read_csv("test.csv", dtype={"doc_id": str, "sentence_id": "int64"})

#-- 校验 general_drug_use 的派生关系:应覆盖其余七列的并集
others = [c for c in LABELS if c != "general_drug_use"]
ok = bool((df[others].max(axis=1) <= df["general_drug_use"]).all())
print("派生关系成立:", ok)

#-- 按 doc_id 与 sentence_id 回填上下文:取目标句前后各两句
def context(doc_id, sent_id, window=2):
    sub = df[df["doc_id"] == doc_id].sort_values("sentence_id")
    idx = sub.index[sub["sentence_id"] == sent_id]
    if len(idx) == 0:
        return []
    pos = sub.index.get_loc(idx[0])
    lo, hi = max(0, pos - window), min(len(sub), pos + window + 1)
    return sub.iloc[lo:hi]["text"].tolist()

print(context(df["doc_id"].iloc[0], df["sentence_id"].iloc[0]))

第二段代码只在同一个 CSV 内部生效:如果目标句的邻居不在该划分里(例如它们被分进了 TEST 而目标句在 TRAIN),回填会静默地少给几句。跨划分回填需要把三个文件拼起来再做。

5.6 五个最容易出错的地方

坑 错误做法 后果 正确做法
规模误读 把 274,602 当成可下载的记录数 算力与实验设计全错 以 8,053 为发布规模,27 万为切句语料规模
划分误用 按行随机划分 同一病历的句子分落两侧,结果虚高 以 doc_id 为分组键
标签误读 把八个列当成八个平权类别 general_drug_use 的冗余被学进去 训练时单独处理派生列,或只用七列
限定语丢失 把苯二氮卓类与处方阿片类当成「使用」 合法处方使用被算成滥用 报告时明确写「非法使用」的口径
计数误判 用 wc -l 当记录数 表头与文本内换行造成偏差 用 pandas 读出的形状核对

§6 与库内条目的关系

6.1 关系图谱

站内数据集 实例单位 与它的关系
annotation-opioid-use-notes 病历或段落 同样做阿片类使用的病历标注,可互为外部对照
medication-labels-mimic-note 病历 关注药物提及的标注,与本数据集的「使用行为」口径不同
mimic-iii-ext-notes 病历 同源自 MIMIC 病历的抽取评测集,任务不同
ehrcon-consistency-of-notes 病历 关注病历内部一致性,可与物质使用矛盾提及的研究互补
ehrnote-chatqa 问答对 同为 MIMIC 病历派生的文本任务,评测形态不同
task-1-3-soap-note-tag 片段 SOAP 段落打标,可对比「段落级」与「句子级」的取舍
mimic-iv-note 病历全文 本数据集的上游之一,回看上下文的去处
mimic-iii 全库 本数据集的上游之一
mimic-ext-synnotes 合成病历 同为 MIMIC-Ext 系列,但内容与用途不同,不可混为一谈
real-mednlp 多任务 日文临床 NLP 基准,可做跨语种任务的参照

需要特别说明的是:MIMIC-Ext 系列下已有 mimic-ext-cxr-qba、mimic-ext-synnotes 等条目,它们是不同的衍生数据集——一个面向胸片的问答式标注,一个是合成病历,与本数据集在任务、模态、标注方式上都不重叠。命名前缀相同只说明它们共享 MIMIC 这一上游,不代表可以互换。

6.2 检索路径

你要找的东西 检索词 会落到哪里
同一上游的其他衍生集 MIMIC-Ext、MIMIC-IV-Note §6.1 表
阿片类使用的专门标注 opioid、阿片、substance use §6.1 表首行
段落级或病历级的对照 SOAP、note tag、BHC §6.1 表
回看句子上下文 MIMIC-III、MIMIC-IV-Note §5.5 的回填做法
大模型评测方法 zero-shot、few-shot、fine-tune §8.2 与 §9.2
否定与时序判别 negation、NegEx、temporal §1.1 与 §4.3

6.3 与其他数据集的分工判据

任务 主粮仓该用什么 它的位置 原因
物质使用抽取的评测 无可替代 主力 人工金标加固定划分,八类多标签
合并使用建模 无可替代 主力 多标签结构是为这个设计的
大模型的零样本对照 通用临床基准 主力之一 配套论文已给出三种配置的参照
临床文本编码器预训练 大规模病历语料库 不适用 8,053 句规模太小
文档级物质使用判定 病历级标注集 辅助 需自行聚合,官方未给文档级金标
近年药物格局研究 更新的监测数据 不适用 时间上限 2019,芬太尼少见
多中心泛化 多中心 EHR 库 不适用 单一中心

§7 质量评估与局限性

7.0 阅读本节前的一个前置校正

先纠正一个常见误判:把「发布规模只有 8,053 句」当成「标注做得少」。上游是 1,151 份病历、切句后 274,602 句,标注员做的是跨度级判读——工作量不在最终发布的行数上,而在被筛进标注池的病历篇幅与判读难度上。发布规模小是类别平衡与划分策略的结果,不是标注投入的结果。

这个校正会改变五维评分的读法:规模一项拿不到高分,但它换来的评测稳定性(§4.1)恰恰是这份数据的设计目标。

7.1 五维评分

按 DAIMS 的常用维度打分,每项 1–5 分,分数针对「作为物质使用检测研究数据」这个用途:

维度 分数 理由
数据规模 2 发布 8,053 句,训练不足,评测够用
标注质量 4 一致性 kappa 大于 0.80 并全量复核,但句级降维损失上下文
任务适配 5 多标签加八类加固定划分,合并使用研究几乎没有替代品
文档完整 4 列定义、规模、局限写得清楚;关键词表与文件名未公开
可获取性 2 需凭证、CITI 培训与数据使用协议,部分地区不可访问

五项合计 17 分(满分 25)。可获取性是它最大的非技术门槛,这一点与免注册开放的生理信号库形成鲜明对比,选数据集时必须提前算进项目周期。

7.2 标注质量的两层

第一层是一致性有没有被量化。官方给出 kappa 大于 0.80 作为进入单人标注的门槛,之后还有一轮全量复核。这个门槛值在临床 NLP 标注项目里属于偏上的水平,说明类别定义与指南是可执行的——标注员之间的分歧被压到了可控范围。

第二层是降维有没有损失信息。跨度标注被降成句级标签,官方明确把「句子切分导致上下文丢失」写进局限。这一层的损失无法从发布的数据里看出:你拿到的是一个二值向量,看不到当初被高亮的是哪几个词。做错误分析时,能做的是回 MIMIC 原文看上下文,而不能在数据内部定位标注依据。

用途 上下文损失的影响 建议
句级分类评测 小,任务本身就是句级 可直接用
否定与时序判别 中到高,判别依据常在句外 按 doc_id 回填前后句后再判
合并使用的判定 中,不同物质可能分在不同句 报告时区分句级与文档级口径
文档级聚合 高,聚合规则本身引入误差 明确写出聚合方式并做敏感性分析

7.3 已知的、可枚举的偏差

偏差 表现 影响
单一中心 全部来自波士顿一家医疗中心 叙述习惯、人群构成、药物格局都单一
时间边界 2001–2019 无法反映近年合成阿片类为主的格局
关键词召回 1,151 份病历由关键词筛出 表外表述可能从未进入标注池
类别不平衡 甲基苯丙胺、处方阿片类滥用、大麻规模小 低频类别的分数不稳定
句级上下文 切句后上下文丢失 复杂情形判读受影响
文档内相关 同一病历切出多句 按行随机划分会泄漏
物质覆盖 官方明确说芬太尼少见 不能外推到合成阿片类
规模口径 274,602 与 8,053 的关系官方未逐字说明 引用时必须写明用的是哪一个

最后一行是本文认为最需要向发布方确认的一点。官方在「数据处理」段给出切句后 274,602 句、含药物提及 3,948 句,在「汇总统计」段给出合计 8,053 句的划分表。两者数量级相差很大,而 3,948 恰好等于汇总统计里 Any 的合计数,这提示 8,053 是一份类别平衡后的子集。但官方没有明说,本文不把它当既定事实,只把它列为「引用时要写清口径」的理由。

7.4 外部验证矩阵

验证角色 做法 讲得通的地方 风险
大模型零样本对照 不训练,直接提示模型判八类 反映开箱能力,部署成本最低 提示词写法会显著影响结果
少样本对照 从 TRAIN 取示例放进提示 接近真实标注预算受限的情形 示例选取的偶然性大
微调对照 用 TRAIN 微调后测 TEST 官方划分专为这种配置设计 804 句的微调样本很小
跨数据集外测 用它测别处训练的模型 人群与机构都不同,泛化信号真实 标签口径需先对齐
合并使用专项评测 只看多标签同时点亮的行 直击单标签方法说不出的部分 子集更小,置信区间宽

配套论文给出的成绩可以作为这五种角色的参照系:微调后的 Llama-DrugDetector-70B 在多数单一物质上达到 0.95 以上的 F1,在处方阿片类滥用(0.815)与合并使用(0.917)这类更难的任务上分数略低。读这几个数字要注意两点:一是它们出自数据作者自己的实验,不是第三方复现;二是处方阿片类滥用的分数明显低于其他类别,与它在数据里的规模最小这一点相互印证——低频类别的表现受样本量限制,换一份划分可能变动。

反过来也要防止把论文成绩当成数据集本身的性质。0.95 以上的 F1 说的是「某个模型在某个划分上」,不是「这个任务已经解决」。句子级、单一中心、时间边界这三条约束仍在,模型在另一家医院的病历上未必复制同样的分数。

7.5 它为何值得持续存在

它没有版本迭代、规模不大、访问门槛不低,却仍然值得占据一个位置,原因是它把一件本来分散在各家机构内部的事情变成了可公开对照的基准:物质使用的病历标注,过去要么靠各自医院的规则引擎,要么靠一次性的人工病历回顾,两者都无法被别人复现。这份数据把类别定义、一致性门槛、划分与配套代码一并放出来,让「我的抽取器比你的好」这句话第一次有了共同的尺子。只要物质使用监测仍然依赖病历叙述,这把尺子就不会被更新的大语料替代。

§8 生态位与历史

8.1 历史沿革

它出现在临床大模型评测需求集中爆发的阶段。2023 年前后,大模型在医学问答与执照考试类任务上的评测已经很多,但在「从真实病历叙述里抽取一个具有公共卫生意义的行为变量」这类任务上,公开金标很少。物质使用是其中矛盾最尖锐的一个:临床价值高、结构化字段抓不到、术语与否认形态复杂、而且是合并使用为主。

它的出现方式也很有当代特征:不是由数据平台自上而下组织,而是由一个临床信息学团队在完成自己的研究后顺手把标注产物、模型权重与推理封装一并公开。PhysioNet 提供托管与凭证管理,上游 MIMIC 提供去标识的语料,两端都是既成基础设施。

8.2 与配套模型的关系

官方在使用说明里点明了三件互补的东西:微调后的 Llama-DrugDetector-8B 与 70B 模型权重开源在 Hugging Face;drugdetector 这个 Python 包与 GitHub 仓库提供零-shot 推理的封装;配套的标注指南与提示模板作为论文附录发布。

三者组合起来的效果是:拿到这份数据的人不必从零搭评测管线。想跑基线,装包加下权重即可;想改提示词,论文附录给了作者用过的模板;想换模型,八列二值标签是通用的。这是它相对「只发一个 CSV」的资源最实际的便利。

需要区分的是:模型成绩不是数据集的属性。别人换了模型、换了提示词,在同一份数据上的分数可能差很多。引用时请把「数据集」与「论文里的某个模型」分开写。

8.3 生态位:评测尺而不是语料仓

角色 语料仓 评测尺
典型用法 预训练、大规模微调 对照评测、口径对齐、消融
需要的前提 量大、覆盖广 金标可信、划分固定、定义公开
代表资源 大规模病历语料库、通用临床语料 本数据集、其他人工标注的专项基准
失败模式 覆盖不足、领域偏移 规模小导致结论不稳

它坐在右边这一列。把评测尺当语料仓用,会立刻遇到规模瓶颈;把语料仓当评测尺用,会立刻遇到「没有金标」的问题。

8.4 谁在用它,用来做什么

从官方给出的用途与配套论文的引用情形看,使用者集中在三类:做临床大模型评测的 NLP 组(把它当八类多标签基准)、做物质使用流行病学的公共卫生研究者(用它估计抽取误差的量级)、做成瘾医学信息学的临床团队(用它做决策辅助原型的可行性验证)。第三类最少,也最需要谨慎——官方在伦理一节把用途限定在研究、监测与人群层面,配套论文也强调需人工复核。

§9 使用指引

9.1 三种角色的路径

角色 第一天 第一周 注意事项
NLP 研究者 申请凭证,读官方数据描述,跑通 §5.3 的形状核对 用官方划分跑零样本与微调,逐类报告分数 别改划分,改了无法与论文对照
公共卫生研究者 读官方局限一节,确认时间覆盖是否符合研究期 用它估计抽取误差,设计人工复核抽样 时间上限 2019,芬太尼少见
临床信息学工程师 装 drugdetector,跑通零样本推理 在医院数据上做小样本试评,量化与本地病历的差距 结果需人工复核,不可直接上线

9.2 一条最短的可用流程

#-- 1. 完成前置:注册 PhysioNet、做 CITI 培训、签署 DUA,然后登录
physionet login

#-- 2. 下载数据集到当前目录
physionet download mimic-ext-drug-detection

#-- 3. 装推理封装(可选,用于跑论文里的微调模型)
pip install drugdetector
import pandas as pd
from sklearn.metrics import f1_score

LABELS = ["heroin", "cocaine", "methamphetamine", "benzodiazepine",
          "rx_opioid_misuse", "cannabis", "injection_drug_use"]

#-- 逐类报告 F1,别只报宏平均
te = pd.read_csv("test.csv")
y_true = te[LABELS].to_numpy(dtype="int8")
y_pred = <你的模型在 te["text"] 上的输出>

for i, c in enumerate(LABELS):
    print(f"{c:>20s}  F1={f1_score(y_true[:, i], y_pred[:, i], zero_division=0):.3f}")

这段里刻意把 general_drug_use 排除在评测之外:它是派生列,与前七列不独立,把它算进宏平均会把整体分数抬高。想评测「有无任何药物提及」这一件事,单独报一列即可,不要与七列混在一起算平均。

9.3 引用方式

引用对象 内容
数据集 Harel-Canada, F., Peng, N., Goodman, D., Romero, R., Nguyen, A., Moghanian, B., & Salimian, A. (2025). MIMIC-Ext-DrugDetection (version 1.0.0). PhysioNet. https://doi.org/10.13026/0kyx-r485
配套论文 Harel-Canada, F., 等. Enhancing substance use detection in clinical notes with large language models. 预印本 doi:10.21203/rs.3.rs-6615981/v1,后正式发表于同行评议期刊
平台 PhysioNet 平台综述论文,按官方页面的 Cite 按钮生成
上游数据 MIMIC-III Clinical Database v1.4 与 MIMIC-IV v3.0,官方列为父项目,须同时引用

写论文时建议同时注明:使用的版本号(1.0.0)、引用的是发布规模还是切句规模、划分是否沿用官方划分、以及 general_drug_use 是否被纳入评测。这四项任一缺失,别人就无法判断你的数字能不能与论文对照。

§10 AI 使用声明

项目 声明
文本生成 本文由 AI 辅助撰写,编辑把关结构与事实
数字来源 规模、结构、边界三类数字来自 PhysioNet 官方项目页的摘要、方法、数据描述与使用说明各节
文件核验 项目页与版本页经直接访问确认;文件目录在核验者所在地区返回不可用,文件名与目录层级未核验
规模口径不一致 官方同时给出 274,602 句与 8,053 句两个数量级,未逐字说明关系,已在 §1.2、§7.3、§9.3 分头标注
论文信息 仅读到预印本与正式版的摘要、亮点与数据可得性声明,未读全文与附录全文
未核验内容 CSV 文件的确切文件名与目录层级、关键词表全文、标注指南全文、句子文本的实际样例、各文档的句子数分布
图像 无配图;封面为生成式提示词,不含真实病历内容
免责 本文不构成临床建议;数据使用须遵守 PhysioNet 凭证健康数据许可 1.5.0 与数据使用协议

常见误读(避坑清单)

说法 实际 证据
「它有 27 万多条标注」 274,602 是切句后的语料规模,官方汇总统计合计为 8,053 句 官方「数据处理」与「汇总统计」两节
「训练和验证各占一半,测试很小」 约 10% / 10% / 80%,测试最大 官方划分说明与三行汇总统计
「八个标签是八种物质」 其中注射吸毒是给药途径,一般药物使用是派生列 官方列定义
「苯二氮卓类那一列表示用过苯二氮卓类」 官方定义限定为苯二氮卓类的非法使用 官方列定义
「可以像普通文本集那样按行随机划分」 同一病历切出多句,随机划分会泄漏 数据含 doc_id,官方指出切句来自长病历
「它能反映当前的阿片类流行」 时间上限 2019,官方明确说芬太尼少见 官方已知局限
「论文里 0.95 以上的 F1 是这个数据集的性质」 那是某个模型在某个划分上的成绩 官方使用说明的「已被如何使用」段
「拿它做预训练语料正合适」 8,053 句规模太小,模型一两轮就记全 官方划分规模
「拿到数据就拿到了病历全文」 只给句子与 doc_id,回看需回到 MIMIC 上游 官方字段列表只有三列标识与八列标签
「MIMIC-Ext 系列都是同一类数据」 mimic-ext-cxr-qba、mimic-ext-synnotes 与本数据集任务与模态不同 各自主页的任务描述
「列名里的 IDU 是一种药物」 是注射吸毒这一给药途径,与物质列正交 官方列定义

FAQ

Q1:到底有多少条数据?为什么两个数字差这么多?
官方页面给了两个数量级:切句后共 274,602 句、其中 3,948 句含药物提及;而 TRAIN、VALIDATION、TEST 三个划分合计 8,053 句。官方没有逐字说明两者的关系,从「3,948 恰好等于 Any 的合计数」这一点看,8,053 很可能是一份类别平衡后的发布子集。本文不把它当既定事实,只建议在引用时明确写清你用的是哪一个口径。

Q2:为什么测试集比训练集大这么多?
因为它主要被设计成评测集。配套论文要对比零样本、少样本与微调三种配置,微调只需要少量样本,而评测需要足够大的测试集才能让低频类别的分数稳定——甲基苯丙胺在 TEST 里只有 72 句,若测试集再小,这个类别的分数会被抽样噪声淹没。

Q3:八个标签能不能当成八个独立类别来训练?
不能。general_drug_use 按官方定义是派生列:其余七列任一为 1 时它为 1,此外非特异性提及也让它为 1。把它与前七列一起当平权类别,会让标签向量带上结构性冗余,宏平均分数也会被抬高。建议训练与评测只用前七列,把「有无任何药物提及」单独报。

Q4:injection_drug_use 和其他列冲突吗?
不冲突,它是另一个维度。注射吸毒描述的是给药途径,不是具体物质,所以「注射海洛因」会同时点亮 heroin 与 injection_drug_use。这是多标签设计的本意,用来捕捉并存的物质使用与行为方式。

Q5:可以用它做文档级或患者级的判断吗?
可以聚合,但要自己付代价。数据只给 doc_id 与 sentence_id,没有文档级金标,也没有患者标识。按 doc_id 取最大值是最常见的聚合方式,但它会放大偶然提及的影响,且否定与历史提及的判别在聚合后更难。论文里必须写清聚合规则。

Q6:划分该怎么分?
优先沿用官方划分,这样结果能与配套论文对照。若必须自己做划分(例如做交叉验证),请以 doc_id 为分组键,同一份病历的句子绝不出现在两侧,否则同文档的叙述风格会让结果虚高。

Q7:为什么访问这么麻烦?
因为它的上游是 MIMIC。官方在伦理一节说明:使用本数据集的人必须遵守 MIMIC 的许可条款,包括完成 CITI「Data or Specimens Only Research」培训并签署 PhysioNet 数据使用协议 1.5.0。这不是本数据集额外加的条件,是继承来的。

Q8:它能代表当下的药物使用格局吗?
不能。上游 MIMIC-III 覆盖 2001–2012、MIMIC-IV 覆盖 2008–2019,而这十几年正是阿片类流行从处方药转向合成阿片类的转折期。官方明确把芬太尼在本数据集中出现很少写进已知局限。用它推断近年格局会系统性偏旧。

Q9:配套的模型权重和代码要不要一起引用?
看用法。若只用了数据,引用数据集与平台即可;若用了 Llama-DrugDetector 权重或 drugdetector 包,应另行引用,并在方法部分写清模型版本与提示模板来源(论文附录)。数据集的成绩与模型的成绩是两件事,不要混写。

Q10:标注可信吗?
一致性层面可信度较高:官方给出 kappa 大于 0.80 作为进入单人标注的门槛,之后还有一轮全量复核。粒度层面要看任务:跨度标注被降维成句级标签,官方明确说切句可能丢失上下文。句级分类可以直接用,依赖句外上下文的判别需要回填后再做。

Q11:它的许可允许商业使用吗?
许可文本是 PhysioNet 凭证健康数据许可 1.5.0,是否允许商业用途以许可全文为准,官方页面未在使用说明里就商业使用作出明确表态。此外它继承 MIMIC 的数据使用协议,后者对再分发与去标识有额外要求。有商业计划的团队应先读许可全文与 DUA 条款。

Q12:它和 MIMIC-Ext 系列的其他数据集是一回事吗?
不是。命名前缀相同只说明共享 MIMIC 这一上游。mimic-ext-cxr-qba 面向胸片的问答式标注,mimic-ext-synnotes 是合成病历,本数据集是真实出院小结的句子级物质使用标注,三者在模态、任务与标注方式上都不重叠,不能互换使用。

术语表

术语 解释
多标签分类 一个实例可以同时属于多个类别,与单选的单标签相对
二值标签 取值为 0 或 1 的标签列,表示某属性有无
跨度标注 在文本中高亮连续片段并给出类别的标注方式
句子级标注 以句子为最小标注单位
文档级标注 以整份病历为标注单位
kappa 衡量多名标注员一致性的统计量,扣除偶然一致的成分
去标识 移除或替换可识别个人信息的过程
出院小结 患者出院时由医生撰写的诊疗过程总结
合并使用 同时使用多种物质,是物质使用任务中的难点
注射吸毒 通过注射途径使用毒品,属给药途径而非具体物质
处方阿片类滥用 非医疗目的或不按处方使用处方阿片类药物
苯二氮卓类 一类镇静催眠药物,合法处方与非法使用需区分
否定判别 判断文本中的提及是肯定还是否定
时序判别 判断提及属于当前、既往还是将来
上下文回填 按文档与句子序号找回目标句的邻近句
组划分 以分组键切分数据,保证同组不跨训练与测试
数据泄漏 训练与测试共享信息导致结果虚高
派生列 由其他列计算得到的列,与源列不独立
凭证访问 需签署协议并通过培训才能获取的数据访问模式
CITI 培训 美国常用的人体研究伦理与数据合规在线培训
数据使用协议 规定数据可怎么用、不可怎么用的法律文件
零样本 不提供示例,直接让模型完成任务
少样本 在提示中给出少量示例再让模型完成任务
F1 精确率与召回率的调和平均,类别不平衡时常用来评价
MIMIC 由 MIT 计算生理实验室维护的去标识重症与急诊数据库系列
PhysioNet 由 MIT 计算生理实验室维护的生物医学数据与软件平台

附录 A:核心数字核对表

项 值 出处 来源层级
全名 MIMIC-Ext-DrugDetection 官方项目页标题 官方页面
版本号 1.0.0 官方项目页版本行 官方页面
首次发布日期 2025 年 9 月 25 日 官方项目页 官方页面
最近改动 2025 年 9 月 25 日(仅一个版本) 官方版本列表 官方页面
版本 DOI 10.13026/0kyx-r485 官方引用块 官方页面
上游数据集 MIMIC-III v1.4、MIMIC-IV v3.0 官方父项目段 官方页面
上游时间覆盖 MIMIC-III 2001–2012,MIMIC-IV 2008–2019 官方方法段 官方页面
标注病历数 1,151 份 官方方法段 官方页面
标注员人数 5 名 官方方法段 官方页面
一致性门槛 kappa 大于 0.80 官方方法段 官方页面
切句后规模 274,602 句 官方数据处理段 官方页面
含药物提及句数 3,948 句 官方数据处理段 官方页面
TRAIN 规模 804 句 官方汇总统计 官方页面
VALIDATION 规模 806 句 官方汇总统计 官方页面
TEST 规模 6,443 句 官方汇总统计 官方页面
发布总规模 8,053 句 官方汇总统计合计 官方页面
划分比例 约 10% / 10% / 80% 官方数据处理段 官方页面
标签列数 8 个二值列 官方文件结构段 官方页面
标识列数 doc_id、sentence_id、text 三列 官方列定义 官方页面
Any / None 3,948 / 4,105 官方汇总统计合计行 官方页面
文件格式 CSV 官方文件结构段 官方页面
许可 PhysioNet Credentialed Health Data License 1.5.0 官方许可栏 官方页面
数据使用协议 PhysioNet Credentialed Health Data Use Agreement 1.5.0 官方访问栏 官方页面
前置培训 CITI Data or Specimens Only Research 官方访问栏 官方页面
配套模型 Llama-DrugDetector-8B 与 70B 官方使用说明 官方页面
论文 F1(多数单一物质) 0.95 以上 官方使用说明与论文摘要 论文摘要
论文 F1(处方阿片类滥用) 0.815 论文摘要 论文摘要
论文 F1(合并使用) 0.917 论文摘要 论文摘要

附录 B:数字的来源分层

第一层:官方项目页。 名称、版本、日期、DOI、上游数据集、标注病历数、标注员人数、一致性门槛、切句规模、三划分规模、八列标签定义、汇总统计、文件格式、许可与访问条件。这些来自项目主页的摘要、方法、数据描述与使用说明四节,是本文全部规模与结构数字的来源。

第二层:论文摘要与数据可得性声明。 微调模型在各类别上的 F1、三个互补资源的存在(模型权重、推理封装、附录模板)、以及「需凭证并遵守 DUA」的声明。摘要只能支撑「作者报告了什么」,不能支撑「换一份数据或换一个模型会怎样」。

第三层:未核验。 CSV 的确切文件名与目录层级(文件目录在核验者所在地区返回不可用)、关键词表全文、标注指南全文、句子文本的实际样例、每份文档切出多少句。这些需要凭证登录后逐一核对,本文凡涉及的地方都只做定性表述或明确标注为示意。

附录 C:完整参考文献

编号 文献 链接 用途
1 MIMIC-Ext-DrugDetection v1.0.0 https://physionet.org/content/mimic-ext-drug-detection/1.0.0/ 全部规模、结构、边界数据的来源
2 PhysioNet 项目总览页 https://physionet.org/content/mimic-ext-drug-detection/ 版本列表与发布说明
3 Enhancing substance use detection in clinical notes with large language models(预印本) https://doi.org/10.21203/rs.3.rs-6615981/v1 方法、标注流程、模型成绩
4 同上,正式发表版 https://www.sciencedirect.com/science/article/pii/S0376871625003412 摘要、亮点与数据可得性声明
5 drugdetector 代码仓库 https://github.com/fabriceyhc/drugdetector 零样本推理封装
6 Llama-DrugDetector 模型权重 https://huggingface.co/fabriceyhc/Llama-DrugDetector-70B 配套模型
7 PhysioNet 平台综述(Nature Health) https://doi.org/10.1038/s44360-026-00096-z 托管模式与引用规范
8 MIMIC-III Clinical Database v1.4 https://physionet.org/content/mimiciii/ 上游数据来源
9 MIMIC-IV v3.0 https://physionet.org/content/mimiciv/ 上游数据来源

附录 D:任务代码

任务一:按文档分组的多标签评测骨架

import pandas as pd
import numpy as np
from sklearn.metrics import f1_score, classification_report

LABELS = ["heroin", "cocaine", "methamphetamine", "benzodiazepine",
          "rx_opioid_misuse", "cannabis", "injection_drug_use"]

tr = pd.read_csv("train.csv", dtype={"doc_id": str})
te = pd.read_csv("test.csv", dtype={"doc_id": str})

#-- 确认分组键无交集:同一 doc_id 不应同时出现在训练与测试
overlap = set(tr["doc_id"]) & set(te["doc_id"])
print("文档交集数量:", len(overlap))

y_true = te[LABELS].to_numpy(dtype="int8")
y_pred = <你的模型输出,形状与 y_true 相同>

#-- 逐类报告,低频类别单独看
for i, c in enumerate(LABELS):
    print(f"{c:>20s} F1={f1_score(y_true[:, i], y_pred[:, i], zero_division=0):.3f}")

print(classification_report(y_true, y_pred, target_names=LABELS, zero_division=0))

任务二:合并使用子集的专项评测

import pandas as pd
from sklearn.metrics import f1_score

LABELS = ["heroin", "cocaine", "methamphetamine", "benzodiazepine",
          "rx_opioid_misuse", "cannabis", "injection_drug_use"]

te = pd.read_csv("test.csv")
row_sum = te[LABELS].sum(axis=1)

#-- 合并使用子集:一行同时点亮两类及以上
poly = row_sum >= 2
print("TEST 中合并使用的行数:", int(poly.sum()))

y_true = te.loc[poly, LABELS].to_numpy(dtype="int8")
y_pred = <你的模型在 te.loc[poly, "text"] 上的输出>

for i, c in enumerate(LABELS):
    print(f"{c:>20s} F1={f1_score(y_true[:, i], y_pred[:, i], zero_division=0):.3f}")

第二段代码把评测范围收窄到同时点亮两类及以上的行。这样得到的分数与普通 TEST 上的分数不是一回事,报告时必须标明子集口径——合并使用的判定依赖模型在同一句里同时认出多种物质,难度高于单类判定,分数偏低是预期内的。

附录 E:如果只记五件事

序号 记住什么 为什么
1 两个规模口径:274,602 句语料,8,053 句发布实例 引用时写错口径,实验设计与复现都会偏
2 划分是 10% / 10% / 80%,测试最大 它是评测尺,不是训练粮仓
3 八个标签不在同一层:物质、物质加限定、给药途径、派生 当八个平权类别用会得出错误结论
4 实例是句子,上下文要按 doc_id 与 sentence_id 回填 官方把上下文丢失写进已知局限
5 单一中心、时间上限 2019、芬太尼少见 外推到当下与其他机构都不成立

需要更高工程化程度或合规出域的商业版本?

当前展示的公开版本适用于学术研究与原型验证。千方医数集依托三甲医院直采网络,提供经专家标注、符合伦理合规的专病数据集交易服务。

前往商城查看可交易产品 →
返回 AI-Ready 数据集