信息速览

MTSamples — 医学转录文本基准语料 AI-Ready Wikipedia
INFOBOX
| 数据集名称 | MTSamples |
| 英文全称 | Medical Transcriptions(Kaggle 官方数据集名) |
| 别名/简称 | mtsamples.csv、MTSamples corpus、tboyle10/medicaltranscriptions |
| 疾病分类(ICD-11) | 不适用 — 全科室混合语料,覆盖 ICD-11 多个系统章节(映射见 §2.1) |
| SNOMED CT | 无官方术语映射;社区可映射至临床发现(404684003)与操作(71388002)顶层概念(见 §2.1b) |
| 数据模态 | 英文临床转录文本(纯文本) |
| AI 任务类型 | 医学科室文本多分类、关键词抽取、临床文本挖掘 |
| 样本总数 | 4,999 份转录报告(4,999 行 × 6 列) |
| 数据大小 | 17.01 MB(单个 CSV 文件 mtsamples.csv) |
| 数据格式 | CSV |
| 许可证 | CC0 1.0 公有领域贡献(Kaggle 发布页声明) |
| 访问级别 | 开放(Kaggle 账号即可直接下载,无申请与协议流程) |
| DUO 标签 | NRES(无限制使用) |
| 语言 | 英语 |
| 首发日期 | 2018 年(快照采集日期 2018-10-15) |
| 最后更新 | 无官方后续更新(Kaggle 更新频率标注为 Not specified,截至 2026-09) |
| 发布机构 | Tara Boyle(Kaggle 用户 tboyle10,独立发布者) |
| 官方主页 | Kaggle 数据集页 |
| 下载地址 | mtsamples.csv(17.01 MB) |
| AI 就绪度评分 | ⭐⭐⭐⭐(4/5)— 单文件 CSV 即读即用、社区基准与教程生态成熟;扣分项:无官方划分与预处理脚本,重复行、缺失值与极端类别不平衡需手动处理 |
| 页面状态 | published |
§0 E-E-A-T 信任声明与免责声明
医学审核者:千方病案医学编辑部交叉审核:§2 医学背景(40 个医学科室谱系与 ICD-11/SNOMED CT 映射、临床任务定义、金标准描述)、§7 偏倚分析。
数据工程审核者:千方病案医学编辑部交叉审核:§4 DAIMS 数据字典(6 字段结构、重复行与缺失值编码)、§5 数据划分策略、§6 预处理 Pipeline 和坑点。
审核日期:2026-09-05
审核方式:交叉审核
利益冲突声明:千方病案医数集与 Tara Boyle、MTHelpLine、mtsamples.com 及 Kaggle 无任何商业利益关联。本页面不销售 MTSamples 数据集本身,仅提供 AI 就绪指南与学术信息服务。编辑者未接受上述任何机构的资助。
医疗免责声明:本页面提供的医学信息仅供研究和教育目的,不构成医疗建议、诊断或治疗方案。数据集的医学描述基于公开发表的文献,未经逐一临床验证。任何基于该数据集训练的 AI 模型在应用于临床决策前,必须经过独立的临床验证和监管审批。
技术免责声明:本页面的代码示例、预处理建议和基准性能数据基于公开资料整理,不保证在特定环境下的准确性和适用性。使用者应自行验证代码安全性和数据预处理流程的正确性。千方病案医数集不对因使用本页面信息而导致的任何直接或间接损失承担责任。
数据使用合规:使用本页面描述的数据集前,请务必阅读并遵守数据集原始许可协议。MTSamples 在 Kaggle 以 CC0: Public Domain 许可发布,可自由使用与再分发;但其上游内容抓取自 mtsamples.com,该站点要求分享或分发报告时注明出处并链接回原站。DUO 标签仅供参考,具体使用限制以数据集官方协议为准。
§1 数据集概览
§1.0 30 秒速览
这是什么? MTSamples 是一个包含 4,999 份英文医学转录报告的文本数据集,于 2018 年由 Tara Boyle 从医学转录参考网站 mtsamples.com 抓取后发布在 Kaggle(数据集名 Medical Transcriptions,文件 mtsamples.csv,17.01 MB,Kaggle)。每份报告来自真实的临床工作场景——手术记录、会诊记录、出院小结、急诊报告等——由职业医学转录员根据医生口述整理成文,并已按网站政策对患者姓名、地点与日期做过脱敏改写。
为什么重要? 受 HIPAA 等隐私法规约束,真实临床文本几乎无法自由获取,而 MTSamples 以 CC0 公有领域许可开放下载,是几乎零门槛的临床文本语料:无申请、无协议、无凭证。它自带 40 个医学科室的弱标签与关键词字段,天然构成一个"根据转录文本判断科室"的多分类基准——Kaggle 官方给出的挑战题就是"你能否根据转录文本正确分类医学科室"。在无泄漏评测协议下,40 类任务的最优宏 F1 仅约 0.28(CLiGNet, arXiv:2603.22752),使其成为检验模型与方法真实水平的"打脸基准"。
我能用它做什么? 教学场景:练习 pandas 文本清洗、TF-IDF、BERT 微调、不平衡分类、防泄漏评测的完整流水线;科研场景:科室自动分类、关键词与实体抽取、长文本截断策略对比、SMOTE 类增强方法批判性研究;工程场景:检索增强、ICD-10 自动编码原型、embedding 评测。它不适合真实临床决策、流行病学推断或人口学公平性审计——原因见 §7。
§1.1 摘要
MTSamples 的构建流程是典型的"公开网页 → 机器学习语料"管线:源站 mtsamples.com 由 MTHelpLine 运营,向医学转录学生与从业者提供用户贡献的脱敏样例报告(官网);Tara Boyle 批量抓取并于 2018 年发布为 4,999 行 × 6 列的单张 CSV(X、description、medical_specialty、sample_name、transcription、keywords,USCbiostats 文档),快照采集日期为 2018-10-15。标签并非独立标注产出,而是转录报告在源站所属栏目(弱标签):Surgery 1,103 份(22.1%)独大,最小的 Hospice - Palliative Care 仅 6 份,不平衡比 181:1。语料的两个结构性坑——4,999 行中 transcription 仅 2,358 个唯一值(重复行)、keywords 列 21% 为 null——使得"直接跑模型"很容易得到虚高或误导的结果。社区已在 2026 年建立无泄漏基准:先过采样后划分的 SMOTE 方案属于数据泄漏,修正后 40 类任务没有任何方法超过宏 F1 0.30(CLiGNet)。
§1.2 战略价值
维度一:零门槛临床文本的"公共教育品"。 MIMIC 系列需 PhysioNet 凭证化申请与培训,i2b2/n2c2 任务数据需签署授权,而 MTSamples 只需一个 Kaggle 账号。对课程设计者而言,它是目前最接近"拿来即用"的临床文本:17.01 MB 单文件、6 列扁平结构、pandas 一行读入,学生可以把精力集中在建模与评测方法论,而非数据工程。CC0 许可进一步免除了教学材料再分发与竞赛搭建的许可摩擦。
维度二:方法论的"试金石"。 由于标签弱、噪声大、极度不平衡且充斥重复行,MTSamples 对分类方法的"真实难度"放大效应极强:在合并为 13 类时逻辑回归可达 79.5% 准确率,而完整 40 类无泄漏评测下最优宏 F1 仅 0.279(Vraj-Data-Scientist、CLiGNet)。它天然携带数据泄漏(先 SMOTE 后划分)、长文本截断(20.7% 笔记超 512 token)、稀有类塌缩等教科书级失败模式,是训练"评测直觉"的理想靶场。
维度三:大模型时代的临床文本"原型资产"。 在 LLM 时代,MTSamples 的角色从"训练集"转向三重身份:其一,少样本/评测素材——几千条脱敏临床文书是 prompt 工程与 in-context learning 实验的零风险原料;其二,检索库——作为 RAG 系统中"临床文书长什么样"的样例库,支撑编码员培训与系统演示;其三,合成数据的质量锚——生成式管线产出的"合成临床文书"可以用 MTSamples 的文体统计(节标题命中率、长度分布、缩写密度)做真实性校准。CC0 许可使这些新用法完全没有许可摩擦,这是 MIMIC 系列做不到的。
§1.3 同类数据集横向对比
| 数据集 | 规模 | 模态与语言 | 标注 | 获取门槛 | 与 MTSamples 的差异化 |
|---|---|---|---|---|---|
| MTSamples | 4,999 份报告 | 英文转录文本 | 40 类科室弱标签(无人工标注协议) | Kaggle 直接下载,CC0 | 零门槛、带弱标签与关键词,教学与基准双用途 |
| MIMIC-IV-Note | 百万级笔记 | 英文 EHR 出院小结与放射报告 | 无监督文本(可关联结构化 MIMIC-IV) | PhysioNet 凭证 + 培训 + DUA | 真实连续 EHR、规模大,但门槛高、不可再分发 |
| i2b2 / n2c2 挑战集 | 数百至千余份 | 英文临床笔记 | 任务驱动的人工精细标注(实体/关系) | 学术授权签署,按任务发布 | 标注质量高、任务定义严格,但规模小、版本分散 |
| PubMedQA 等文献问答集 | 十万级问答对 | 英文 biomedical 文献 | 自动构造 + 人工校验 | 开放下载 | 面向文献而非临床文书,无 PHI 风险 |
§1.4 版本时间轴
| 时间 | 版本/事件 | 说明 |
|---|---|---|
| 2018 年 | Kaggle 首发 | Tara Boyle 发布 Medical Transcriptions(4,999 行 × 6 列,CC0),更新频率标注 Not specified |
| 2018-10-15 | USCbiostats 快照记录 | 南加州大学生物统计团队在 data-science-data 仓库收录并文档化该数据集(40 类完整计数) |
| 2018-2026 | 社区镜像 | HuggingFace 出现 mteb/mtsamples(4,998 notes)与 galileo-ai/medical_transcription_40 等镜像,列名与行数存在细微差异 |
| 2026 年 | 无泄漏基准确立 | CLiGNet(arXiv:2603.22752)系统性记录 SMOTE 泄漏问题并发布 40 类防泄漏基准 |
§1.5 典型应用场景
- 临床 NLP 课程流水线教学:从 pandas 清洗到 Transformer 微调的全链路练习,社区教程(如 Labellerr)均以此数据集为例。
- 科室自动分类基准:40 类/13 类/20 类多档难度可自选,用于比较 TF-IDF 经典模型与 Bio_ClinicalBERT、Clinical-Longformer 等 Transformer。
- 关键词与实体抽取实验:keywords 列可作为弱监督NER 的伪金标,训练后抽取的临床术语可用于 ICD-10 编码原型(如 ayodeji21/clinical-nlp-api 项目)。
- 评测方法论研究:重复行泄漏、SMOTE 时序泄漏、长文本截断、稀有类评估——每个坑点都可复现为教学实验。
- R 包与工具链教学:clinspacy R 包直接内置该数据集示例,用于临床 NLP 工具链(clinspacy 文档)。
§2 医学背景
§2.1 ICD-11 编码映射
MTSamples 覆盖 40 个医学科室,属于"全科室混合语料",不存在单一 ICD-11 归属。下表给出代表科室与 ICD-11(MMS)对应章节的映射,供下游把预测科室对接到编码任务时参考:
| 数据集科室(medical_specialty) | ICD-11 章节 | 代表编码段 |
|---|---|---|
| Cardiovascular / Pulmonary | 第 11 章循环系统疾病;第 12 章呼吸系统疾病 | BA00-BE2Z;CA00-CB7Z |
| Neurology / Neurosurgery | 第 8 章神经系统疾病 | 8A00-8E7Z |
| Psychiatry / Psychology | 第 6 章精神、行为或神经发育障碍 | 6A00-6E8Z |
| Hematology - Oncology | 第 2 章肿瘤;第 3 章血液与免疫机制疾病 | 2A00-2F9Z;3A00 段 |
| Endocrinology / Diets and Nutritions | 第 4 章内分泌、营养或代谢疾病 | 5A00 段 |
| Gastroenterology | 第 13 章消化系统疾病 | DA00 段 |
| Orthopedic / Podiatry / Chiropractic | 第 14 章肌肉骨骼系统或结缔组织疾病 | FA00 段 |
| Nephrology / Urology / Obstetrics / Gynecology | 第 15 章泌尿生殖系统疾病及相关章节 | GB00-GC7Z |
| Surgery / Emergency Room Reports / Autopsy | 第 21 章症状体征与临床所见;第 22 章损伤中毒或外因 | M 码段;N 码段 |
| Sleep Medicine | 第 7 章睡眠-觉醒障碍 | 7A00 段 |
注:手术记录类文本描述的是操作而非疾病诊断,ICD-11 的 MMS 组件以疾病编码为主,操作需参考 ICD-11 相关扩展或各国操作分类;此表仅表达"报告内容所涉疾病谱"的章节级映射。
§2.1b SNOMED CT 映射
数据集未提供官方 SNOMED CT 映射。下表从内容本体层面给出报告类型与 SNOMED CT 顶层概念的对应,可支撑后续术语归一化:
| 数据集内容 | SNOMED CT 概念 | 概念编码 | 映射性质 |
|---|---|---|---|
| 转录报告全文(transcription) | Record artifact(记录工件) | 373942005 | 文档类型归属 |
| 报告中描述的症状、体征与诊断 | Clinical finding(临床发现) | 404684003 | 概念层级顶层 |
| 手术与操作描述 | Procedure(操作) | 71388002 | 概念层级顶层 |
| 具体疾病实体 | Disorder(疾病) | 64572001 | 概念层级顶层,需 NER 后逐实体映射 |
| medical_specialty 标签 | 无直接对应概念 | — | 建议映射到各临床专科的层级概念后再使用 |
§2.2 覆盖科室谱系与临床背景
医学转录(medical transcription)是把医生口述的诊疗过程转写为结构化文书的专业工种,其产物覆盖门诊与住院全流程:会诊(Consult - History and Phy.,516 份)、术前术后记录、出院小结(Discharge Summary,108 份)、病程记录(SOAP / Chart / Progress Notes,166 份)等。从科室谱系看,MTSamples 呈"外科独大、内科多元、辅助科室点缀"的形态:Surgery(1,103 份)与 Cardiovascular / Pulmonary(372 份)、Orthopedic(355 份)这类手术密集科室构成头部;Radiology(273 份)、General Medicine(259 份)、Gastroenterology(230 份)、Neurology(223 份)构成中部;而 Autopsy(8 份)、Lab Medicine - Pathology(8 份)、Allergy / Immunology(7 份)、Hospice - Palliative Care(6 份)等尾部科室样本极稀薄。这一形态与转录行业的服务结构一致——手术与影像是外包转录量最大的报告类型。对建模者而言,它同时是一个多科室疾病文本图谱:同一份 Surgery 报告里可能出现肿瘤、心血管、骨科等跨系统内容,这正是 §6.5 坑点 5 与坑点 7 的根源。
§2.3 临床任务定义
MTSamples 支撑的核心临床任务是医学科室自动分类(medical specialty classification):给定一份转录文本,判断其所属科室。该任务在真实场景中对应三类需求:其一,文档分诊与路由——电子病历系统把新文书自动转发给对应科室的编码员或审阅医生;其二,医疗编码辅助——科室是 ICD/操作编码的前置信号,可衔接自动编码流水线;其三,文档规范化质检——识别"标注与内容不符"的文书。次要任务包括关键词/实体抽取(keywords 列为弱监督信号)、报告摘要生成(description 列为短摘要监督)以及检索与相似病例匹配。注意:这些任务的"金标准"强度有限——科室标签来自源站栏目而非临床裁定,具体见 §2.6。
从编码管线的视角看,任务链路是"文本 → 科室 → 编码候选集":科室分类器把数千个编码候选压缩到十几个,再由编码模型/编码员在候选集内精排。MTSamples 恰好覆盖链路的第一环,且社区已有把它与 ICD-10 参照表拼接成完整原型的工程实践(ayodeji21/clinical-nlp-api)。
§2.4 报告来源人群
| 维度 | 情况 |
|---|---|
| 来源 | mtsamples.com 用户贡献的样例转录报告(由转录从业者与站点用户提供) |
| 时间范围 | 快照采集于 2018-10-15 之前;单份报告的原始日期未随数据发布 |
| 患者年龄/性别 | 未提供(网站政策已更改或移除姓名与日期,报告正文偶有年龄/性别描述但无结构化字段) |
| 种族/民族 | 未提供 |
| 就医类型 | 手术记录、会诊、出院小结、急诊报告、影像报告、病程记录等 40 类工作类型 |
| 机构/地域 | 未随数据发布;源站面向英语(主要为美国风格)转录从业者 |
按"工作类型"重排 40 类标签,可以看到转录行业的文书谱系(样本数为 2018-10-15 快照口径):
| 文书工作类型 | 代表类别(样本数) | 临床用途 |
|---|---|---|
| 术中型 | Surgery(1,103)、Orthopedic(355)、Cosmetic / Plastic Surgery(27)、Podiatry(47)、Neurosurgery(94) | 术前诊断、手术发现与术后医嘱的结构化记录 |
| 会诊评估型 | Consult - History and Phy.(516)、IME-QME-Work Comp etc.(16)、Pain Management(62) | 专科意见、独立医学鉴定与伤残评估 |
| 病程与转归型 | SOAP / Chart / Progress Notes(166)、Discharge Summary(108)、Hospice - Palliative Care(6) | 住院病程、出院小结与安宁疗护记录 |
| 检查报告型 | Radiology(273)、2-D 超声等影像所见、Lab Medicine - Pathology(8)、Autopsy(8) | 影像、检验与病理所见 |
| 门诊与杂项 | Office Notes(51)、Letters(23)、Speech - Language(9)、Diets and Nutritions(10) | 门诊记录、转诊信函与治疗计划 |
§2.5 临床与科研价值
临床侧,MTSamples 展示了真实临床文书的文体结构:大写节标题(SUBJECTIVE:、PREOPERATIVE DIAGNOSIS:)、缩写密度、口述残留(医生姓名占位)与分段习惯,是训练"读懂临床文书"的一切文本模型的起点语料。科研侧,它的价值不在"大",而在"难而透明":规模足够小,任何方法几分钟即可全量复现;噪声充分文档化(重复行、缺失、弱标签),社区已把失败模式写成论文(CLiGNet 的泄漏分析与混淆矩阵)。它常与 clinspacy 等 R/Python 工具链搭配作为临床 NLP 教学首选语料,也是检验"新文本分类技巧是否真实有效"的低成本试金石——在 40 类任务上,任何宣称的准确率提升都必须先回答"你去重了吗、先划分后增强了吗"。
§2.6 金标准与标签性质
| 属性 | MTSamples 的实际情况 |
|---|---|
| 划分 | 无官方 train/val/test 划分;社区惯例为 70/15/15 或 70/30 分层划分(见 §5) |
| 标注方式 | 弱监督:medical_specialty 取自转录报告在源站所属栏目,非独立标注任务产出 |
| 标注者 | 无独立标注者;栏目组织由源站维护,报告为用户贡献且站点声明"不保证完整无误" |
| 标签一致性 | 无标注协议、无标注者间一致性(IAA)指标;栏目与内容存在错位(如 SOAP/Chart/Progress Notes 为文体而非科室) |
| 性质 | 教学 + 基准双用途;不可作为临床真实分布的流行病学样本 |
§3 数据集规格
§3.0 版本抉择矩阵
数据集只有一个官方版本(Kaggle),但社区镜像存在行数与列名的细微差异。按下表选择入口:
| 你的需求 | 推荐版本 | 大小 | 理由 |
|---|---|---|---|
| 教学/基准复现,追求可引用 | Kaggle 官方版 tboyle10/medicaltranscriptions | 17.01 MB | 唯一官方源,4,999 行 × 6 列,所有论文口径的基准 |
| HuggingFace/Transformers 流水线 | 镜像 mteb/mtsamples | 约 17 MB | load_dataset 直读,注意行数为 4,998(少 1 行) |
| 预过滤类别(≥50 样本/类) | 镜像 galileo-ai/medical_transcription_40 | 较小 | 已按类别规模过滤(4,087 条),适合快速实验 |
| R 语言临床 NLP 教学 | clinspacy 内置 mtsamples 示例 | 内置 | 一行加载,与 quanteda/spacyr 生态集成 |
§3.1 模态详情
单一模态:英文自然语言文本。语体为医学转录文书——由职业转录员根据医生口述整理,具有高度程式化结构:大写节标题(HISTORY OF PRESENT ILLNESS:、PROCEDURE:、PREOPERATIVE DIAGNOSIS:)、逗号后接换行的分段标记、缩写词(pt、s/p、c/o)与测量值密集出现。文本长度差异极大:短至数百字符的影像所见,长至数千字符的手术记录;对 mteb/mtsamples 镜像的统计显示平均笔记长度约 1,024 字符,且 20.7% 的笔记超过 512 token(模型卡、数据分析)。无音频、影像或时序信号。
§3.2 按子集样本数
40 个 medical_specialty 类别完整分布(USCbiostats 于 2018-10-15 快照的精确计数,来源):
| # | medical_specialty | 样本数 | 占比 |
|---|---|---|---|
| 1 | Surgery | 1,103 | 22.1% |
| 2 | Consult - History and Phy. | 516 | 10.3% |
| 3 | Cardiovascular / Pulmonary | 372 | 7.4% |
| 4 | Orthopedic | 355 | 7.1% |
| 5 | Radiology | 273 | 5.5% |
| 6 | General Medicine | 259 | 5.2% |
| 7 | Gastroenterology | 230 | 4.6% |
| 8 | Neurology | 223 | 4.5% |
| 9 | SOAP / Chart / Progress Notes | 166 | 3.3% |
| 10 | Obstetrics / Gynecology | 160 | 3.2% |
| 11 | Urology | 158 | 3.2% |
| 12 | Discharge Summary | 108 | 2.2% |
| 13 | ENT - Otolaryngology | 98 | 2.0% |
| 14 | Neurosurgery | 94 | 1.9% |
| 15 | Hematology - Oncology | 90 | 1.8% |
| 16 | Ophthalmology | 83 | 1.7% |
| 17 | Nephrology | 81 | 1.6% |
| 18 | Emergency Room Reports | 75 | 1.5% |
| 19 | Pediatrics - Neonatal | 70 | 1.4% |
| 20 | Pain Management | 62 | 1.2% |
| 21 | Psychiatry / Psychology | 53 | 1.1% |
| 22 | Office Notes | 51 | 1.0% |
| 23 | Podiatry | 47 | 0.9% |
| 24 | Dermatology | 29 | 0.6% |
| 25 | Cosmetic / Plastic Surgery | 27 | 0.5% |
| 26 | Dentistry | 27 | 0.5% |
| 27 | Letters | 23 | 0.5% |
| 28 | Physical Medicine - Rehab | 21 | 0.4% |
| 29 | Sleep Medicine | 20 | 0.4% |
| 30 | Endocrinology | 19 | 0.4% |
| 31 | Bariatrics | 18 | 0.4% |
| 32 | IME-QME-Work Comp etc. | 16 | 0.3% |
| 33 | Chiropractic | 14 | 0.3% |
| 34 | Diets and Nutritions | 10 | 0.2% |
| 35 | Rheumatology | 10 | 0.2% |
| 36 | Speech - Language | 9 | 0.2% |
| 37 | Autopsy | 8 | 0.2% |
| 38 | Lab Medicine - Pathology | 8 | 0.2% |
| 39 | Allergy / Immunology | 7 | 0.1% |
| 40 | Hospice - Palliative Care | 6 | 0.1% |
Kaggle 页面给出的聚合口径一致:Surgery 22%、Consult - History and Phy. 10%、其余 68%(Kaggle)。清洗后(去重/去缺失)CLiGNet 报告的最大类 Surgery 为 1,088 条(21.9%)、最小类 Hospice - Palliative Care 6 条(0.12%),不平衡比 181:1(arXiv:2603.22752)。
§3.3 数据格式
| 属性 | 规格 |
|---|---|
| 文件 | mtsamples.csv(单文件,无压缩包结构) |
| 结构 | 扁平矩形表,4,999 行 × 6 列 |
| 编码 | UTF-8 文本,CSV 逗号分隔;转录正文含逗号、引号与换行符,需按 RFC 4180 引用规则解析(pandas 默认可正确处理) |
| 主键 | X 列(0 起始行号),无业务主键 |
| 标签 | medical_specialty 单标签(每行一个类别,40 选 1) |
| 缺失 | 空串/空字段表示缺失,无显式缺失编码 |
§3.4 存储大小
原始 mtsamples.csv 为 17.01 MB(Kaggle)。经 gzip 压缩后通常小于 5 MB;TF-IDF 稀疏矩阵与 BERT tokenized 缓存视词表与最大长度而定(max_length=512 时全量 token 化缓存约数百 MB),单机即可完成全部实验,无分布式需求。
§3.5 标注方式
弱监督(weak supervision)。medical_specialty 并非标注任务的产物,而是转录报告在源站 mtsamples.com 发布时归属的栏目名——可以理解为"以网页信息架构作为免费标签"。keywords 列同样是弱监督信号:源自报告页面的关键词字段,而非独立标注者产出。数据集不含任何人工双标注、仲裁或质量控制环节。
§3.6 标注者资质与一致性
不存在传统意义的"标注者"。栏目归类由源站维护方(MTHelpLine)在内容发布时完成;报告本身由用户(转录从业者)贡献,源站明确声明"样例报告仅供参考,MTHelpLine 不认证样例报告的准确性与质量"(免责声明)。因此无法计算标注者间一致性(IAA),也无法追溯每条标签的裁定过程;个别报告存在"文体而非科室"的栏目(如 SOAP / Chart / Progress Notes、Letters),使用前应做标签语义审查(见 §6.5 坑点 5)。
§3.7 采集周期
一次性快照抓取:USCbiostats 记录的采集日期为 2018-10-15(来源),Kaggle 页面更新频率标注为 Not specified,截至 2026-09 无官方后续版本。源站仍在持续新增样例——官网当前公布的科室计数(如 Surgery 1,105、Consult 520)与 2018 快照(1,103、516)已不一致,重新抓取将得到与公开基准不可比的新版本。
§3.8 地域覆盖
数据集未随附机构与地域元数据。源站面向英语医学转录社区,文书风格为美式英语(计量单位、缩写习惯、保险相关文书如 IME-QME-Work Comp 等),可推断以美国来源为主,但这是推断而非官方声明。跨地域(英式英语、非英语医疗体系)泛化风险见 §7.3。
§3.9 设备规格
不适用。纯文本数据集,无采集设备、影像参数或信号采样信息。转录工作的"输入设备"(医生口述录音)与转写过程均未随数据记录。
§3.10 深度溯源链
职业转录员(依据医生口述转写,站点政策:姓名/地点/日期已改写)
└─ mtsamples.com(MTHelpLine 运营的参考样例站,用户贡献,持续新增)
└─ Tara Boyle(Kaggle 用户 tboyle10)
└─ 批量抓取 → 4,999 行 × 6 列 CSV(快照 2018-10-15)
└─ Kaggle "Medical Transcriptions"(CC0,mtsamples.csv 17.01 MB)
├─ USCbiostats data-science-data(2018-10-15 收录与文档化)
├─ HuggingFace 镜像(mteb/mtsamples:4,998 行;galileo-ai/medical_transcription_40:4,087 条)
└─ 千方病案医数集本条目(结构化解读,未修改数据)
§4 数据结构
§4.0 目录树
官方发布为单 CSV 文件。以下为推荐的项目目录组织(与 §6.1/§6.2 代码一致):
mtsamples-project/
├── data/
│ ├── raw/
│ │ └── mtsamples.csv # Kaggle 原始文件,17.01 MB,勿修改
│ └── processed/
│ ├── mtsamples_dedup.csv # 去重后(见 §6.3)
│ ├── train.csv # 70%(分层,先去重再划分)
│ ├── val.csv # 15%
│ └── test.csv # 15%
├── src/
│ ├── preprocess.py # §6.3 预处理流水线
│ ├── dataset.py # §6.4 PyTorch Dataset
│ └── train.py
└── notebooks/
└── 01_eda.ipynb # 类别分布/重复行/长度分布探查
§4.1 DAIMS 字段字典
6 个字段的完整 8 列字典(AI 用途、观测误差与缺失编码是 DAIMS 评估核心):
| 字段 | 类型 | 说明 | 示例值 | AI 用途 | 观测误差/噪声 | 信息性缺失编码 | 取值范围 |
|---|---|---|---|---|---|---|---|
| X | Integer | 行号 ID,0 起始,与原发布一致 | 0, 1, 2 | 索引与溯源对齐 | 无(但非业务主键,存在内容重复行) | — | 0-4,998 |
| description | Text | 报告简短描述,1-2 句 | “Consult for laparoscopic gastric bypass.” | 短文本输入/摘要监督、弱标签样本名 | 长度不均,非结构化叙述,与 sample_name 语义重叠 | 缺失即为空,无编码 | 自由文本(约 2,348 个唯一值) |
| medical_specialty | Text | 报告所属科室(弱标签) | “Surgery”、“Cardiovascular / Pulmonary” | 分类任务标签(40 类) | 栏目归属错位(文体型栏目、跨系统手术) | 无缺失列 | 40 个枚举字符串,大小写/斜杠格式固定 |
| sample_name | Text | 报告短标题 | “Laparoscopic Gastric Bypass Consult - 2” | 辅助语义特征、检索键 | 与 description 高度相关 | 缺失即为空 | 自由文本(约 2,377 个唯一值) |
| transcription | Text | 转录正文,核心字段 | “SUBJECTIVE:, This 23-year-old white female…” | 主输入文本;NER/摘要/分类 | 含大写节标题、口述残留、机构/医生名残留(PII 风险) | 缺失即为空(少量行) | 自由文本(约 2,358 个唯一值) |
| keywords | Text | 逗号分隔的关键词串 | “bariatrics, laparoscopic gastric bypass, …” | 弱监督 NER 伪金标、特征拼接 | 非穷尽、非受控词表 | 缺失即为空(无显式编码,[null] 约 21%) | 自由文本关键词串 |
§4.2 标签分布
完整 40 类分布见 §3.2。三个刻画不平衡结构的统计量:最富类 Surgery 1,103 份(22.1%);前 9 类合计约 65%;尾部 10 类(Diets and Nutritions 至 Hospice - Palliative Care)合计仅 86 份(1.7%)。以最大/最小类之比计,不平衡度 1,103:6 ≈ 184:1(原始口径),清洗后 CLiGNet 报告为 181:1(arXiv:2603.22752)。这意味着 accuracy 是完全失真的指标——全预测 Surgery 即可得约 22% 准确率,而宏平均指标下尾部类的随机波动即可吞掉任何模型增益(见 §6.5 坑点 4)。
推荐在 EDA 阶段固定产出的分布诊断图(头部/中部/尾部三段式着色):
import matplotlib.pyplot as plt
counts = df["medical_specialty"].value_counts()
colors = ["#2563EB" if c >= 100 else "#D97706" if c >= 50 else "#DC2626"
for c in counts.values]
counts.plot.barh(figsize=(8, 12), color=colors, logx=True)
plt.xlabel("样本数(对数轴)")
plt.title("MTSamples 40 类科室分布(蓝=头部 橙=中部 红=尾部)")
plt.tight_layout()
plt.savefig("label_distribution.png", dpi=150)
§4.3 关键统计
| 统计项 | 数值 | 来源 |
|---|---|---|
| 行数 × 列数 | 4,999 × 6 | USCbiostats |
| 文件大小 | 17.01 MB | Kaggle |
| 类别数 | 40 | 同上 |
| transcription 唯一值 | 2,358(约 47.2% 行为重复内容) | Kaggle 数据页 unique 统计 |
| description / sample_name 唯一值 | 2,348 / 2,377 | 同上 |
| keywords 缺失 | [null] 21%,[empty] 2% | 同上 |
| 平均笔记长度 | 约 1,024 字符(mteb/mtsamples 镜像口径) | 数据分析 |
| 超 512 token 的笔记占比 | 20.7% | 模型卡 |
| 快照日期 | 2018-10-15 | USCbiostats |
一行代码复算 Kaggle 页的 unique 统计,建议作为每次加载后的固定体检:
print(df.shape) # (4999, 6)
print(df[["description", "sample_name", "transcription"]].nunique())
# 预期:2348 / 2377 / 2358;若明显偏离,说明拿到的不是官方 2018 快照
print((df["keywords"].isna()).mean().round(3)) # 预期约 0.21
§4.3b 转录文本形态解剖
转录正文是高度程式化的文书。以下为一行数据的 text 字段形态(内容取自数据集真实首行样例的节选,大写节标题与"逗号 + 换行"分段为转录体的两个标志性特征):
SUBJECTIVE:, This 23-year-old white female presents with complaint of
allergies. She used to have ... (正文以逗号+换行分段)
2-D M-MODE:,
1. Left atrial enlargement with left atrial diameter of 4.7 cm.,
2. Normal size right atrium., (测量值列表逐行编号)
PREOPERATIVE DIAGNOSIS:, Morbid obesity.,
POSTOPERATIVE DIAGNOSIS:, Morbid obesity.,
PROCEDURE:, ... (术式报告:术前/术后诊断/操作三段式)
对建模的直接影响:① 大写节标题(SUBJECTIVE:、PROCEDURE:)是最强的判别特征之一,清洗时务必保留;② "逗号 + 换行"是转写工具的产物而非标点错误,可安全替换为换行符;③ 报告中部可能残留医生/机构名(PII 风险,见 §7.7 第 24 项);④ 长报告的结论段在尾部,截断策略见坑点 3。
§4.4 数据层级
MTSamples 是扁平单表结构,不存在患者 → 住院 → 报告的多级层级:每行一份报告,无患者 ID、无就诊 ID、无时间戳。两点直接推论:其一,同一患者的多份报告(若有)无法被识别,重复内容行既可能是同患者多次转录,也可能是源站收录的相近样例;其二,任何依赖个体分组的划分策略(GroupKFold 按患者)在此不可行,防泄漏只能靠内容级去重(见 §5.3、§6.5 坑点 2)。
§4.5 缺失值与信息性缺失
| 字段 | 缺失情况 | 性质与处理建议 |
|---|---|---|
| keywords | [null] 约 21%,[empty] 约 2%(合计约 23%) | 网页侧本就无关键词;拼接特征时需fillna(“”),否则产生 NaN 传播(坑点 6) |
| transcription | 少量行缺失(社区教程普遍执行 dropna(subset=[‘transcription’])) | 网页正文缺失或抓取遗漏;标签任务中直接剔除 |
| description / sample_name | 缺失极少(无独立缺失统计,Kaggle 页未单列) | 空值可用 sample_name/description 互补填充 |
| medical_specialty | 无缺失(每行必有栏目) | — |
数据集不存在"信息性缺失"设计(如 MIMIC 中"未记录"本身承载临床语义的编码);所有缺失都是采集侧的偶然缺失,MCAR 假设基本成立,可放心删除或填充,无需缺失建模。
§5 数据划分与使用建议
§5.1 官方划分与社区惯例
数据集没有官方划分。社区已形成两档惯例:其一,全量 40 类任务下的 70/15/15 分层划分(3,476/745/745),由 CLiGNet 在无泄漏基准中采用(arXiv:2603.22752);其二,教程与研究项目中的 70/30 或 75/25 单次划分,且普遍把样本数过少的类别合并或丢弃(如合并为 13 类后 Logistic Regression 达 79.5% 准确率)。跨论文比较时必须先核对类别数与划分比例,否则数字不可比。
§5.2 划分策略建议
推荐流程(顺序不可交换):去重 → 分层划分 → 增强只作用于训练集。具体地:先按 transcription 规范化文本(小写、去空白差异)识别重复行并只保留一份;再以 medical_specialty 分层做 70/15/15 划分,固定 random_state 保证可复现;对尾部不足 2 个样本无法进入 val/test 的类别,要么合并入"Other",要么改用重复分层抽样并明确声明。直接在原始 4,999 行上划分会把同一文本同时送进训练与测试集,得到虚高指标。
§5.3 泄漏风险
本数据集存在两条独立的泄漏通道:
- 重复行泄漏:4,999 行中 transcription 仅 2,358 个唯一值(Kaggle 数据页),随机划分下大量"测试样本"是训练样本的逐字复制,模型只需记忆即可得分。
- 过采样时序泄漏:早期研究在 train/test 划分之前施加 SMOTE 过采样,合成样本由测试集样本插值而来,系统性抬高指标。CLiGNet 明确将此前文献的高性能归因于此方法学缺陷,并指出修正后"没有任何方法达到宏 F1 0.30"(arXiv:2603.22752)。
§5.4 交叉验证建议
尾部类别仅 6-10 个样本,单次划分的 val/test 指标方差极大,推荐 5 折分层交叉验证作为主要报告口径;每折内严格执行"先去重、再划分、后增强"。若需比较多个模型,使用重复分层 CV(如 5×2)并做 McNemar 显著性检验(CLiGNet 即采用该协议,arXiv:2603.22752)。按内容分组去重后,标准 StratifiedKFold 即可,无需 GroupKFold(数据无患者层级,见 §4.4)。
from sklearn.model_selection import cross_val_score, StratifiedKFold
from sklearn.pipeline import make_pipeline
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
model = make_pipeline(
TfidfVectorizer(max_features=15000, ngram_range=(1, 2)),
LogisticRegression(max_iter=2000, class_weight="balanced"),
)
scores = cross_val_score(model, df["transcription_clean"], df["label"],
cv=cv, scoring="f1_macro")
print(scores, scores.mean().round(4), scores.std().round(4))
# 逐折宏 F1 一并报告:尾类方差是本数据集评测噪声的主要来源
§5.5 外部验证建议
在 MTSamples 上训练的科室分类器若要进入真实场景,必须在真实 EHR 文书上做外部验证:候选外部语料为 MIMIC-IV-Note(PhysioNet 凭证获取,出院小结与放射报告)或机构内脱敏文书。外部验证时应预期三类退化——写作风格从"转录体"变为"直接输入体"、标签体系与 40 类栏目不同、时间跨度近十年。任何未做外部验证的"临床可用"表述都是不成立的(另见 §7.3、§7.8)。
§6 AI 就绪指南
§6.0 云端快速启动
数据集原生托管在 Kaggle,最快的启动方式是直接在 Kaggle Notebook 中挂载:新建 Notebook → 右侧 Input → 搜索 tboyle10/medicaltranscriptions → Add Input,随后 df = pd.read_csv('/kaggle/input/medicaltranscriptions/mtsamples.csv') 即可,无需下载与鉴权。若在 Google Colab,用下方 §6.2 的 kagglehub 代码(需 Kaggle API Token)。免费 CPU 环境即可完成全部经典 ML 实验;BERT 级实验需 GPU(T4 足够,见 §6.8)。
§6.1 快速上手
# 目录结构预期:
# data_root/
# └── mtsamples.csv # Kaggle 下载的原始文件(17.01 MB)
# data_root 与下方 DATA_ROOT 变量拼接;最小可用子集 = 全部 6 列中
# 只需 transcription + medical_specialty 两列即可跑通分类基线。
import pandas as pd
DATA_ROOT = "data/raw" # 按你的项目位置修改
df = pd.read_csv(f"{DATA_ROOT}/mtsamples.csv")
print(df.shape) # (4999, 6)
print(df["medical_specialty"].nunique()) # 40
print(df["medical_specialty"].value_counts().head()) # Surgery 1103 居首
# 最小可用子集:剔除 transcription 缺失行
mini = df.dropna(subset=["transcription"])[["transcription", "medical_specialty"]]
print(mini.shape) # 注意:此时仍未去重,见 §6.3 与坑点 2
§6.2 数据获取
| 项目 | 内容 |
|---|---|
| 官方入口 | Kaggle: Medical Transcriptions |
| 文件 | mtsamples.csv,17.01 MB,CC0: Public Domain |
| 获取流程 | Kaggle 账号 → 页面 Download(或 API/CLI),无申请、无协议 |
| 替代镜像 | HuggingFace mteb/mtsamples(4,998 行);galileo-ai/medical_transcription_40(4,087 条预过滤) |
# 方式一:kaggle CLI(需 kaggle.json API Token)
pip install kaggle
kaggle datasets download -d tboyle10/medicaltranscriptions -p data/raw
unzip data/raw/medicaltranscriptions.zip -d data/raw # 得到 mtsamples.csv
# 方式二:kagglehub(免手动 Token 配置,自动缓存)
pip install kagglehub
# 方式二(续):Python 内直接取回
import kagglehub
path = kagglehub.dataset_download("tboyle10/medicaltranscriptions")
print(path) # 缓存目录,内含 mtsamples.csv
# 方式三:HuggingFace 镜像(Transformers 流水线最顺)
from datasets import load_dataset
ds = load_dataset("mteb/mtsamples")["train"] # 注意行数为 4,998,与官方差 1
§6.3 预处理全流程
处理顺序固定为:去重 → 缺失 → 清洗 → 标签策略 → 划分。完整可运行流水线:
<details>
<summary><b>展开:mtsamples 预处理流水线(约 60 行)</b></summary>
import re
import pandas as pd
from sklearn.model_selection import train_test_split
RAW = f"{DATA_ROOT}/mtsamples.csv"
df = pd.read_csv(RAW)
# ---- 1. 去重(先于一切划分/增强,防内容级泄漏;见坑点 2)----
df["norm_text"] = (
df["transcription"].fillna("").str.lower()
.str.replace(r"\s+", " ", regex=True).str.strip()
)
df = df[df["norm_text"].str.len() > 0] # 顺带剔除空转录
df = df.drop_duplicates(subset=["norm_text"]) # 4,999 -> 约 2,300+ 行
df = df.drop(columns="norm_text")
# ---- 2. 缺失处理 ----
df["keywords"] = df["keywords"].fillna("") # 约 23% 缺失,见坑点 6
# ---- 3. 文本清洗(保守策略:保留医学符号与大小写节标题)----
def clean_text(t: str) -> str:
t = re.sub(r"\s*,\s*(?=\n|$)", "\n", t) # 转录体:逗号+换行的分段标记
t = re.sub(r"[ ]{2,}", " ", t) # 多余空格
return t.strip()
df["transcription_clean"] = df["transcription"].map(clean_text)
# ---- 4. 标签策略:合并样本数 <50 的尾部类为 Other(40 -> 21 类)----
vc = df["medical_specialty"].value_counts()
keep = vc[vc >= 50].index
df["label"] = df["medical_specialty"].where(df["medical_specialty"].isin(keep), "Other")
# ---- 5. 划分(分层,先于任何增强;见坑点 1)----
train, tmp = train_test_split(
df, test_size=0.30, stratify=df["label"], random_state=42)
val, test = train_test_split(
tmp, test_size=0.50, stratify=tmp["label"], random_state=42)
train.to_csv("data/processed/train.csv", index=False)
val.to_csv("data/processed/val.csv", index=False)
test.to_csv("data/processed/test.csv", index=False)
print(len(train), len(val), len(test))
</details>
要点:清洗刻意不做小写化与缩写展开之外的激进处理——大写节标题(SUBJECTIVE:)本身就是强特征;缩写展开词典需自建且逐条验证,错误展开比不展开更危险。
§6.4 PyTorch DataLoader
以 DistilBERT/Bio_ClinicalBERT 多分类为例的完整 Dataset 与 DataLoader(类别数、max_length 随你的标签策略调整;20.7% 笔记超 512 token,截断策略见坑点 3):
<details>
<summary><b>展开:PyTorch Dataset 与 DataLoader(约 55 行)</b></summary>
import pandas as pd
import torch
from torch.utils.data import Dataset, DataLoader
from transformers import AutoTokenizer
MODEL_NAME = "emilyalsentzer/Bio_ClinicalBERT" # 亦可 distilbert-base-uncased
MAX_LENGTH = 512
class MTSamplesDataset(Dataset):
"""读取 §6.3 产出的 train/val/test CSV。"""
def __init__(self, csv_path: str, tokenizer, label2id: dict,
max_length: int = MAX_LENGTH):
self.df = pd.read_csv(csv_path)
self.tok = tokenizer
self.label2id = label2id
self.max_length = max_length
def __len__(self):
return len(self.df)
def __getitem__(self, idx):
row = self.df.iloc[idx]
text = f"{row.get('sample_name', '')} [SEP] {row['transcription_clean']}"
enc = self.tok(
text,
truncation=True,
max_length=self.max_length,
padding="max_length",
return_tensors="pt",
)
label = self.label2id[row["label"]]
return {
"input_ids": enc["input_ids"].squeeze(0),
"attention_mask": enc["attention_mask"].squeeze(0),
"labels": torch.tensor(label, dtype=torch.long),
}
labels = sorted(pd.read_csv("data/processed/train.csv")["label"].unique())
label2id = {l: i for i, l in enumerate(labels)}
tok = AutoTokenizer.from_pretrained(MODEL_NAME)
train_ds = MTSamplesDataset("data/processed/train.csv", tok, label2id)
val_ds = MTSamplesDataset("data/processed/val.csv", tok, label2id)
train_loader = DataLoader(train_ds, batch_size=16, shuffle=True,
num_workers=2)
val_loader = DataLoader(val_ds, batch_size=32, shuffle=False,
num_workers=2)
# 训练时建议对尾类施加逆频率类权重(见坑点 4):
import collections
counts = collections.Counter(train_ds.df["label"])
weights = torch.tensor(
[len(train_ds) / counts[l] for l in labels], dtype=torch.float)
# criterion = torch.nn.CrossEntropyLoss(weight=weights)
</details>
§6.5 八大坑点
以下 8 个坑点全部来自该数据集的真实失败模式,均有文献或社区讨论支撑。
⚠️ 坑点 1:先 SMOTE 后划分——最流行的泄漏写法(分类:数据泄漏)
问题:大量早期研究在 train/test 划分之前对全量数据施加 SMOTE 过采样,合成样本由包含测试集样本的邻域插值而来,测试分布信息直接渗入训练集。CLiGNet 论文明确指出此前 MTSamples 分类文献普遍存在该缺陷,并证明这是"高性能"的主要来源。
症状:报告的准确率/宏 F1 远高于后续复现(40 类任务出现 0.5 以上甚至更高的宏 F1);"加了 SMOTE 大幅提升"的结论在换一批测试样本后消失;过采样比例越高指标越好看——这是泄漏的典型指纹。
解决:
- 简单方法:永远先划分、后增强——SMOTE 只在训练折上
fit_resample,测试集保持原始分布。- 进阶方法:用 imbalanced-learn 的
Pipeline把 SMOTE 绑进交叉验证,保证每一折内部独立执行:from imblearn.pipeline import Pipeline from imblearn.over_sampling import SMOTE from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.linear_model import LogisticRegression pipe = Pipeline([ ("tfidf", TfidfVectorizer(max_features=15000, ngram_range=(1, 2))), ("smote", SMOTE(k_neighbors=3, random_state=42)), ("clf", LogisticRegression(max_iter=2000, class_weight=None)), ]) # 在 cross_val_score / GridSearchCV 中使用,每折自动只对训练折重采样
- SOTA 方法:在 Transformer 上放弃 SMOTE,改用类加权损失或 focal loss 处理不平衡——CLiGNet 采用 focal binary cross-entropy 训练并对每类做 Platt 校准,在无泄漏协议下取得宏 F1 0.279。
参考:CLiGNet, arXiv:2603.22752(泄漏缺陷的系统记录);imbalanced-learn Pipeline 文档。
⚠️ 坑点 2:4,999 行里只有 2,358 份唯一文本——重复行跨集合泄漏(分类:数据泄漏)
问题:Kaggle 数据页 unique 统计显示 transcription 仅 2,358 个唯一值(description 2,348、sample_name 2,377),即超过一半的行与其他行内容相同或高度相近。随机划分下,测试集里会出现训练集的逐字副本,模型靠记忆即可得分。
症状:同一模型在"去重前后"指标差异巨大(社区 13 类实验 79.5% 与 40 类实验 46.1% 的巨大落差有一部分即源于此);宏 F1 远低于 accuracy;检查测试集时发现df_test.duplicated(subset=["transcription"])为 True 的行直接命中训练集。
解决:
- 简单方法:规范化文本后去重——
df.drop_duplicates(subset=df["transcription"].str.lower().str.replace(r"\s+", " ", regex=True))。- 进阶方法:两级去重:先精确规范化去重,再对近重复用 TF-IDF 余弦相似度(阈值 0.95)或 MinHash/LSH 聚类,同一簇内样本只允许进入同一个集合。
- SOTA 方法:建立"去重指纹 + 分组划分"的固定预处理产物(唯一文本 + 组 ID),所有实验从同一份去重产物出发,并同时在论文/模型卡中报告去重前后的两套指标以支持跨文献比较。
参考:Kaggle 数据页 unique 统计;datasketch MinHash LSH。
⚠️ 坑点 3:20.7% 的报告超过 512 token——BERT 截断把"结论"丢了(分类:预处理陷阱)
问题:约五分之一的转录文本超出常见 Transformer 的 512 token 上限。BERT 系默认从右侧截断,而转录文书的诊断结论、手术发现、签名段往往位于文档尾部——截断恰好删掉了信息量最大的部分。
症状:手术记录、出院小结等长文档类别的 recall 系统性偏低;调整 max_length 后指标大幅波动导致跨实验不可比;可视化显示长文本被截断样本的注意力集中在前段的模板化语句。
解决:
- 简单方法:head+tail 截断——保留前 448 token + 后 64 token,兼顾节标题开头与结论尾部。
def head_tail_truncate(token_ids, max_len=512, tail=64): if len(token_ids) <= max_len: return token_ids head = token_ids[: max_len - tail] return head + token_ids[-tail:]
- 进阶方法:滑动窗口分块(stride 128),对各块 [CLS] 表示做 mean/max pooling,或按块输出后做层次聚合。
- SOTA 方法:改用 Clinical-Longformer 直接编码 4,096 token——CLiGNet 的基线对比中 Clinical-Longformer(宏 F1 0.262)正是长文本场景最强的传统基线。
参考:20.7% 截断比例来源(模型卡);CLiGNet, arXiv:2603.22752。
⚠️ 坑点 4:181:1 不平衡下用 accuracy 评估——69% 准确率的模型其实是废的(分类:评估误用)
问题:Surgery 1,103 份 vs Hospice - Palliative Care 6 份,不平衡比约 181:1(清洗后口径)。accuracy 被头部类完全主导:一个把所有样本都预测成 Surgery 的"模型"即可拿到约 22% 准确率;而准确率 69% 的 DistilRoBERTa 宏 F1 只有 18.3%——说明它在 39 类中的大多数类上几乎全错。
症状:accuracy 与 macro-F1 严重背离;分类报告里尾部类 F1 全为 0;混淆矩阵呈"一条对角线 + 一条 Surgery 列"的形态;不同论文的数字因类别数不同(13/20/39/40 类)而毫无可比性。
解决:
- 简单方法:主指标改为宏平均 F1,同时输出 per-class classification report 与混淆矩阵;明确声明类别数与划分比例。
- 进阶方法:类加权交叉熵(逆频率权重,见 §6.4 代码注释)+ 5 折分层交叉验证降低尾类方差;对尾类合并策略(<50 样本并入 Other)做消融并公开标签映射表。
- SOTA 方法:focal loss 处理极端不平衡 + 每类 Platt scaling 概率校准(CLiGNet 校准后期望校准误差 ECE 0.007),把"排序性能"(macro-F1)与"概率可靠性"(ECE)分开报告。
参考:CLiGNet, arXiv:2603.22752;VinayJayadev/Clinical-Notes-Classifier(accuracy 69.27% vs 宏 F1 18.33% 案例)。
⚠️ 坑点 5:栏目 ≠ 科室——弱标签的语义错位(分类:标签理解)
问题:medical_specialty 不是临床标注,而是源站网页的栏目归属。多个"类别"实际是文体或用途而非医学科室:SOAP / Chart / Progress Notes(166 份)是病程记录文体,Letters(23 份)是信函,Office Notes(51 份)与 IME-QME-Work Comp etc.(16 份)是文书场景;而 Surgery 是"操作性质"而非器官系统,可与任何科室内容重叠。
症状:Consult - History and Phy. 与几乎所有科室文本词汇重叠,在合并 13 类的实验中宏 F1 仅 0.43-0.46,是稳定的最差类;模型在文体类与内容类之间随机摇摆;更换 random_state 后这些类的指标波动远大于其他类。
解决:
- 简单方法:实验前先做标签语义审查——把文体型栏目(SOAP、Letters、Office Notes、Discharge Summary、ER Reports 等)与疾病科室区分对待:或剔除、或单独归入"文书类型"轴。
- 进阶方法:显式建模标签间关系——用标签共现与语义相似度构建标签图,把"Consult"与各科室的边权重学习出来。
- SOTA 方法:CLiGNet 的标签交互图网络:以语义相似度 + ICD-10 章节先验构造 specialty label graph,用两层 GCN + 注意力门控融合,消融显示该组件带来 +0.066 宏 F1 的最大单项增益。
参考:CLiGNet, arXiv:2603.22752;Vraj-Data-Scientist(Consult 类 F1 0.46 案例)。
⚠️ 坑点 6:keywords 列 23% 缺失——拼接特征时 NaN 悄悄传播(分类:工程陷阱)
问题:keywords 列 [null] 约 21%、[empty] 约 2%,合计约四分之一的行没有关键词。把它与 transcription 拼接成联合特征列时,pandas 的 NaN 会传播到整行,导致训练样本静默减少或向量化器报错。
症状:TfidfVectorizer抛出 “empty vocabulary” 或 “np.nan is an invalid document”;df.shape在拼接后小于预期;用.dropna()应对后训练集无故缩水,且不同脚本的样本数对不上。
解决:
- 简单方法:读入后立即
df["keywords"] = df["keywords"].fillna(""),并断言df["keywords"].isna().sum() == 0。- 进阶方法:把 keywords 作为独立特征加权拼接而非直接字符串合并——
text = transcription + " " + keywords改为分别向量化后用FeatureUnion加权(文本 1.0、关键词 0.5),缺失时权重自动退化。- SOTA 方法:把 keywords 升级为弱监督 NER 的伪金标——训练抽取器从纯文本中预测关键词,用抽取结果替代原始字段,这正是不依赖原始缺失字段同时利用其信号的路线(ICD-10 编码原型项目即采用类似管线)。
参考:Kaggle 数据页缺失统计;ayodeji21/clinical-nlp-api(ETL 管线)。
⚠️ 坑点 7:相邻科室成块混淆——Cardiovascular / Pulmonary vs Consult(分类:标签理解)
问题:科室间语义边界天然模糊:Cardiovascular / Pulmonary(心血管/呼吸)与 Consult - History and Phy.(会诊病史)共享大量症状描述词汇;Surgery 报告横跨骨科、消化、妇产多个系统。CLiGNet 的失败分析确认了成对的科室混淆模式,混淆矩阵呈块状结构。
症状:误分类不是均匀分布而是集中在特定类别对;宏 F1 与 accuracy 差距大且提高总精度时这两个对的错误率几乎不动;Integrated Gradients 归因显示误分样本的高贡献 token 是共享的解剖与症状词汇(如 chest pain、echocardiogram)。
解决:
- 简单方法:把混淆矩阵作为固定诊断步骤,报告 top-10 混淆对及其误差贡献,让使用者知道"哪些边界不可靠"。
- 进阶方法:层次分类——第一级判断文书性质(手术/会诊/影像/病程),第二级在系统内细分科室;或者对混淆对做 pairwise 二分类器级联。
- SOTA 方法:标签图 + 图卷积直接建模混淆结构(同坑点 5 的 CLiGNet 方案),并在模型卡中披露逐对混淆分析。
参考:CLiGNet, arXiv:2603.22752(pairwise confusions 与 token 级归因)。
⚠️ 坑点 8:三套行数、两套列名——版本漂移毁掉复现性(分类:工程陷阱)
问题:Kaggle 官方 4,999 行、HuggingFace mteb/mtsamples 4,998 行、galileo-ai 预过滤镜像 4,087 条;同时列名跨版本有差异(如 medical_specialty 在部分镜像中改名为 specialty),且源站仍在持续新增样例——官网当前计数(Surgery 1,105)已与 2018 快照(1,103)不一致。
症状:复现他人结果时样本数对不上;加载社区代码报KeyError: 'medical_specialty';从官网重新抓取后得到与所有公开基准不可比的新数据集而不自知。
解决:
- 简单方法:锁定 Kaggle 官方 2018-10-15 快照作为唯一实验源,在实验记录中写明下载日期与文件 SHA256。
- 进阶方法:读入时做列名归一化(column map),任何来源的 CSV 先映射到统一 schema:
COLUMN_MAP = {"description": "description", "medical_specialty": "specialty", "sample_name": "sample_name", "transcription": "transcription", "keywords": "keywords"} df = df.rename(columns={c: COLUMN_MAP[c] for c in df.columns if c in COLUMN_MAP}) assert df.shape[1] >= 5, "列结构与预期不符,检查数据来源版本"
- SOTA 方法:用 DVC 或 lakeFS 管理数据版本,在 CI 中断言
shape == (4999, 6)、类别数 == 40、transcription唯一值数量级 == 2,358,任何漂移直接红灯。
参考:USCbiostats(2018-10-15 快照口径);ayodeji21/clinical-nlp-api extract.py(列名归一化实践)。
§6.6 数据增强
| 策略 | 安全性 | 说明 |
|---|---|---|
| 同义词替换(SynonymAug,WordNet/医学词表) | ✅ 安全 | 仅作用于训练集;社区实验将其用于平衡尾类(Vraj-Data-Scientist) |
| 回译(英→法→英) | ✅ 安全 | 注意保持计量值与药物名不变,需正则保护 |
| 类加权 / focal loss | ✅ 安全 | 严格意义上是损失重加权而非增强,尾类首选 |
| SMOTE(TF-IDF 空间) | ⚠️ 谨慎 | 仅在划分后的训练折内使用;稀疏高维下的合成样本可读性差,指标解释要保守 |
| 跨报告句子拼接生成"新样本" | ❌ 危险 | 破坏临床叙事一致性,制造自然界不存在的文书,污染评估 |
| 小写化去除大写节标题后增强 | ❌ 危险 | 大写节标题本身是强判别特征,抹掉后等效于随机破坏标签信号 |
| 对测试集做任何增强 | ❌ 危险 | 测试集必须保持原始分布 |
§6.7 模型推荐
| 模型 | 适用场景 | 关键配置 | 参考性能(口径见备注) |
|---|---|---|---|
| TF-IDF + Logistic Regression | 快速基线 / 课程演示 | 15,000 特征、1-2 gram | 13 类 accuracy 79.5%;40 类无泄漏宏 F1 0.173 |
| TF-IDF + SVM (线性) | 基线对照 | 同上 | 40 类无泄漏宏 F1 0.099 |
| DistilBERT | 低资源微调 / 教学演示 | 3 epoch、lr 2e-5、batch 16 | 20 类(≥50 样本/类)accuracy 0.4186、宏 F1 0.4407 |
| Bio_ClinicalBERT | 主力临床文本模型 | 512 token、类加权 | 40 类无泄漏宏 F1 0.211 |
| Clinical-Longformer | 长文本(>512 token 场景) | 4,096 token | 40 类无泄漏宏 F1 0.262 |
| CLiGNet(研究性) | 标签关系建模 / SOTA 对比 | Bio_ClinicalBERT + 标签图 GCN + focal loss | 40 类无泄漏宏 F1 0.279 |
备注:以上数字来自不同类别数(13/20/40)与不同清洗强度的协议,不可直接横向比较;40 类无泄漏数字均出自 CLiGNet 的统一基线框架。
§6.8 硬件需求
| 实验类型 | 硬件 | 预估耗时 |
|---|---|---|
| TF-IDF + 经典 ML 全量 CV | 笔记本 CPU(8 GB 内存) | 分钟级 |
| DistilBERT 微调(3 epoch) | 单张 T4(16 GB) | 约 3 分钟(模型卡实测 157 秒量级) |
| Bio_ClinicalBERT 512 token | 单张 T4/A10(16-24 GB) | 30 分钟内(batch 16) |
| Clinical-Longformer 4,096 token | A100 40 GB 或等效 | 1-2 小时(需梯度累积) |
§6.9 评估指标代码
from sklearn.metrics import (classification_report, f1_score,
confusion_matrix)
import numpy as np
# y_true / y_pred:测试集标签(整数编码),labels 为类别名列表
print(classification_report(y_true, y_pred, target_names=labels,
zero_division=0))
macro_f1 = f1_score(y_true, y_pred, average="macro")
weighted_f1 = f1_score(y_true, y_pred, average="weighted")
# 主报告口径(建议):macro-F1 + per-class F1 + top 混淆对
cm = confusion_matrix(y_true, y_pred)
np.fill_diagonal(cm, 0)
pairs = np.dstack(np.unravel_index(np.argsort(-cm, axis=None), cm.shape))[0]
for i, j in pairs[:10]:
print(f"{labels[i]} -> {labels[j]}: {cm[i, j]} 次误分")
报告规范:主指标宏 F1;同时给出 weighted F1 与 accuracy 作参考;声明类别数、划分比例、是否去重、是否过采样——缺任何一项,数字对他人即无意义。
§6.10 MLOps 笔记
- 数据版本锁定:以 Kaggle 2018-10-15 快照为唯一实验源,记录文件 SHA256 与下载日期;用 DVC 管理去重产物与划分文件(见坑点 8)。
- 质量断言进 CI:
shape == (4999, 6)、40 类、transcription 唯一值数量级、keywords 缺失率约 21%——四项断言防止镜像混入。 - 去重检查作为发布门禁:任何新模型的评测产物需附带"去重前后指标对比",防止重复行泄漏回流。
- 分布监控:上线后监控输入文本长度分布与预测科室分布;转录体文书与实时 EHR 文书的分布漂移显著(见 §7.6),漂移报警阈值应按科室分别设定。
- 模型卡纪律:明确声明"非临床用途、基于 2018 年转录样例语料、无人口学公平性评估可用"(参考 fairness auditor 模型卡的 limitations 写法)。
§7 质量评估与局限性
§7.1 已知偏倚
| 偏倚类型 | 描述 | 严重程度 | 缓解措施 |
|---|---|---|---|
| 科室分布偏倚 | Surgery 占 22.1%,尾部 10 类合计仅 1.7%,不平衡比约 181:1 | 高 | 宏 F1 主指标;类加权/ focal loss;尾类合并并披露映射 |
| 来源单一偏倚 | 全部来自单一转录样例站,用户贡献、非连续临床采集 | 高 | 外部验证(MIMIC-IV-Note/机构文书);不作流行病学推断 |
| 年代偏倚 | 快照 2018-10-15,文书风格反映转录行业惯例 | 中 | 注意术语与系统演化;避免直接部署到现代 EHR |
| 重复内容偏倚 | 4,999 行仅 2,358 个唯一 transcription | 高 | 规范化去重 + 近重聚类(坑点 2) |
| 弱标签偏倚 | 栏目归属≠临床裁定,文体型栏目与科室型栏目混用 | 高 | 标签语义审查;区分"文书类型"轴与"科室"轴(坑点 5) |
| 报告选择偏倚 | 样例站收录偏好"教学价值高/格式规整"的报告 | 中 | 明确用途为教学与基准,非真实分布采样 |
§7.2 标注质量
数据集无标注协议、无标注者资质体系、无标注者间一致性(IAA)度量。medical_specialty 来自源站栏目组织,keywords 来自页面关键词字段——两者都是"搭便车"的弱监督信号。源站明确声明不认证样例报告的准确性与质量(免责声明)。因此任何把 medical_specialty 当作高置信金标的做法都应避免;正确的姿势是把它当作"带噪估计",用去噪策略(标签图、置信学习)或协议化的小规模人工复核弥补。
§7.3 泛化性
| 目标场景 | 失效风险 | 证据/机制 |
|---|---|---|
| 现代 EHR 真实文书分类 | 高 | 转录体 vs 直接输入体的文体断层;2018 年后语音识别直接生成文书已改变行业 |
| 非美式医疗体系 | 高 | 编码习惯、缩写体系、保险文书(IME-QME-Work Comp)均为美式 |
| 自动编码(ICD/CPT)管线 | 中 | 科室标签可作前置信号,但正文 PII 残留与无结构化诊断字段限制直接落地 |
| 多语言临床 NLP | 极高 | 语料纯英语,无翻译对齐 |
| 患者级建模/纵向研究 | 不可行 | 无患者 ID 与时间戳(§4.4) |
§7.4 伦理
源站声明报告中的人名(患者、医生等)、地名与日期已更改或移除以保护隐私,任何雷同纯属巧合(免责声明)。数据以 CC0 发布,法律层面可自由使用。三点伦理注意:其一,正文可能残留机构与医生姓名(下游用户已报告此类发现,见 §7.7 第 24 项),再分发或发布模型前应执行 PHI 清洗;其二,数据源自患者诊疗文书的衍生物,虽已脱敏,仍应尊重"仅供教育与研究"的站点定位;其三,禁止任何临床决策用途——标签弱、年代老、无验证,误用的代价由患者承担。
§7.5 公平性
数据集不含患者人口学字段(年龄/性别/种族均无结构化信息),因此无法进行人口学分组的公平性审计——这不是"没有发现问题",而是"没有评估工具"。社区实践佐证了这一点:基于 MTSamples 的公平性审计演示项目只能转而审查文档长度等代理维度,并在模型卡中明确"无人口学信息,无法做 demographic fairness audit"(模型卡)。若你的项目需要公平性评估,请换用带人口学元数据的语料(如 MIMIC 系列)。
§7.6 数据漂移
两层漂移需要监控:内容漂移——2018 年后的临床文书由语音识别直接生成,段式、错字模式与转录体显著不同;在此语料上校准的长度、噪声与截断假设都会失效。标签漂移——40 类栏目体系是源站信息架构的产物,映射到现代科室/编码体系需要维护一张显式映射表并随目标系统演化。实测建议:上线系统按月监测输入文本的平均长度、大写节标题命中率与预测科室分布,三者任一漂移超阈值即触发复审。
最小漂移监控探针(按月对输入批次计算三项指标并与训练基线对比):
import re
import numpy as np
def drift_probe(texts: list[str], baseline: dict) -> dict:
lens = [len(t) for t in texts]
caps = [bool(re.search(r"^(SUBJECTIVE|PROCEDURE|IMPRESSION):", t, re.M))
for t in texts]
return {
"avg_len_ratio": float(np.mean(lens)) / baseline["avg_len"],
"section_header_hit": float(np.mean(caps)), # 转录体命中率
"pred_entropy_delta": None, # 结合模型输出计算
}
# baseline["avg_len"] 取训练集均值(约 1,024 字符口径);
# avg_len_ratio 持续 >1.5 或 section_header_hit <0.3 提示文体已偏离转录体。
§7.7 DAIMS 24 项评估
| # | 检查项 | 状态 | 说明 |
|---|---|---|---|
| 1 | 宽格式 | ✅ | 单表 6 列扁平结构,一行一报告,无跨表 join |
| 2 | 唯一标识 | ⚠️ | X 列为行号而非业务主键;内容级重复使行 ≠ 样本 |
| 3 | 特殊字符 | ⚠️ | 正文含逗号/引号/换行,需 RFC 4180 解析;节标题全大写为特征非噪声 |
| 4 | 重复行 | ❌ | 4,999 行中 transcription 唯一值仅 2,358(Kaggle 数据页),去重是强制前置步骤 |
| 5 | 缺失编码 | ⚠️ | 空串即缺失,无显式编码;keywords 缺失约 21%-23% |
| 6 | 标签标识 | ✅ | medical_specialty 单标签列,40 类枚举清晰可枚举 |
| 7 | 罕见类分组 | ❌ | 无官方分组方案;6-10 个样本的尾类需自行合并并披露映射 |
| 8 | 偏倚评估 | ⚠️ | 官方无偏倚文档;社区(CLiGNet)已系统记录不平衡与泄漏 |
| 9 | 数据字典 | ⚠️ | 官方无字典;USCbiostats 提供了社区版字段说明可替代 |
| 10 | 信息性缺失解释 | ⚠️ | 缺失无临床语义(MCAR),但官方未做任何解释性声明 |
| 11 | 设备记录 | ✅ | 纯文本模态,无设备参数依赖,不构成使用障碍 |
| 12 | 共线性 | ✅ | 文本特征天然稀疏;description/sample_name/keywords 与正文的信息重叠可在建模时显式处理 |
| 13 | 编码映射 | ❌ | 无 ICD-11/SNOMED CT 官方映射;本条目 §2 提供的章节级映射仅为起点 |
| 14 | 时间戳处理 | ⚠️ | 全表无时间字段;报告原始日期未随数据发布,时序分析不可行 |
| 15 | 划分建议 | ❌ | 无官方划分;社区惯例(70/15/15 分层)需自行实现 |
| 16 | 泄漏讨论 | ⚠️ | 官方无讨论;CLiGNet 已把 SMOTE 泄漏与重复行问题写成可引用的方法学文献 |
| 17 | 标签分布 | ✅ | 40 类完整计数公开(USCbiostats),分布文档化程度高 |
| 18 | 测量偏倚 | ⚠️ | 转录风格随口述医生与转录员变化,无元数据可量化该变异 |
| 19 | 外部验证建议 | ⚠️ | 社区有跨语料应用经验(教学工具、编码原型),但无系统化的外部验证协议文档 |
| 20 | 版本记录 | ❌ | Kaggle 无版本号、更新频率 Not specified;镜像行数 4,998/4,087 与官方不一致 |
| 21 | 预处理脚本 | ⚠️ | 官方无脚本;社区教程(Labellerr 等)可作参考但口径不一 |
| 22 | 合规要求 | ✅ | CC0 公有领域 + 源站署名要求,边界清晰、门槛为零 |
| 23 | 多模态对齐 | ✅ | 单模态文本,不存在跨模态对齐问题 |
| 24 | 去标识化 | ⚠️ | 官网声明姓名/地点/日期已改;但正文残留机构与医生名的报告存在,使用前建议 PHI 清洗 |
DAIMS 评分:13 / 24
评分解读:一般——结构简单、获取零门槛、标签分布透明是其长项;但重复行、无划分、无版本化、无术语映射四项结构性短板把它压在及格线附近,全部需要使用者自行补齐。
对你意味着什么:可放心把它当教学与基准语料:下载即用、CC0 无后顾之忧、40 类分布清清楚楚。但不能把它当免检数据:动手前必须完成四步——去重(第 4 项)、自建划分(第 15 项)、锁定快照版本(第 20 项)、尾类合并方案(第 7 项);若产出对外模型或数据集,补一次 PHI 清洗(第 24 项)。把这四步写进你的预处理脚本,MTSamples 就是一个诚实而锋利的练兵场;跳过它们,你得到的是不可信的指标。
§7.8 外部验证矩阵
截至 2026-09,尚未检索到严格经同行评审的跨机构外部验证研究以 MTSamples 为训练源并在独立临床语料上系统报告性能;现有最强的协议化证据为下述预印本基准:
| 外部数据集/场景 | 来源机构 | 评估任务 | 性能指标 | 相对内部变化 | 关键发现 |
|---|---|---|---|---|---|
| CLiGNet 无泄漏基准(arXiv 预印本,尚未经同行评审) | University of Maryland, Baltimore County;Jagannath University | 40 类科室分类(4,966 条清洗后记录,70/15/15) | 宏 F1 0.279 / accuracy 0.362 | 相比带 SMOTE 泄漏的早期报告大幅下降 | 修正泄漏后无任何方法宏 F1 超 0.30,早期文献的高性能主要源于方法学缺陷 |
实际部署前的外部验证建议路径:PhysioNet 申请 MIMIC-IV-Note → 将 40 类标签映射到目标体系 → 报告域内/域外性能差(另见 §5.5)。
§8 基准性能与生态
§8.1 排行榜
40 类无泄漏基准(统一协议:4,966 条清洗后记录、70/15/15 分层、去重;数据来自 CLiGNet, arXiv:2603.22752):
| 排名 | 模型 | 宏 F1 | 微 F1 | 准确率 | 年份 | 关键技术 | 完整引用 | 代码 |
|---|---|---|---|---|---|---|---|---|
| 1 | CLiGNet(无校准) | 0.279 | 0.362 | 0.362 | 2026 | Bio_ClinicalBERT + 标签图 GCN + focal loss | Barman, P. K., & Barman, P. (2026). CLiGNet: Clinical Label-Interaction Graph Network for Medical Specialty Classification from Clinical Transcriptions. arXiv:2603.22752. | GitHub |
| 2 | Clinical-Longformer + BR | 0.262 | 0.336 | 0.336 | 2026 | 4,096 token 长上下文 + binary relevance | 同上 | 同上 |
| 3 | CLiGNet(完整,Platt 校准) | 0.240 | 0.338 | 0.338 | 2026 | 逐标签 Platt scaling(ECE 0.007) | 同上 | 同上 |
| 4 | Bio_ClinicalBERT + OvR | 0.211 | 0.344 | 0.344 | 2026 | 临床预训练 BERT + one-vs-rest | 同上 | 同上 |
| 5 | TF-IDF + Logistic Regression | 0.173 | 0.105 | 0.105 | 2026 | 15k 特征 TF-IDF | 同上 | 同上 |
| 6 | BioBERT + OvR | 0.172 | 0.318 | 0.318 | 2026 | 生物医学预训练 BERT | 同上 | 同上 |
| 7 | TF-IDF + SVM | 0.099 | 0.152 | 0.152 | 2026 | 线性 SVM | 同上 | 同上 |
数值不可直接比较的原因:其他社区报告采用不同类别数(13 类 accuracy 79.5%、20 类 accuracy 0.4186、39 类 accuracy 69.27%/宏 F1 18.33%)、不同清洗强度与不同划分比例;macro-F1 对类别数极其敏感。比较任何两个数字前,先核对:类别数、去重与否、划分比例、是否划分后才过采样。
社区口径参照线(非统一协议,仅作难度感参照,禁止与上表排名混排):
| 口径 | 类别数 | 规模与清洗 | 代表结果 | 来源性质 |
|---|---|---|---|---|
| 合并低频类 | 13 | mtsamples.csv 全量,<50 样本类并入其他 | LR accuracy 79.5%、宏 F1 0.7837;BioBERT 76.1% | GitHub 项目(非同行评审) |
| 预过滤镜像 | 20 | ≥50 样本/类,4,087 条,70/15/15 | DistilBERT accuracy 0.4186、宏 F1 0.4407 | 模型卡(非同行评审) |
| 全量近原始 | 39 | 4,999 条,未系统去重 | DistilRoBERTa accuracy 69.27%、宏 F1 18.33% | GitHub 项目(非同行评审) |
三档口径的落差本身就是教学素材:类别数从 13 → 20 → 39/40,宏 F1 从 0.78 → 0.44 → 0.18-0.28——任务难度主要由"类别数 × 不平衡 × 重复行"决定,而非模型能力。
§8.2 SOTA 总结与选型建议
当前 40 类无泄漏 SOTA 为 CLiGNet(宏 F1 0.279),且"无方法超过 0.30"本身是该数据集最重要的结论——它宣告了在弱标签 + 重复行 + 极端不平衡下,40 类任务的公允难度。选型建议:快速基线选 TF-IDF + LR(分钟级、可解释);单卡生产原型选 Bio_ClinicalBERT;长文本占比高的场景选 Clinical-Longformer;研究创新(标签关系、校准)直接复用 CLiGNet 开源框架。若你的业务可以合并科室(13 类),先合并再做复杂建模——收益远大于换模型。
§8.3 评测协议
可复现评测的最小协议清单:① 规范化去重(报告唯一文本数);② 分层 70/15/15 或 5 折分层 CV,固定随机种子;③ 划分后才做增强/过采样;④ 主指标宏 F1,附 per-class 报告与 top 混淆对;⑤ 声明类别数、清洗规则与随机种子;⑥ 多模型比较做 McNemar 显著性检验(CLiGNet 协议)。满足这六条,你的数字才有被引用的价值。
# McNemar 显著性检验(模型 A vs 模型 B,同一测试集)
from statsmodels.stats.contingency_tables import mcnemar
# b:A 对 B 错;c:B 对 A 错(基于逐样本对/错布尔数组)
table = [[a_correct & b_correct, a_correct & ~b_correct],
[~a_correct & b_correct, ~a_correct & ~b_correct]]
result = mcnemar(table, exact=True)
print(f"statistic={result.statistic}, p={result.pvalue:.4f}")
# p < 0.05 才可声明两模型差异显著;本数据集尾类稀少,务必用 exact 版本
§8.4 相关数据集
| 数据集 | 关系 | 用途互补 |
|---|---|---|
| MIMIC-IV-Note(PhysioNet) | 规模更大、真实 EHR | 外部验证;真实文体迁移 |
| i2b2 / n2c2 系列任务集 | 人工精细标注 | 实体/关系级监督信号 |
| mteb/mtsamples(HF) | 同一数据集镜像 | Transformers 流水线直读 |
| galileo-ai/medical_transcription_40(HF) | 预过滤镜像(4,087 条) | 快速实验入口 |
§8.5 关键论文与资源 Top5
- Barman, P. K., & Barman, P. (2026). CLiGNet: Clinical Label-Interaction Graph Network for Medical Specialty Classification from Clinical Transcriptions. arXiv:2603.22752. —— 记录 SMOTE 泄漏缺陷并确立 40 类无泄漏基准与 SOTA。
- Boyle, T. (2018). Medical Transcriptions (MTSamples). Kaggle. —— 数据集本体发布(4,999 行 × 6 列,CC0)。
- USC Biostatistics (2018). data-science-data/00_mtsamples. GitHub. —— 40 类完整计数与字段文档化的社区权威口径(2018-10-15 快照)。
- ML4LHS (2024). clinspacy: Clinical NLP in R — mtsamples. —— 以 MTSamples 为内置示例的临床 NLP R 工具链教学入口。
- Labellerr (2024). Beginner’s Guide To Build NLP Models Using Medical Text Transcription. —— 传播最广的入门教程,示范 dropna 与 <50 样本类丢弃等常见(需警惕的)操作。
§8.6 社区活跃度
Kaggle 页面长期作为该数据集的唯一官方入口,教程类 Notebook 数量众多;GitHub 上围绕 mtsamples.csv 的分类/清洗项目持续出现(含 2024-2026 年的 Transformer 对比项目);HuggingFace 存在多个镜像与衍生模型卡;2026 年 CLiGNet 预印本把社区讨论提升为可引用的方法学文献。截至 2026-09,数据集本身无官方维护通道(Kaggle 更新频率 Not specified),问题反馈依赖 Kaggle 讨论。
§8.7 生态快照表
| 资源 | 类型 | 链接 | Star/规模 | 推荐理由 |
|---|---|---|---|---|
| USCbiostats/data-science-data | 文档仓库 | GitHub | — | 40 类完整计数、字段定义、快照日期的权威社区文档 |
| pronob29/CliGNet | 研究代码 | GitHub | — | 无泄漏基准复现、标签图组件、failure analysis 工具 |
| ML4LHS/clinspacy | R 包 | 文档 | — | R 生态一键加载 mtsamples,临床 NLP 工具链教学 |
| ayodeji21/clinical-nlp-api | HF Space 应用 | Space | — | MTSamples → ICD-10 编码的端到端原型,含 ETL 实践 |
| Vraj-Data-Scientist/medical-text-analysis-for-diagnosis-support | 项目仓库 | GitHub | — | 13 类合并策略 + SynonymAug 增强的完整对照实验 |
| srhill12/clinical-nlp-fairness-auditor | HF 模型卡 | 模型卡 | — | 负责任 AI 模板:20 类协议、512 截断与 limitations 写法范例 |
注:各仓库 Star 数波动频繁且未能可靠核实,截至 2026-09 以 “—” 标示,请点击链接查看实时数据。
§9 相关资源与引用
§9.1 官方资源
| 资源 | 说明 |
|---|---|
| Kaggle 数据集页 | 唯一官方发布入口:下载、许可(CC0)、字段说明与社区讨论 |
| mtsamples.com | 上游来源站点(MTHelpLine 运营),可查看样例报告的原始网页形态与持续更新的栏目计数 |
| 官网免责声明 | 脱敏政策、内容 “as is” 声明与使用条款的一手文本 |
| USCbiostats 文档 | 社区权威数据字典:6 字段定义与 40 类完整计数(2018-10-15 快照) |
§9.2 教程与社区
- Labellerr 入门教程:从读入到分类报告的完整 pandas + sklearn 流程(注意其 dropna 与丢类操作需配合 §6.5 坑点审视)。
- Vraj-Data-Scientist 分类项目:LR 与 BioBERT 双模型对照、SynonymAug 增强、13 类合并策略。
- srhill12 公平性审计模型卡:20 类协议与 limitations 写法范例。
- ayodeji21/clinical-nlp-api:MTSamples → ICD-10 端到端应用,含工程级 ETL 代码。
- clinspacy R 包:R 生态中以内置示例形式提供该数据集。
- CLiGNet 仓库:无泄漏基准与全部基线的复现代码。
§9.3 BibTeX 完整引用
@misc{boyle2018medicaltranscriptions,
author = {Tara Boyle},
title = {Medical Transcriptions ({MTSamples})},
year = {2018},
publisher = {Kaggle},
note = {CC0 1.0; snapshot collected 2018-10-15},
url = {https://www.kaggle.com/datasets/tboyle10/medicaltranscriptions}
}
@article{barman2026clignet,
author = {Barman, Pronob Kumar and Barman, Pronoy Kumar},
title = {{CLiGNet}: Clinical Label-Interaction Graph Network for
Medical Specialty Classification from Clinical Transcriptions},
journal = {arXiv preprint arXiv:2603.22752},
year = {2026}
}
@misc{uscbiostats2018mtsamples,
author = {{USC Biostatistics}},
title = {data-science-data: 00\_mtsamples documentation},
year = {2018},
howpublished = {GitHub repository},
url = {https://github.com/USCbiostats/data-science-data/tree/master/00_mtsamples}
}
@misc{ml4lhs2024clinspacy,
author = {{ML4LHS}},
title = {clinspacy: Clinical Natural Language Processing in {R}
(mtsamples reference)},
year = {2024},
url = {https://ml4lhs.github.io/clinspacy/reference/mtsamples.html}
}
@misc{labellerr2024medical,
author = {{Labellerr}},
title = {Beginner's Guide To Build {NLP} Models Using Medical
Text Transcription},
year = {2024},
url = {https://www.labellerr.com/blog/medical-text-transcription-classification/}
}
§9.4 引用指南
该数据集没有正式论文,学术写作中请引用上表第一项 boyle2018medicaltranscriptions(数据本体);若你的贡献涉及无泄漏评测协议或泄漏批判,应同时引用 barman2026clignet。40 类样本计数引用 USCbiostats 口径并注明快照日期 2018-10-15。工程与教学场景在模型卡或 README 中附 Kaggle 链接与 CC0 声明即可满足署名惯例;如同时再分发数据文件,建议按源站要求链接回 mtsamples.com。
§10 AI 使用声明卡
§10.1 AI 模型列表
| 模型 | 用途 |
|---|---|
| 大语言模型(本条目生产管线) | 资料检索整合、条目起草、表格与代码生成、格式规范化 |
§10.2 AI 参与范围
本条目由 AI 起草,参与范围包括:依据 §10.3 所列 14 个公开来源的事实整合与交叉核对;正文、表格、代码示例与 JSON-LD 结构化数据的撰写;按千方病案医数集规范进行的结构与排版处理。所有规模数字、基准成绩与引用均直接取自所列来源,未做超出来源的推算;检索与核对记录见同目录 FACTS.md。人工审核范围与结论见 §10.4。
§10.3 输入来源列表
- Boyle, T. (2018). Medical Transcriptions. Kaggle. https://www.kaggle.com/datasets/tboyle10/medicaltranscriptions
- USC Biostatistics (2018). data-science-data/00_mtsamples. GitHub. https://github.com/USCbiostats/data-science-data/tree/master/00_mtsamples
- MTHelpLine. Welcome to MTSamples. https://www.mtsamples.com
- MTHelpLine. Disclaimer. http://mtsamples.com/site/pages/disclaimer.asp
- Barman, P. K., & Barman, P. (2026). CLiGNet: Clinical Label-Interaction Graph Network for Medical Specialty Classification from Clinical Transcriptions. arXiv:2603.22752. https://arxiv.org/html/2603.22752v1
- ChatPaper (2026). CLiGNet 论文解读(实验数据表). https://chatpaper.com/zh-CN/paper/256248
- Vraj-Data-Scientist (2024). Medical Text Analysis for Diagnosis Support. GitHub. https://github.com/Vraj-Data-Scientist/medical-text-analysis-for-diagnosis-support
- Hill, S. (2026). Clinical NLP Fairness Auditor — DistilBERT Medical Specialty Classifier(模型卡). https://huggingface.erdda.com/srhill12/clinical-nlp-fairness-auditor
- Jayadev, V. (2024). Clinical Note Classification — Complete Results & Analysis. GitHub. http://ghub.com/VinayJayadev/Clinical-Notes-Classifier
- AIOps Insights (2025). Data Profiling & Pipeline Design for Healthcare Triage, Part 2. https://aiops-insights.com/end-to-end-eng/ai-engineering/llmops-healthcare-triage/part2-data-profiling
- Labellerr (2024). Beginner’s Guide To Build NLP Models Using Medical Text Transcription. https://www.labellerr.com/blog/medical-text-transcription-classification/
- ML4LHS (2024). clinspacy — mtsamples reference. https://ml4lhs.github.io/clinspacy/reference/mtsamples.html
- Ayodeji (2025). clinical-nlp-api — src/etl/extract.py. HuggingFace Space. https://huggingface.co/spaces/ayodeji21/clinical-nlp-api/blob/main/src/etl/extract.py
- MTHelpLine. Transcribed Medical Transcription Sample Reports and Examples(镜像站 sitemap,栏目计数). http://medicaltranscriptionsamples.com/sitemap/
§10.4 人工校验表
| 内容模块 | 审核者 | 审核方式 | 审核状态 |
|---|---|---|---|
| §1 概览(规模数字与定位) | 千方病案医学编辑部 | 与 Kaggle 页、USCbiostats 文档逐项对照 | ✅ 已验证 |
| §2 医学背景(ICD-11/SNOMED 映射) | 千方病案医学编辑部(医学编辑) | ICD-11/SNOMED CT 公开体系核对,标注为章节级近似 | ✅ 已通过 |
| §3-§4 规格、分布与字段字典 | 千方病案医学编辑部(数据工程) | 40 类计数与唯一值/缺失统计对照来源复核 | ✅ 已验证 |
| §5-§6 划分策略、代码与 8 坑点 | 千方病案医学编辑部(数据工程) | 代码逻辑走查;坑点逐条溯源至文献/仓库 | ✅ 已通过 |
| §7 DAIMS 24 项与偏倚分析 | 千方病案医学编辑部 | 逐项对照证据链打分 | ✅ 已验证 |
| §8 基准与生态 | 千方病案医学编辑部 | 排行榜数字对照 CLiGNet 论文表 | ✅ 已通过 |
| §9-§10 引用与声明卡 | 千方病案医学编辑部 | 14 条来源逐条可达性核对 | ✅ 已验证 |
§10.5 AI 生成章节标注
除 §0 免责声明为编辑部固定模板文本外,本条目 §1-§10 与 §C 结构化数据均由大语言模型基于 §10.3 来源起草,经 §10.4 所列人工交叉审核后发布;未使用 AI 生成临床结论或医学建议。
§10.6 最后人工审核日期
2026-09-05(与 §0 审核日期一致)
页面状态:published(全部内容已完成审核并发布)
§C 结构化数据(JSON-LD)
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- meddialog — 共享标签:医疗NLP / 临床文本 / 医学问答
- hgnc — 共享标签:基因组学与多组学 / 医疗NLP
- clicr — 共享标签:医疗NLP / 临床文本 / 医学问答
- medcalc-bench — 共享标签:医疗NLP / 临床文本 / 医学问答
- mimic-iv-ext-pe — 共享标签:医疗NLP / 临床文本
- rad-coreference-resolution — 共享标签:医疗NLP / 临床文本
- radgraph2-radiology-reports — 共享标签:医疗NLP / 临床文本
- ehrsql — 共享标签:医疗NLP / 临床文本 / 医学问答
- apollocorpus — 共享标签:医疗NLP / 临床文本 / 医学问答
- geo — 共享标签:基因组学与多组学 / 转录组
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。
