CANTEMIST — 西语肿瘤临床文本 AI-Ready Wikipedia

1,301 份西语肿瘤临床病例,形态学实体与 ICD-O 编码专家金标准

来源 Barcelona Supercomputing Center (BSC) — Text Mining Unit (TeMU) url: https://temu.bsc.es/cantemist发布时间: 2026-09-18最后更新: 2026-09-25 阅读 22
CANTEMIST — 西语肿瘤临床文本 AI-Ready Wikipedia

信息速览

数据集名称CANTEMIST — 西语肿瘤临床文本 AI-Ready Wikipedia
数据类型1,301 份西语临床病例,501/500/300 官方划分,Brat + TSV 格式,17.2 MB 压缩包,CC BY 4.0 开放下载
规模1,301 例肿瘤临床病例(文档级去标识,未公开患者数)
接入方式Barcelona Supercomputing Center (BSC) — Text Mining Unit (TeMU) url: https://temu.bsc.es/cantemist
AI 就绪度

CANTEMIST — 西语肿瘤临床文本形态学抽取金标准 AI-Ready Wikipedia


INFOBOX

数据集名称 CANTEMIST Corpus
英文全称 CANcer TExt Mining Shared Task (CANTEMIST)
别名/简称 Cantemist、CANTEMIST-NER、CANTEMIST-NORM、CANTEMIST-CODING
疾病分类 肿瘤全疾病谱·形态学维度(ICD-11:2A00-2F9Z 恶性肿瘤类组;形态学分类以 ICD-O-3 / eCIE-O-3.1 为准,详见 §2.1)
SNOMED CT 55342001 Neoplasm / 44441009 Adenocarcinoma / 363346000 Malignant neoplastic disease(详见 §2.1b)
数据模态 临床文本(西班牙语自由文本肿瘤临床病例)
AI 任务类型 命名实体识别(NER)、概念规范化/实体链接(NORM)、文档级多标签临床编码(CODING)
样本总数 1,301 份标注临床病例(另含 4,932 份无标注背景文档);8,410 个规范化肿瘤编码
数据大小 17.2 MB(Zenodo ZIP 压缩包)
数据格式 Brat(.txt + .ann)、TSV(CODING)、CoNLL(Hugging Face 镜像)
许可证 CC BY 4.0
访问级别 开放(Zenodo 直接下载,无需注册)
DUO 标签 NRES(无限制使用,仅要求署名)
语言 西班牙语(es)
首发日期 2020(IberLEF 2020 共享任务同步发布)
最后更新 2020-06(标注指南 2020 年 6 月版;语料为单一版本)
发布机构 巴塞罗那超级计算中心(BSC)文本挖掘单元(TeMU)
官方主页 https://temu.bsc.es/cantemist
下载地址 https://zenodo.org/records/3773228
DOI 10.5281/zenodo.3773228(数据集)/ 10.5281/zenodo.3878178(标注指南)
引用次数 154+(Google Scholar,截至 2026-09)
AI 就绪度评分 ⭐⭐⭐⭐(4/5)— 官方划分完整、金标准公开、评测脚本开源;扣分项:需自行实现 Brat 解析与 BIO 转换、无官方预处理包、编码分布长尾
页面状态 published

§0 E-E-A-T 审核声明

  • 医学审核者:[千方病案医学编辑部] 交叉审核:§2 医学背景(ICD-O-3/eCIE-O-3.1 与 ICD-11/SNOMED CT 映射、肿瘤流行病学、金标准表)、§7 偏倚分析。
  • 数据工程审核者:[千方病案医学编辑部交叉审核] 医疗 AI 数据工程师,审核范围:§4 DAIMS 数据字典、§5 数据划分策略、§6 预处理 Pipeline 和坑点。
  • 审核日期:2026-09-05

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

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

数据使用合规:使用本页面描述的数据集前,请务必阅读并遵守数据集原始许可协议。CANTEMIST 以 CC BY 4.0 许可发布,Zenodo 直接下载、无需注册或签署协议,但再分发与成果发表须遵守署名条款并引用官方论文。DUO 标签仅供参考,具体使用限制以数据集官方协议为准。


§1 数据集概览

§1.0 30 秒速览

这是什么? CANTEMIST(CANcer TExt Mining Shared Task)是一个西班牙语肿瘤临床文本金标准语料库:1,301 份真实肿瘤临床病例报告,由临床专家逐句标注"肿瘤形态学提及"(如 adenocarcinoma、carcinoma epidermoide),并把每个提及映射到西班牙官方版 ICD-O-3 编码体系(eCIE-O-3.1)。它由巴塞罗那超级计算中心(BSC)为 IberLEF 2020 国际评测构建,是西语世界肿瘤 NLP 的基石数据集。

为什么重要? 癌症诊断高度依赖病理描述,而全球肿瘤文本挖掘的标注语料几乎全部是英文。CANTEMIST 是第一个面向西语肿瘤文本、由肿瘤专家人工标注并附带公开标注指南与一致性分析的社区评测语料——没有它,西语临床 NLP 只能依赖词典和规则。对中文团队而言,它还是跨语言临床 NER/编码研究的天然评测场。

我能用它做什么? 训练和评测三类模型:① 从西语临床文本中抽取肿瘤形态学提及(NER);② 将提及规范化为 ICD-O-3 编码(NORM);③ 直接为整份病例生成编码列表(文档级多标签分类/CODING)。它也可用于西语生物医学预训练语言模型(如 BETO)的领域微调与评测。

§1.1 技术摘要

CANTEMIST 由 BSC TeMU 在西班牙国家语言技术推进计划(Plan TL)资助下构建。团队首先收集并人工筛选 6,233 份西语肿瘤临床病例,其中 1,301 份进入标注流程:临床专家按公开指南(Zenodo,2020-06 版)使用 BRAT 工具标注 MORFOLOGIA_NEOPLASIA 实体,并为每个提及赋 eCIE-O-3.1 编码,全程执行一致性复查、码长校验(4-7 字符)、换行清洗等五步后标注质量控制。语料按文档随机划分为 501 训练 / 500 开发(dev1+dev2 各 250)/ 300 测试,另有 4,932 份无标注背景文档;1,301 份文档合计对应 8,410 个规范化编码。2020 年的 IberLEF 共享任务围绕三个子任务展开(NER / NORM / CODING),25 支队伍提交 131 个系统,最好成绩分别为 NER F1 0.870、NORM F1 0.825、CODING MAP 0.847。数据以 CC BY 4.0 在 Zenodo 开放。

一个标注样本长什么样? 以下取自官方数据卡公开示例(文档 cc_onco101):正文为 “El informe HP es compatible con adenocarcinoma moderadamente diferenciado que afecta a grasa peripancreática sobrepasando la serosa, infiltración perineural.”,其中加粗片段即形态学提及,Brat 标注形如:

T1	MORFOLOGIA_NEOPLASIA 694 735	adenocarcinoma moderadamente diferenciado
#1	AnnotatorNotes T1	8140/32

T1 行给出实体类型与字符偏移(694-735),#1 行把该提及规范化为 eCIE-O-3.1 码 8140/32——“8140”(腺癌)+ “/3”(恶性原发行为)+ “2”(中分化)。一条标注同时服务两类任务:NER 只用 T1 行,NORM/CODING 则依赖 #1 行的编码。

§1.2 战略价值

维度一:低资源临床语言的标杆资产。 临床 NLP 的标注成本极高(需要医学专家),西语作为全球第二大母语语言,其临床标注语料长期稀缺。CANTEMIST 以"共享任务 + 全套指南 + 评测脚本开源"的方式一次性补齐了数据、协议与基线三要素,使得任何团队都能在数小时内复现官方评测——这种"数据即基准"的打包模式后来被同一团队的 DisTEMIST 等任务沿用。

维度二:形态学编码这一独特任务切口。 与常见疾病实体标注不同,CANTEMIST 标注的是 ICD-O 形态学维度(组织学类型+行为),这是肿瘤登记、病理报告结构化的核心字段,也是英文世界(n2c2/i2b2 系列)同样稀缺的任务形态。文档级 CODING 子任务则把 NLP 与医院病案编码实务直接对接,是"文本 → 报销/登记编码"链条上少有的公开基准。

维度三:可复现的评测方法论资产。 指南、金标准、评测脚本、参赛代码四位一体公开,把"数据集"升级成了"可复现实验协议"。对方法研究者而言,CANTEMIST 是检验低资源临床 NER 假设(领域预训练收益、跨语言迁移损失、长尾编码策略)的标准试验台;对工程团队而言,它是把"论文数字"落到"自家流水线"之间的参照系。

§1.3 同类数据集横向对比

数据集 语言 规模 标注内容 任务 与 CANTEMIST 的差异化
CANTEMIST 西班牙语 1,301 份标注病例 / 8,410 码 肿瘤形态学提及 + ICD-O-3 码 NER / NORM / 文档编码 唯一的西语肿瘤形态学专家金标准
SPACCC 西班牙语 约 1,000 份临床病例 疾病、症状、药物等实体 NER 更早的西语临床语料,无编码映射;CANTEMIST 指南即从其形态学标注复查起步
CodiEsp 西班牙语 1,000 份临床病例 文档级 ICD-10-CM(诊断/程序) 多标签编码 / 可解释性 编码体系为 ICD-10 而非 ICD-O;与 CANTEMIST 同系列、TSV 格式兼容
DisTEMIST 西班牙语+多语 5,000+ 份临床病例 疾病实体 + SNOMED CT NER / NORM 同一团队后续任务,疾病维度而非形态学维度
n2c2 / i2b2 系列 英语 数百至数千份 疾病、药物、检查等 NER / 关系 英文临床 NLP 事实标准,无 ICD-O 形态学编码任务
MedMentions 英语 4,392 篇文献 生物医学概念 + UMLS 实体链接 生物医学文献而非临床病历,粒度更广

上表同类语料均为各自语言社区的临床 NLP 支柱资产;CANTEMIST 的独特性在于"形态学提及 + ICD-O 编码"的组合维度,这一组合在公开临床语料中较为罕见。

§1.4 版本时间轴

时间 事件 说明
2020 年上半年 共享任务启动,Zenodo 发布 gold standard 语料(record 3773228) train 501 / dev1 250 / dev2 250 / test 300 与 background 集
2020-06 标注指南定稿(GUÍAS MORFOLOGÍA NEOPLÁSICA,Zenodo record 3878178) 形态学标注 + CIEO-3 映射规则
2020-07-03 无标注 test 与 background 集发布,参赛者提交预测 仅对 300 份 test 评测
2020(赛后) test 金标准、Silver Standard 语料、参赛系统代码公开 评测在 IberLEF 2020(SEPLN 联办)进行
2020 Overview 论文发表于 CEUR Workshop Proceedings Vol-2664(pp. 303-323) 语料、指南、方法与结果的权威引用
2022 Hugging Face 上线多个镜像(bigbio、PlanTL-GOB-ES、IIC) CoNLL 等便捷格式;版权署名 SEDIA(2022)

§1.5 典型应用场景

  1. 肿瘤登记与病案编码自动化:将自由文本病理/病程记录自动转为 ICD-O-3 形态学码,服务癌症登记处与病案科。
  2. 西语生物医学语言模型评测:以 NER/NORM 子任务作为 BETO、XLM-R 等模型的领域能力探针。
  3. 跨语言临床 NER 研究:与英文 n2c2、中文 CCKS 临床任务对照,研究低资源语言的迁移与对齐。
  4. 病理报告结构化流水线的预训练:先在 4,932 份无标注背景文档或 Silver Standard 上做领域预训练,再金标准微调。
  5. 教学与实训:指南、评测脚本、参赛代码全部公开,是临床 NLP 课程的理想练习场。

§2 医学背景

§2.1 ICD-11 映射

CANTEMIST 的标签体系不是 ICD-11,而是肿瘤专用分类 ICD-O-3 的西班牙官方版 eCIE-O-3.1。ICD-O 的"形态学码"由 4 位组织学类型数字 + 斜杠后 1 位行为码构成(如 8140/3 = 腺癌,恶性,原发),有效范围 8000/0–9992/3。它与 ICD-11 的关系如下表(ICD-11 第 02 章为肿瘤章节):

CANTEMIST 标签维度 eCIE-O-3.1 码段示例 ICD-11(第 02 章)对应 说明
恶性形态学(行为位 /3) 8140/3(腺癌)、8070/3(鳞状细胞癌) 2A00-2F9Z 恶性肿瘤类组(按原发部位细分) ICD-11 按部位+行为组织条目,组织学类型仍由 ICD-O 体系承担
良性 /0、原位 /2、动态未定 /1 8000/0、8010/2 等 第 02 章良性肿瘤、原位肿瘤、动态未定肿瘤相应类组 行为位决定条目归属,是 ICD-O 的核心设计
转移性 /6、恶性未定原发或转移 /9 如 8010/6 并入恶性肿瘤条目(登记实务常归并 /3) 欧洲癌症登记规范(ECIS)即建议按 /3 上报
形态学未特指(兜底) 8000/3(恶性肿瘤 NOS) 恶性肿瘤未特指类目 形态学未知时记 8000 + 行为位,CANTEMIST 语料中同样出现
分化变体(eCIEO 附加位) 8140/32(腺癌,中分化) 分化程度在 ICD-O 中为独立字段,不改变 ICD-11 条目 eCIEO-3.1 码可含分化/修饰位(官方 QC 例码)

关键提醒:ICD-O 形态学码中斜杠后的数字是行为码(0 良性、1 动态未定、2 原位、3 恶性原发,另有 6 转移、9 不确定原发或转移),不是分化程度;分化程度(G1-G4)在 ICD-O 中是独立字段,而 eCIEO-3.1 码内可再附分化/修饰位(详见 §6.5 坑点 3)。

§2.1b SNOMED CT 映射

CANTEMIST 中的提及类别 eCIE-O-3.1 示例码 SNOMED CT 概念码 术语名
肿瘤(泛指提及) 8000/3 55342001 Neoplasm (morphologic abnormality)
腺癌 8140/3 44441009 Adenocarcinoma (morphologic abnormality)
鳞状细胞癌 8070/3 40864000 Squamous cell carcinoma (morphologic abnormality)
恶性肿瘤(疾病层) — 363346000 Malignant neoplastic disease (disorder)

注:种族与社会经济变量未随语料披露;如需公平性分析,请在自有数据上补充采集相应字段。

SNOMED CT 的"形态学异常"层级(morphologic abnormality)与 ICD-O 形态学码存在官方映射表,可在编码后处理中用于跨术语对齐;但 CANTEMIST 官方未发布逐标签的 SNOMED 映射文件,上表为类别级对照。

§2.2 疾病与任务背景简介

癌症是全球主要死因之一——2018 年全球约六分之一的死亡归因于癌症,而明确的癌症诊断主要依赖病理实验室对活检或手术标本的宏观/微观检查。病理描述以自由文本为主,措辞因临床语言习惯(句法、构词、拼写变异)高度多样;要把这些文本变成可用于大规模肿瘤分析与预后研究的结构化数据,就需要以 ICD-O 或 SNOMED CT 等受控术语进行抽取与编码。已知癌症超过 200 种,常见类型(肺、乳腺、结直肠)与大量罕见类型并存,这正是 CANTEMIST 选案时强调"常见+罕见肿瘤兼顾"的原因。在西班牙,病案编码遵循卫生部发布的 CIE-O 3.1 官方手册(eCIE-O-3.1,在线可查),这也是 CANTEMIST 编码标签的权威依据。

从 NLP 视角看,形态学描述的难点在于"提及 ≠ 疾病名":西语病理表述会把组织学类型、行为与分化程度连缀成长短不一的短语(如 “carcinoma epidermoide bien diferenciado”),且同一肿瘤在不同文档中可能以全称、缩写或泛指(“tumor”、“neoplasia”)出现。标注指南对此给出明确规则:无进一步组织学信息的泛指词归入 8000/3 一类 NOS 码,分化描述词并入提及 span。这决定了模型必须同时掌握两种能力——医学名词识别与临床描述短语边界判定;后者正是 CANTEMIST 区别于一般医学 NER 语料的核心训练价值。

§2.3 临床任务定义

任务环节 输入 输出 临床用途
形态学提及识别(NER) 西语临床病例全文(UTF-8) 提及字符偏移 + MORFOLOGIA_NEOPLASIA 标签 病理发现的结构化抽取
概念规范化(NORM) 提及 span eCIE-O-3.1 编码 与术语字典对齐,支撑检索与统计
文档级编码(CODING) 整份病例 按置信度排序的 ICD-O-3 码列表 肿瘤登记上报、病案编码、队列筛选
编码审计辅助 已编码记录 + 原文 疑似错码清单 编码质控与登记数据清洗
(延伸)诊断/分级理解 提及上下文 行为位、分化描述 预后建模的前置特征

§2.4 患者人群画像

维度 描述
来源 西班牙多中心肿瘤临床病例,由 BSC TeMU 人工筛选,内容贴近肿瘤电子病历
时间 采集周期未公开(文本已匿名化,日期信息被移除)
年龄 覆盖从儿童到老年的大多数年龄段
性别 覆盖所有性别
种族 未披露
就医类型 肿瘤专科临床病例(实体瘤、血液肿瘤、神经内分泌癌等,复杂度分层)
病例内容 症状、个人与家族史、现病史、体格检查、辅助检查(化验/影像/病理)、诊断、治疗(含化疗不良反应)、转归
肿瘤谱系 实体瘤、血液肿瘤、神经内分泌癌等,兼顾常见与罕见癌型

§2.5 临床价值

对医院而言,形态学编码是肿瘤登记、质控与临床试验筛查的入口字段;自动化抽取可把编码员从逐份阅读病理描述中解放出来。对研究而言,CANTEMIST 提供了"提及-编码"双层金标准,使形态学归一化错误可以被拆解为边界错误与编码错误分别归因——官方冠军系统的错误分析显示,span 完全匹配时编码正确率超过 93%,而仅部分重叠时骤降至约 35%,这一量化结论直接指导预处理与评测设计(详见 §6.5 坑点 7)。此外,8,410 个规范化编码构成的标签空间本身就是一份"西语肿瘤形态学用语 → ICD-O"对照资产,可供术语工程与编码审计复用。

§2.6 金标准结构总览

属性 内容
划分 train 501 / dev1 250 / dev2 250 / test 300;另 background 4,932 份(无标注)
标注方式 人工标注(BRAT 工具),实体类型单一:MORFOLOGIA_NEOPLASIA
标注者 肿瘤相关领域 PhD 临床专家;疑难表述由医学博士定期咨询;极复杂病例咨询大型大学医院病理 MD 专家
性质 Gold Standard(含公开指南、一致性分析与五步后标注 QC);另有 Silver Standard 弱监督版
标签体系 eCIE-O-3.1(西班牙官方 ICD-O-3),码长 4-7 字符
语言 西班牙语(es,西班牙本土临床用语)
许可 CC BY 4.0,Zenodo 开放下载

§3 数据集规格

§3.0 版本抉择矩阵

版本语义说明:CANTEMIST 语料本身为单一版本(2020 年随 IberLEF 共享任务定稿),不存在 v1/v2 演进;下表"版本"指的是发布渠道与格式变体的选择。所有渠道的标注内容一致,差异仅在封装格式与加载便利性。

你的需求 推荐版本 大小 理由
复现官方基准 / 发论文 Zenodo gold standard(record 3773228) 17.2 MB 唯一官方权威版本,Brat+TSV 原生格式,含 dev1/dev2 与 test 金标准
快速跑通 PyTorch/DataLoader Hugging Face PlanTL-GOB-ES/cantemist-ner 数 MB 已转 CoNLL/BIO 四列格式,省去 Brat 解析
资源引用友好(NER+NORM+CODING 三合一) Hugging Face bigbio/cantemist 16.46 MB bigbio schema 统一封装,任务字段对齐
领域预训练 / 远程监督 Zenodo Silver Standard 语料 + background 集 数十 MB(解压后) 无需人工金标准即可获得 6,233 份西语肿瘤文本

§3.1 模态详情

  • 文本类型:西班牙语自由文本肿瘤临床病例报告,UTF-8 编码,每份病例一个 .txt 文件,内容覆盖病史、检查、诊断、治疗与转归的完整临床叙事。
  • 语言特征:临床缩写密集(如 HP = histopatología)、西语重音字符(á é í ó ú ñ)、病理描述短语连缀(如 “adenocarcinoma moderadamente diferenciado que afecta a grasa peripancreática”)。
  • 标注形态:与文本平行的 .ann 文件(Brat 格式),承载提及 span 与编码;CODING 子任务另以 TSV 汇总文档级编码。
  • 匿名化形态:文本经去标识处理,日期、机构与个人标识被移除或泛化;这保证了合规性,也意味着任何依赖绝对时间的特征(入院-出院间隔、疗程节奏)都不可用。
  • 文档独立性:每份 .txt 即一份完整病例报告;官方未公开逐文档篇幅统计,按 Zenodo 包 17.2 MB / 6,233 份文档推算平均体量在 KB 级。

§3.2 子集样本数

子集 文档数 是否有标注 用途
train 501 ✅ 金标准 训练
dev1 250 ✅ 金标准 模型选择 / 早停
dev2 250 ✅ 金标准 第二开发集(官方分开提供)
test 300 ✅ 金标准(赛后公开) 官方唯一评测集
background 4,932 ❌ 无标注 预训练 / 无监督;当年需随 test 一并提交预测
合计收集 6,233 — —
规范化编码总数 8,410 个(1,301 份标注文档合计) — CODING/NORM 标签空间

§3.3 数据格式

格式 子任务 文件形态 说明
Brat NER / NORM .txt(原文)+ .ann(T 行实体 + # 行 AnnotatorNotes 编码) 官方原生格式;编码存于 AnnotatorNotes,如 #1 AnnotatorNotes T1 8140/3
TSV CODING filename \t code 沿用 CodiEsp 共享任务格式,每文档多行
CoNLL/BIO NER(镜像) 四列:词形 / 文件名 / 偏移 / IOB 标签 Hugging Face PlanTL-GOB-ES/cantemist-ner 提供
JSONL(自建) NER / NORM(§6.3 产物) 每行一个文档:doc_id / text / entities 本文预处理流水线的中间产物,便于随机访问

§3.4 存储大小

Zenodo gold standard ZIP 为 17.2 MB(md5 a219fcca9078f19490471c920a3b5816);Hugging Face bigbio 镜像约 16.46 MB。解压后含全部子集与子任务副本,建议预留 200 MB 磁盘;若纳入 background 文本做预训练语料,解压规模仍在数百 MB 量级,单机即可承载。

§3.5 标注方式

人工标注,流程为"指南驱动 + 工具辅助 + 多轮质检":临床专家按公开指南(Zenodo record 3878178)在 BRAT 中框选形态学提及并赋 CIEO-3 码;指南分三阶段建成——先复查 SPACCC 语料的形态学标注(沿用 Codiesp 形态学指南经验)形成零版,再在样本集上迭代标注直至质检满意,随后随标注推进持续修订。标注完成后执行五步后处理质控:① 一致性复查(全库检索所有标注并复核);② 码长检查(4-7 字符,如 7 字符码 8140/32);③ 移除提及尾部换行;④ 移除跨行提及;⑤ 校验提及首尾为字母数字或括号。

QC 步骤 内容 对使用者的意义
一致性复查 全库检索同类标注出现处,由临床专家复核是否补标 span 边界策略可放心对齐金标准
码长检查 所有码 4-7 字符(如 7 字符码 8140/32) 解析正则必须容纳 5-7 位变体
尾部换行清理 移除提及结尾的换行符 解析出的 span 文本不应以换行结尾
跨行提及剔除 内含换行的提及整体移除 可把"提及不跨行"写进解析器断言
首尾字符校验 首尾须为字母数字或括号 模型预测后处理的验收标准

§3.6 标注者资质与一致性

  • 一线标注者:肿瘤相关学科 PhD 科学家(临床专家)。
  • 咨询机制:一名医学博士定期接受疑难病理表述咨询,并随机抽查标注记录与标注者讨论修订。
  • 升级路径:极复杂病例的规范化由西班牙某大型大学医院的病理学 MD 专家完成。
  • 一致性:官方声明通过"精细指南 + 一致性分析(inter-annotation agreement)"保证质量,但未公开具体 IAA 数值——引用时请勿臆造。
  • 质量信号:官方评测成绩区间(NER F1 从 0.251 到 0.870 的稳定梯度)间接表明标签边界可学习、金标准整体一致;自行估计 IAA 时建议按文档分层抽样双标。

§3.7 采集周期

未公开。文本匿名化时移除了日期与机构信息,官方页面亦未披露原始病例的时间跨度;引用时只能写"2020 年发布",不能倒推采集年份。

§3.8 地域覆盖

西班牙(多中心)。语料为伊比利亚半岛西语临床用语,与拉美西语存在词汇与书写差异;跨地区部署前建议按 §7.3 泛化性表评估。

§3.9 设备规格

不适用。CANTEMIST 为纯文本语料,无影像设备、采样率等元数据;文本元信息仅保留文档 ID(cc_onco 系列)。

§3.10 深度溯源链

深度溯源链如下:

  1. 西班牙数字化与人工智能国务秘书处(SEDIA)设立 Plan TL 国家语言技术推进计划;
  2. Plan TL 资助巴塞罗那超级计算中心 TeMU 承担临床语料与评测基础设施建设;
  3. TeMU 从合作医院收集肿瘤临床病例,按多样性导向人工筛选(常见癌型 + 罕见癌型);
  4. 病例完成去标识化后进入标注流程;
  5. 临床专家按公开指南在 BRAT 中标注形态学提及并赋 eCIE-O-3.1 码;
  6. 一名医学博士定期咨询疑难表述并抽查记录,复杂病例升级至大学医院病理 MD 专家;
  7. 五步后标注质控通过后定稿;
  8. Zenodo 以 CC BY 4.0 发布 gold standard / silver standard / 指南三件套;
  9. Hugging Face 社区镜像(bigbio、PlanTL-GOB-ES、IIC)提供便捷格式二次分发。

§4 数据结构

§4.0 目录树

data_root/
├── cantemist/                        # 解压 cantemist.zip 得到
│   ├── train-set/                    # 501 份(Gold Standard)
│   │   ├── cantemist-ner/            #   *.txt + *.ann(含 AnnotatorNotes 编码)
│   │   └── cantemist-norm/           #   同文档的 NORM 副本(.ann 含码)
│   ├── dev1/                         # 250 份
│   ├── dev2/                         # 250 份
│   ├── test-set/                     # 300 份(赛后公开金标准)
│   ├── background-set/               # 4,932 份(仅 .txt,无标注)
│   ├── cantemist-coding/             # CODING 子任务
│   │   ├── train-set.tsv             #   filename \t code
│   │   ├── dev1.tsv
│   │   ├── dev2.tsv
│   │   └── test-set.tsv
│   └── cantemist-gs-coding.tsv       # 全量金标准编码汇总(评测库输入之一)
└── valid-codes.tsv                   # CODING 有效码白名单(评测库随附)

上述为按官方发布物归纳的典型组织;不同镜像包内目录命名可能略有差异,以 Zenodo cantemist.zip 解压结果为准。另注意:valid-codes.tsv 白名单与评测脚本位于官方 evaluation-library 仓库,不在语料 ZIP 内,搭建评测环境时需一并获取。

§4.1 DAIMS 字段字典

字段 类型 说明 示例值 AI 用途 观测误差 信息性缺失编码 取值范围
doc_id string 文档唯一 ID,即 .txt/.ann 文件名 cc_onco101 主键、划分子集 无 无 cc_onco1-cc_onco6233 内不重复
text string 病例正文(UTF-8,西语) “El informe HP es compatible con…” 模型输入 匿名化改写导致的语义缺口 无 自由文本
T-id string Brat 实体行 ID T1 对齐提及 无 无 T1, T2, …(每文档独立)
entity_type string 实体类型,全库单一 MORFOLOGIA_NEOPLASIA 标签通道 无 无 仅 1 个取值
start_offset int 提及起始字符偏移(UTF-8 字节序) 690 span 抽取 换行/空白需与官方 QC 对齐 无 [0, len(text)]
end_offset int 提及结束字符偏移 735 span 抽取 同上 无 > start_offset
span_text string 提及原文 adenocarcinoma moderadamente diferenciado 验证对齐 可能含括号等首尾字符 无 自由文本
icd_o_3_code string eCIE-O-3.1 编码(存于 AnnotatorNotes) 8140/3 或 8140/32 NORM/CODING 标签 4-7 字符,需白名单校验 无 eCIE-O-3.1 有效码
behavior_digit int 斜杠后行为位 3 行为分类任务 由码位推断,非独立字段 无 0/1/2/3/6/9
coding_label string CODING TSV 中的文档级码 8140/3 多标签分类 与 NORM 逐提及码非一一对应 无 valid-codes.tsv 子集
split string 文档所属子集(目录元信息) train 复现官方划分 由目录名推导,非文件内字段 无 train / dev1 / dev2 / test / background

§4.2 标签分布

CANTEMIST 只有一个实体类型(MORFOLOGIA_NEOPLASIA),"分布"的意义落在编码空间上:1,301 份文档共对应 8,410 个规范化编码,平均每份约 6.5 个编码。编码呈典型长尾分布——头部为常见癌型(如 8140/3 腺癌及其分化变体),尾部包含大量仅出现数次的罕见组织学码。官方未发布完整的逐码频次表,使用前建议自行统计 train/dev 并关注:① 尾部码的 few-shot 性质;② 分化位变体(如 8140/32)进一步稀释样本。

统计时的实操建议:把频次表按"4 位主体码"与"完整码"两级分别聚合——前者用于划分分层与祖先码平滑,后者用于评估标签空间规模;两份频次表都应随实验配置归档,保证同组实验可对齐。

§4.3 关键统计

统计项 数值 来源
标注文档数 1,301 官方数据卡
无标注背景文档数 4,932 共享任务官方页
收集文档总数 6,233 HITSZ 参赛系统论文
规范化编码总数 8,410 HITSZ 参赛系统论文
平均编码数/文档 约 6.5 8,410 / 1,301 推算
实体类型数 1(MORFOLOGIA_NEOPLASIA) 官方指南
eCIE-O-3.1 码长 4-7 字符 官方 QC 规则
ZIP 包大小 17.2 MB(md5 a219fcca9078f19490471c920a3b5816) Zenodo record 3773228
标注指南 2020-06 版 PDF,877.8 kB Zenodo record 3878178

§4.4 数据层级

语料库(6,233 份收集)
└── 文档(1,301 份标注 = 1 病例报告;doc_id 全局唯一)
    └── 提及(MORFOLOGIA_NEOPLASIA span,字符偏移定位)
        └── 编码(eCIE-O-3.1,存于 AnnotatorNotes;NORM 层)
            └── 文档级编码集合(CODING 层,TSV 汇总,可多码)

注意:匿名化后没有患者级 ID,层级到"文档"为止;同一名患者的多次就诊记录在语料中无法关联。

§4.5 缺失值与信息性缺失

现象 是否缺失 处理建议
background 文档无 .ann 设计使然 只用于预训练/伪标签,不得计入评测
个别文档可能无形态学提及 语义空缺 CODING 标签为空集是合法预测目标,多标签评估需正确处理
提及无独立分化字段 结构设计 分化信息在 span 文本与码的附加位中,需自行解析
日期/机构字段 匿名化移除 不可用时序建模,勿尝试恢复
有效码白名单 评测约束而非数据缺失 CODING 预测须先按 valid-codes.tsv 过滤再计分

§5 划分与使用建议

§5.1 官方划分

集合 文档数 官方用途
train 501 训练
dev1 + dev2 250 + 250 = 500 开发调参(两个独立 250 子集)
test 300 唯一官方评测集(赛后金标准公开)
background 4,932 无标注;当年随 test 一并提交预测,仅 test 计分

复现要点:官方划分以 Zenodo 包内目录为准(dev1 与 dev2 分开提供);任何"dev 500"口径都来自镜像的合并视图,二者在模型选择策略上有差别(见 §6.5 坑点 4)。

§5.2 社区惯例划分

NLP-progress 等社区榜单统一采用官方 test 300 的 micro-F1,因此自建划分只适合内部实验;对外汇报一律回到官方划分。做消融时可把 train+dev1+dev2(共 1,001 份)合并做 k 折交叉验证,但需在论文中注明与官方数字不可直接比较。

另一个常见误区是把"dev 500"当作单一集合处理:官方语义里 dev1 与 dev2 是两次独立采样,镜像格式才把它们拼成 500。若你的历史实验只在 dev1 上调参,切换到合并 dev 后指标会有 1-2 个点的自然波动,属正常现象而非代码回归。

§5.3 划分策略与泄漏风险

  • 官方按文档随机划分,一份病例一个文档,天然规避了"同一患者跨训练/测试集"的实体级泄漏——但匿名化使重复患者无法被检测,若原始病例存在同人多文档,理论上仍存在弱泄漏,官方未讨论此点。
  • 自行重新划分时,务必保持文档级原子性:禁止把同一 .txt 的不同片段分入不同集合。
  • Silver Standard 与 background 文本只可用于无监督/远程监督训练,混入有监督训练集后再在官方 test 上汇报,会构成事实上的泄漏,须显式声明。
  • 若与同系列语料(CodiEsp、DisTEMIST)联合训练,注意不同语料可能包含同院或同源叙事的文本,联合划分前应做文档级去重并在论文中披露联合策略。

§5.4 交叉验证建议

数据量小(1,001 份训练+开发),推荐 5 折或 10 折文档级分层交叉验证(按最常见编码分箱分层),折间报告均值±标准差;长尾码建议按"是否在 train 出现过"分组评估,避免被头部码主导。

折数 每折训练量 每折验证量 适用场景
5 折 约 801 份 约 200 份 日常消融与超参搜索
10 折 约 901 份 约 100 份 小数据精调,方差偏大需多 seed

§5.5 外部验证建议

同语种迁移:DisTEMIST(疾病实体,SNOMED CT)、CodiEsp(ICD-10 编码)共享西语临床叙事风格,是检验形态学模型语义表示泛化性的首选;跨语言迁移:以英文 n2c2/i2b2 病理子集训练后零样本迁移到 CANTEMIST,可量化"英-西临床语言鸿沟"。迁移实验的汇报建议固定三要素:源域数据量、目标域微调样本数(0/100/1,001)、评测口径(官方库版本),否则跨论文数字无法对齐。


§6 AI 就绪指南

§6.0 云端快速启动

# Colab / 任意 Linux 环境:下载官方金标准(17.2 MB)并解压
wget -q https://zenodo.org/records/3773228/files/cantemist.zip -O cantemist.zip
unzip -q cantemist.zip -d data_root/
md5sum cantemist.zip   # 期望 a219fcca9078f19490471c920a3b5816
ls data_root/cantemist                      # 确认 train-set/ dev1/ dev2/ test-set/ 等目录就位
ls data_root/cantemist/train-set | head -3  # 抽查训练文档

§6.1 快速上手(含目录约定)

# ── 目录结构预期 ─────────────────────────────────────────────
# data_root/cantemist/                  ← 解压产物
#   ├── train-set/...                   ← 501 份 .txt + .ann
#   ├── dev1/ dev2/                     ← 各 250 份
#   ├── test-set/                       ← 300 份(金标准已公开)
#   ├── background-set/                 ← 4,932 份仅 .txt
#   └── cantemist-coding/*.tsv          ← 文档级编码
# ── data_root 拼接关系:所有路径以 data_root 为前缀,代码中
#    只出现相对路径,便于迁移 ─────────────────────────────────
# ── 最小可用子集:train-set 的 .txt/.ann 即可跑通 NER 训练 ──
DATA_ROOT = "data_root"
SPLIT_DIRS = {
    "train": f"{DATA_ROOT}/cantemist/train-set",
    "dev1":  f"{DATA_ROOT}/cantemist/dev1",
    "dev2":  f"{DATA_ROOT}/cantemist/dev2",
    "test":  f"{DATA_ROOT}/cantemist/test-set",
}
# Brat 解析最小实现:从 .ann 读出提及 span 与 eCIE-O-3.1 编码
import re, pathlib

def parse_ann(ann_path):
    """返回 [(tid, type, (start, end), text, code), ...]"""
    notes = {}
    entities = []
    for line in pathlib.Path(ann_path).read_text(encoding="utf-8").splitlines():
        if not line.strip():
            continue
        if line.startswith("#"):                      # AnnotatorNotes 行:#1<TAB>AnnotatorNotes T1<TAB>8140/3
            m = re.match(r"#(\S+)\tAnnotatorNotes (T\d+)\t(.+)", line)
            if m:
                notes[m.group(2)] = m.group(3).strip()
        elif line.startswith("T"):                    # 实体行:T1<TAB>TYPE start end[;start end]<TAB>text
            m = re.match(r"(T\d+)\t(\S+) (\d+) (\d+(?:;\d+ \d+)*)\t(.*)", line)
            if m and ";" not in m.group(4):           # 官方 QC 已剔除跨行提及,这里做防御式过滤
                entities.append((m.group(1), m.group(2),
                                 (int(m.group(3)), int(m.group(4).split()[-1])),
                                 m.group(5), notes.get(m.group(1))))
    return entities

ents = parse_ann(f"{DATA_ROOT}/cantemist/train-set/cantemist-ner/cc_onco101.ann")
print(ents[:2])   # [(T1, MORFOLOGIA_NEOPLASIA, (690, 735), 'adenocarcinoma moderadamente diferenciado', '8140/32'), ...]

§6.2 数据获取

渠道 链接 格式 大小 门槛
Zenodo gold standard https://zenodo.org/records/3773228 Brat + TSV(ZIP) 17.2 MB 无(CC BY 4.0)
Zenodo 标注指南 https://zenodo.org/records/3878178 PDF 877.8 kB 无
HF CoNLL 镜像 https://huggingface.co/datasets/PlanTL-GOB-ES/cantemist-ner 四列 CoNLL 数 MB 无
HF bigbio 镜像 https://huggingface.co/datasets/bigbio/cantemist bigbio schema 16.46 MB 无
官方评测库 https://github.com/TeMU-BSC/cantemist-evaluation-library Python — 无
Silver Standard 语料 https://zenodo.org/records/3773228 弱监督标注 随 ZIP 发布 无(仅用于预训练/蒸馏,禁入评测)
# 途径一:Hugging Face 直接加载(省去 Brat 解析)
from datasets import load_dataset
ds = load_dataset("PlanTL-GOB-ES/cantemist-ner")   # train / dev / test 三个 split(dev 为两集合合并口径)
print(ds["train"][0])

镜像使用提醒:HF 镜像便于快速迭代,但其 dev 划分口径与偏移表示可能与 Brat 原生格式存在细微差异;跨镜像结果对齐前,先在若干同一文档上比对实体集合与偏移是否一致。

# 途径二:Zenodo 原始包(推荐做严肃实验,保持与官方一致的 dev1/dev2 结构)
wget https://zenodo.org/records/3773228/files/cantemist.zip -O cantemist.zip   # 亦见 §6.0

# 途径二补充:用 Zenodo REST API 查询文件清单(适合自动化流水线)
curl -sL "https://zenodo.org/api/records/3773228" -o record.json
python -c "import json; rec=json.load(open('record.json')); [print(f['key'], f['size'], f['links']['self']) for f in rec['files']]"

§6.3 预处理全流程

# 步骤 1:Brat → BIO 对齐(NER/NORM 通用)
# 注意:偏移为 UTF-8 字符偏移;先按字符切词再对齐,勿先 tokenize 后回找
def char_labels(text, entities):
    labels = ["O"] * len(text)
    for _, _, (s, e), _, _ in entities:
        labels[s] = "B-MORFOLOGIA_NEOPLASIA"
        for i in range(s + 1, e):
            labels[i] = "I-MORFOLOGIA_NEOPLASIA"
    return labels

# 步骤 2:编码规范化(NORM/CODING 前必做)
VALID_BEHAVIOR = set("012369")
def normalize_code(code: str) -> str:
    code = code.strip().upper().replace(" ", "")
    body, _, beh = code.partition("/")
    if not (4 <= len(body) <= 4 and beh and beh[0] in VALID_BEHAVIOR):
        raise ValueError(f"非法 eCIE-O 码结构: {code}")
    return code                       # 8140/32 → 保留附加分化/修饰位,码长 ≤7

# 步骤 3:文本清洗(与官方五步 QC 对齐,勿过度清洗)
#   - 提及内部与尾部不应残留 \n(官方已剔除跨行提及)
#   - 提及首尾应落在字母数字或括号上;解析器遇标点边界应告警
def span_sanity(span_text, start, end, text):
    assert not span_text.startswith(("\n", ",")), f"首字符异常 @{start}"
    assert start < end <= len(text), "偏移越界"

# 步骤 4:训练样本打包(供 §6.4 的 Dataset 使用)
def build_samples(split_dir):
    samples = []
    for txt in sorted(pathlib.Path(split_dir).glob("*.txt")):
        text = txt.read_text(encoding="utf-8")
        ann = txt.with_suffix(".ann")
        samples.append((text, parse_ann(ann) if ann.exists() else []))
    return samples

train_samples = build_samples(f"{DATA_ROOT}/cantemist/train-set/cantemist-ner")
dev_samples = (build_samples(f"{DATA_ROOT}/cantemist/dev1/cantemist-ner")
               + build_samples(f"{DATA_ROOT}/cantemist/dev2/cantemist-ner"))

# 步骤 5:NORM 标签对提取(mention_text → code)
def norm_pairs(entities):
    return [(span, code) for _, _, _, span, code in entities if code]

# 步骤 6(可选):从 background 文本构建预训练语料(每文档一行,去空行)
# 步骤 7:落盘 jsonl:{"doc_id", "text", "entities":[{"start","end","text","code"}]}
# CODING 子任务:TSV → 文档级多标签
from collections import defaultdict
def load_coding(tsv_path):
    doc2codes = defaultdict(list)
    for line in open(tsv_path, encoding="utf-8"):
        parts = line.rstrip("\n").split("\t")
        if len(parts) == 2 and parts[1]:
            doc2codes[parts[0]].append(parts[1])
    return doc2codes

预处理验收清单(每一项都对应官方 QC 或评测约束):

检查点 通过标准
UTF-8 解码 无 UnicodeDecodeError;西语重音字符原样保留
偏移对齐 对全部标注满足 span_text == text[start:end]
码结构 匹配 4-7 字符格式,斜杠后首位为行为位
行为位取值 ∈
无跨行提及 解析器断言 span 内不含换行符
白名单过滤 CODING 输出码 ⊆ valid-codes.tsv

§6.4 PyTorch DataLoader 完整代码

<details>
<summary>展开完整可运行 Dataset + DataLoader 代码(约 55 行)</summary>

import torch
from torch.utils.data import Dataset, DataLoader
from transformers import AutoTokenizer

MODEL_NAME = "dccuchile/bert-base-spanish-wwm-uncased"   # BETO,共享任务主力骨干之一
LABELS = ["O", "B-MORFOLOGIA_NEOPLASIA", "I-MORFOLOGIA_NEOPLASIA"]
LABEL2ID = {l: i for i, l in enumerate(LABELS)}

class CantemistNerDataset(Dataset):
    """输入:解析好的 (text, entities) 列表;输出:BETO token 分类样本"""
    def __init__(self, samples, tokenizer, max_len=512):
        self.samples, self.tokenizer, self.max_len = samples, tokenizer, max_len

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

    def __getitem__(self, idx):
        text, entities = self.samples[idx]
        char_tags = char_labels(text, entities)                     # 复用 §6.3 步骤 1
        enc = self.tokenizer(text, truncation=True, max_length=self.max_len,
                             return_offsets_mapping=True)
        labels = []
        for (s, e) in enc["offset_mapping"]:
            if e <= s:                       # [CLS]/[SEP]/padding
                labels.append(-100)
            else:
                tag = char_tags[s] if s < len(char_tags) else "O"
                # 特殊 token 词内延续位归为 I,简化处理;严格实现应检查 tag 是否为 I 起始
                labels.append(LABEL2ID.get(tag, LABEL2ID["O"] if tag == "O" else LABEL2ID["I-MORFOLOGIA_NEOPLASIA"]))
        return {"input_ids": torch.tensor(enc["input_ids"]),
                "attention_mask": torch.tensor(enc["attention_mask"]),
                "labels": torch.tensor(labels)}

def collate(batch, pad_id):
    maxlen = max(b["input_ids"].size(0) for b in batch)
    out = {}
    for k in ("input_ids", "attention_mask", "labels"):
        pad_value = -100 if k == "labels" else (0 if k == "attention_mask" else pad_id)
        out[k] = torch.stack([torch.nn.functional.pad(b[k], (0, maxlen - b[k].size(0)), value=pad_value) for b in batch])
    return out

tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
train_ds = CantemistNerDataset(train_samples, tokenizer)   # train_samples 由 §6.1/§6.3 生成
loader = DataLoader(train_ds, batch_size=16, shuffle=True,
                    collate_fn=lambda b: collate(b, tokenizer.pad_token_id))
batch = next(iter(loader))
print({k: v.shape for k, v in batch.items()})

</details>

§6.4b NORM 与 CODING 建模骨架
# NORM:双编码器对比学习骨架(正样本 = 金标准 (提及, 编码描述) 对)
import torch
import torch.nn.functional as F
from transformers import AutoModel

class BiEncoder(torch.nn.Module):
    def __init__(self, model_name=MODEL_NAME, out_dim=256):
        super().__init__()
        self.text_enc = AutoModel.from_pretrained(model_name)
        self.code_enc = AutoModel.from_pretrained(model_name)
        self.proj_t = torch.nn.Linear(768, out_dim)
        self.proj_c = torch.nn.Linear(768, out_dim)

    def encode_text(self, batch):
        h = self.text_enc(**batch).last_hidden_state[:, 0]
        return F.normalize(self.proj_t(h), dim=-1)

    def encode_code(self, batch):
        h = self.code_enc(**batch).last_hidden_state[:, 0]
        return F.normalize(self.proj_c(h), dim=-1)

def info_nce(m_vec, c_vec, tau=0.05):
    logits = m_vec @ c_vec.t() / tau                 # (B, B):对角线为正样本对
    targets = torch.arange(logits.size(0), device=logits.device)
    return F.cross_entropy(logits, targets)

# 训练要点:batch 内其他样本的编码描述充当负例;推理时对编码描述库做
# 近邻检索,再按官方 valid-codes.tsv 白名单过滤后输出最终码。
# CODING:从 NER/NORM 输出聚合文档级码并按置信度排序(MAP 评估输入)
def doc_codes_from_norm(entities, default_conf=0.5):
    codes = {}
    for _, _, _, span_text, code in entities:
        if code:
            codes[code] = max(codes.get(code, default_conf), default_conf)
    return sorted(codes, key=codes.get, reverse=True)   # 置信度降序 → 排序列表

说明:CODING 的高分策略以"高召回候选 + 排序质量"为核心(官方并列第一名的 ICB-UMA 即以此拿满 MAP);纯 top-1 输出会显著低估 MAP(见坑点 6)。

# 端到端训练循环(NER):token 级 F1 仅作训练监控与早停;正式汇报以官方评测库为准
from transformers import AutoModelForTokenClassification

def make_loader(samples, shuffle=False):
    return DataLoader(CantemistNerDataset(samples, tokenizer), batch_size=16, shuffle=shuffle,
                      collate_fn=lambda b: collate(b, tokenizer.pad_token_id))

train_loader = make_loader(train_samples, shuffle=True)
dev_loader = make_loader(dev_samples)
model = AutoModelForTokenClassification.from_pretrained(MODEL_NAME, num_labels=len(LABELS)).cuda()
optimizer = torch.optim.AdamW(model.parameters(), lr=3e-5, weight_decay=0.01)

def token_level_f1(model, loader):
    """dev 上的 token 级微平均 F1:实体 token 视为正类,忽略 -100 位"""
    import numpy as np
    model.eval()
    tp = fp = fn = 0
    with torch.no_grad():
        for batch in loader:
            batch = {k: v.cuda() for k, v in batch.items()}
            pred = model(**batch).logits.argmax(-1).cpu().numpy()
            gold = batch["labels"].cpu().numpy()
            for p_row, g_row in zip(pred, gold):
                mask = g_row != -100
                p_lab, g_lab = p_row[mask], g_row[mask]
                tp += int(((p_lab > 0) & (g_lab > 0)).sum())
                fp += int(((p_lab > 0) & (g_lab == 0)).sum())
                fn += int(((p_lab == 0) & (g_lab > 0)).sum())
    precision = tp / (tp + fp) if tp + fp else 0.0
    recall = tp / (tp + fn) if tp + fn else 0.0
    f1 = 2 * precision * recall / (precision + recall) if precision + recall else 0.0
    return precision, recall, f1

best_f1 = 0.0
for epoch in range(5):
    model.train()
    for batch in train_loader:
        batch = {k: v.cuda() for k, v in batch.items()}
        loss = model(**batch).loss
        optimizer.zero_grad()
        loss.backward()
        torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0)
        optimizer.step()
    p, r, f1 = token_level_f1(model, dev_loader)
    print(f"epoch {epoch}: dev P={p:.4f} R={r:.4f} F1={f1:.4f}")
    if f1 > best_f1:
        best_f1 = f1
        torch.save(model.state_dict(), "beto_cantemist_ner.pt")
# 训练完成后:解码 dev/test 的 span(还原字符偏移),再走 §6.9 的 span 级指标与官方评测库

§6.5 坑点(8 个)

坑点速查表(详细分析见下方各条):

# 坑点 分类 一句话对策
1 纯西语与临床缩写 预处理陷阱 BETO/XLM-R + offsets_mapping 全程对齐
2 只标形态学、无部位分期 标签理解 任务边界外改用 DisTEMIST/CodiEsp 补维度
3 行为位 ≠ 分化位 标签理解 正则容纳 4-7 字符,行为位只取斜杠后第一位
4 dev1/dev2 双开发集 工程陷阱 以 Zenodo 目录为准,显式合并并记录口径
5 test 与 background 混发 评估误用 评测前按官方清单过滤到 300 份 test
6 CODING 评 MAP 非 F1 评估误用 输出全量排序列表 + valid-codes.tsv 白名单
7 span 边界正确率悬崖 预处理陷阱 后处理对齐官方 QC,分化短语并入 span
8 gold/silver/background 混用 数据泄漏 前缀隔离 + 数据血缘清单 + 署名再分发

⚠️ 坑点 1:纯西班牙语文本与密集临床缩写(分类:预处理陷阱)

问题:全库只有西语文本,且临床缩写(HP、Fx、TAC 等)与重音字符密集;直接套用英文模型或按空格粗暴切词,会在 tokenization 阶段损失偏移对齐。
症状:BIO 对齐错位、偏移越界异常;英文预训练模型 F1 比同结构西语模型低 10-20 个点;UnicodeDecodeError 或重音字符被错误规范化。
解决:

  1. 简单方法:全程 UTF-8 读写,用 BETO(dccuchile/bert-base-spanish-wwm-uncased)或 XLM-R 做 tokenizer,并始终使用 return_offsets_mapping 对齐。
  2. 进阶方法:先按官方 QC 规则校验 span(首尾字母数字/括号、无内部换行),再 tokenize;对缩写建立小型词典映射(HP → informe de histopatología)作为辅助特征。
  3. SOTA 方法:领域增量预训练——在 4,932 份 background 文本上继续 MLM 训练 BETO/RoBERTa,再微调 NER;冠军系统即采用 BERT 家族 + 任务联合建模。
    参考:官方 Overview 论文(CEUR Vol-2664);PlanTL-GOB-ES/cantemist-ner 数据卡示例句。

⚠️ 坑点 2:只标注形态学,没有部位、分期与时间线(分类:标签理解)

问题:CANTEMIST 仅标注 ICD-O 形态学维度(MORFOLOGIA_NEOPLASIA + eCIE-O-3.1 码),不含 ICD-O topography(C00.0-C80.9 部位码)、TNM 分期或任何时间信息;很多使用者误以为它能支持"原发部位抽取"或生存分析。
症状:想抽取肿瘤部位时发现无对应标签;把 8140/3 的 /3 误当"部位"或"分级";试图做纵向分析时发现日期已被匿名化移除。
解决:

  1. 简单方法:明确任务边界——部位/疾病实体需求改用同系列 DisTEMIST(疾病+SNOMED CT),编码需求用 CodiEsp(ICD-10)。
  2. 进阶方法:用弱监督从文本中的部位词表(mama、pulmón、colon 等)远程对齐 ICD-O topography 作为辅助标签,并在论文中明确标注其为远程监督产物。
  3. SOTA 方法:联合建模——在 CANTEMIST 形态学主干上加一个辅助部位分类头,用外部带部位标注的病理语料做参数共享,推理时两路输出。
    参考:官方主页任务定义;西班牙卫生部 CIE-O 3.1 手册(形态学/拓扑学两列表)。

⚠️ 坑点 3:eCIE-O 码结构——行为位 ≠ 分化位,8140/32 不是"3 号行为的 2 型"(分类:标签理解)

问题:ICD-O 码斜杠后第一位是行为码(0 良性、1 未定、2 原位、3 恶性原发),而 eCIEO-3.1 码可长达 7 字符,末位附加分化/修饰信息(官方 QC 示例 8140/32:8140 腺癌 + /3 恶性 + 2 中分化,对应正文 “adenocarcinoma moderadamente diferenciado”)。把它当 5 位数字码解析会切错语义。
症状:正则 ^\d{4}/\d$ 匹配不到合法金标准码;把分化位当行为位做统计,得出"一半肿瘤是中分位行为"的荒谬结论;评测库报"码不在 valid-codes.tsv"。
解决:

  1. 简单方法:解析规则改为 ^\d{4}/[0-9][0-9A-Z]?$,长度 4-7 字符,行为位只取斜杠后第一位。
  2. 进阶方法:对照官方 valid-codes.tsv 白名单做全集校验;把分化位拆为独立特征列用于辅助任务(分化预测),主任务只对齐到白名单码。
  3. SOTA 方法:用形态学码的层级结构(前 4 位组织学 + 行为 + 分化)做多粒度标签平滑,长尾罕见主码向其"祖先码"(如 8140)借概率,可显著改善尾部召回。
    参考:官方页 QC 说明(8140/32 七字符例);HITSZ 系统论文对 ABCD/EF/H 码结构的描述;CIE-O 3.1 手册。

⚠️ 坑点 4:dev1/dev2 两个开发集,“dev 500” 是合并口径(分类:工程陷阱)

问题:官方 Zenodo 包提供 dev1 与 dev2 两个各 250 份的开发集,而多数 Hugging Face 数据卡把 dev 写成 500;用镜像数据时容易把两个集合当一个是错误的,或把 dev2 误并入训练集。
症状:自己的 dev 指标与论文不可比;训练集莫名其妙多了 250 份,test 成绩虚高后无法复现。
解决:

  1. 简单方法:以 Zenodo 原始包为准,dev1 与 dev2 拼接为统一 dev;脚本中显式写 dev = dev1 + dev2。
  2. 进阶方法:dev1 做超参搜索、dev2 做最终模型选择,模拟"双盲"选择,减轻在小开发集上的过拟合选择偏差。
  3. SOTA 方法:把 train+dev1+dev2(1,001 份)做嵌套交叉验证,外折留出做汇报,内折调参;对外声明与官方划分的对应关系。
    参考:Zenodo record 3773228(train/dev1/dev2/test 结构);bigbio 与 PlanTL 数据卡的口径差异。

⚠️ 坑点 5:test 与 background 混合发布,官方只评 300 份 test(分类:评估误用)

问题:共享任务当年把 300 份 test 与 4,932 份无标注 background 一起发布,要求参赛者全部提交预测,但只对 test 计分;今天做离线实验时,若误把 background 当测试集或一并计入指标,数字完全不可比。
症状:F1 明显低于(或高于)论文报告值且无法解释;排行榜复现误差达数个点。
解决:

  1. 简单方法:评测前按官方 test 文件清单过滤,只对 300 份文档计算指标。
  2. 进阶方法:写一个 assert set(pred_files) == set(gs_files) 的硬校验,评测脚本与官方库(cantemist-evaluation-library)双跑比对。
  3. SOTA 方法:在 CI 中固定官方评测库版本 + test 金标准 md5,任何指标产出都附带可复现的评测环境指纹。
    参考:官方参赛说明页(cat=2);TeMU-BSC/cantemist-evaluation-library。

⚠️ 坑点 6:CODING 子任务评 MAP 而非 F1,且有有效码白名单(分类:评估误用)

问题:CODING 的主指标是 Mean Average Precision(MAP),不是 F1;且评测库只统计 valid-codes.tsv 白名单内的码。高召回低精确的策略(如 ICB-UMA 把几乎所有候选码都排进列表)也能拿 MAP 0.847,与 F1 口径完全不同。
症状:用 F1 思路只输出 top-1 码,MAP 低得离谱;或者相反,输出全量码把 MAP 刷高,被审稿人质疑。
解决:

  1. 简单方法:预测文件输出按置信度降序的完整候选码列表,先白名单过滤再算 MAP。
  2. 进阶方法:双指标并行汇报——MAP(官方)+ precision@k / F1(临床可用性视角),展示排名质量与命中率的权衡。
  3. SOTA 方法:多标签排序学习(如把文档-码对建模为 ranking 任务 + BM25/BERT 双塔检索),或直接复用 Vicomtech 的两步集成(NER/NORM 输出聚合为文档级码 + 排序头)。
    参考:官方评测库(MAP 计算与 -c valid-codes.tsv 参数);Overview 论文 §4.2 结果表。

⚠️ 坑点 7:span 边界的"正确率悬崖"——完全匹配 >93%,部分重叠仅约 35%(分类:预处理陷阱)

问题:NORM 的编码只有在 span 完全匹配金标准时才计分。官方冠军系统的错误分析显示:完全匹配的 span(约占 80%)编码正确率超过 93%,而仅部分重叠的 span 编码正确率骤降至约 35%——边界后处理的质量直接决定归一化上限。
症状:NER F1 还不错(如 0.85),NORM F1 却只有 0.70 且难以提升;错误集中在边界多出一个形容词或漏掉 “moderadamente diferenciado” 这类分化短语。
解决:

  1. 简单方法:后处理对齐官方 QC——提及首尾去掉标点/换行、要求首尾字符为字母数字或括号;把分化形容词(bien/moderadamente/poorly diferenciado)并入 span。
  2. 进阶方法:训练后做 span 修补:对每个预测 span 在原句中向两侧贪心扩展到名词短语边界,再重打分。
  3. SOTA 方法:MRC 式联合抽取——冠军 HITSZ-ICRC 把实体定义作为问题、文本作为段落,让模型直接回答 span 起止,天然对齐"提及=临床描述短语"的标注哲学。
    参考:Vicomtech 系统论文错误分析(CEUR Vol-2664 paper17);HITSZ-ICRC 系统论文。

⚠️ 坑点 8:gold / silver / background 三套语料角色混淆(分类:数据泄漏)

问题:Zenodo 同时发布 Gold Standard(1,301 份人工标注)、Silver Standard(弱监督标注副本)与 background 集(4,932 份无标注);把 silver 的自动标签当金标准评测、或把 test 文档混入 background 预训练后声称零样本,都会造成污染。语料本身已匿名化(官方声明无个人敏感信息),但匿名化不等于"可以无约束地再分发衍生标注"。
症状:用 silver 评测得到虚高指标;审稿人要求澄清训练数据构成时无法自证;再分发的衍生数据集与原始许可冲突。
解决:

  1. 简单方法:目录与变量命名上强制区分 gs_(gold)/silver_/bg_ 前缀;评测脚本只接受 gold 路径。
  2. 进阶方法:数据血缘清单——任何实验记录"gold 用于哪些步骤、silver 用于哪些步骤",并在论文的 Implementation Details 中逐项披露。
  3. SOTA 方法:把 silver 标签用作师生蒸馏的教师信号(gold 只做学生微调),既利用规模又保持评测纯净;再分发遵守 CC BY 4.0 署名。
    参考:Zenodo record 3773228(silver standard 条目);IIC/cantemist-ner 数据卡(个人敏感信息声明)。

§6.6 数据增强

策略 安全性 说明
同义临床术语替换(基于 eCIE-O 同义词表) ✅ 安全 替换后编码不变,扩充 NORM 对
提及级回译(西→英→西,仅非提及上下文) ⚠️ 谨慎 必须保持 span 字符偏移重算正确
随机插入/删除字符 ❌ 危险 破坏字符偏移与西语正字法,制造脏标签
机器翻译生成伪西语临床文本当金标准 ❌ 危险 引入系统术语幻觉,污染评测
跨文档拼接 ❌ 危险 会把两个文档的编码集合合并,制造假 CODING 标签
background 文本 MLM 预训练 ✅ 安全 无标签参与,纯表示学习
分化形容词(bien/moderadamente/poorly diferenciado)并入/移出 span 做一致性扰动 ⚠️ 谨慎 仅用于边界鲁棒性测试集,不得改写训练标签
用 LLM 改写临床句子生成伪训练数据 ❌ 危险 术语幻觉会制造错误形态学对应关系

§6.7 模型推荐

模型/骨干 适用子任务 参考成绩 备注
BETO(BERT-base 西语) NER / NORM F1 0.850(官方 test) 共享任务最常用西语骨干
BETO + SciBERT 双专家集成 NER / NORM / CODING NER 0.869 / NORM 0.821 / MAP 0.847 Vicomtech 两步集成,官方并列最佳 CODING
MRC mBERT-MLP 联合模型 NER + NORM 联合 NER 0.870 / NORM 0.825 HITSZ-ICRC 冠军方案,阅读理解范式
BiLSTM-CRF + 词/字嵌入 NER F1 0.855 无预训练 LM 时的强基线
双层 BiLSTM-CRF + FastText/PoS/字符 NER F1 0.834 Hulat-UC3M 方案,特征工程路线代表
XLM-RoBERTa 跨语言迁移 —(未在官方榜) 多语言对照实验推荐

§6.8 硬件需求

阶段 最低配置 推荐配置 说明
Brat 解析/统计 CPU 2 核 / 4 GB CPU 4 核 / 8 GB 纯文本处理
NER 微调(BETO-base) 1×GPU 8 GB(fp16) 1×GPU 16 GB max_len 512,batch 16
领域 MLM 预训练(background) 1×GPU 16 GB 1×GPU 24-40 GB 4,932 份文本,数小时级
CODING 排序模型 1×GPU 16 GB 1×GPU 24 GB 文档级编码,双塔可降配
5 折交叉验证全流程 1×GPU 16 GB 1×GPU 24 GB 总训练时长约为单折 5 倍

§6.9 评估指标代码

# NER/NORM:span 级 micro P/R/F1(与官方口径一致:精确匹配才算对)
def span_micro_f1(gold, pred):
    g, p = set(map(tuple, gold)), set(map(tuple, pred))
    tp = len(g & p)
    precision = tp / len(p) if p else 0.0
    recall = tp / len(g) if g else 0.0
    f1 = 2 * precision * recall / (precision + recall) if precision + recall else 0.0
    return precision, recall, f1

# CODING:MAP@全列表(官方主指标;白名单外的码先剔除)
def average_precision(gold_codes, ranked_pred_codes):
    gold = set(gold_codes)
    if not gold:
        return 0.0
    hits, ap = 0, 0.0
    for i, c in enumerate(ranked_pred_codes, 1):
        if c in gold:
            hits += 1
            ap += hits / i
    return ap / len(gold)

def mean_average_precision(doc2gold, doc2pred):
    import statistics
    return statistics.mean(average_precision(doc2gold[d], doc2pred.get(d, [])) for d in doc2gold)

def map_at_k(doc2gold, doc2pred, k=5):
    """截断排名的 MAP@k:衡量临床编码员只需看前 k 个建议时的收益"""
    import statistics
    def ap_k(gold, ranked):
        gold, hits, ap = set(gold), 0, 0.0
        if not gold:
            return 0.0
        for i, c in enumerate(ranked[:k], 1):
            if c in gold:
                hits += 1
                ap += hits / i
        return ap / len(gold)
    return statistics.mean(ap_k(g, doc2pred.get(d, [])) for d, g in doc2gold.items())

严肃评测请直接使用官方库 TeMU-BSC/cantemist-evaluation-library(依赖 pandas + trectools),本节代码用于理解口径与单元测试。

指标 子任务 口径要点
micro-F1 NER span 精确匹配,微平均;每队最多 5 run 取最佳
micro-F1 NORM span 与编码都正确才计 TP
MAP CODING 排序质量指标,白名单外码剔除;与 F1 不可换算
MAP@k(自建) CODING 衡量"编码员只看前 k 个建议"的实用收益

§6.10 MLOps 笔记

  1. 数据版本固定:锁定 Zenodo record 3773228 的 md5(a219fcca9078f19490471c920a3b5816)写入实验配置。
  2. 评测环境指纹:官方评测库 commit hash + valid-codes.tsv 校验和随实验产出归档。
  3. 编码版本声明:所有产物注明 “ICD-O-3 / eCIE-O-3.1(2020 语料)”,防止与 ICD-O-3.2 混淆。
  4. 划分不可变:训练/开发/测试划分以配置文件硬编码,禁止运行时重采样。
  5. 可复现检查单:随机种子、transformers 版本、tokenizer 版本、max_len、fp16 开关五项入日志。
  6. 镜像口径记录:HF CoNLL 镜像的 dev 为合并口径,与 Zenodo dev1/dev2 结构差异写入实验配置,防止跨口径比较。
  7. 评测隔离:金标准 test 目录在生产仓库中只读挂载,训练任务无写权限,杜绝意外覆盖。
  8. 报告模板固定:划分/骨干/后处理开关/评测库 commit 四字段强制填写,规避坑点 5、6 的口径事故。
  9. 访问审计:background 与 test 目录分别记录读取日志,评测集访问可追溯。
  10. 再分发合规:衍生数据集发布时附原始 DOI、CC BY 4.0 声明与变更说明。

§7 质量评估与局限性

§7.1 已知偏倚

偏倚类型 描述 严重程度 缓解建议
语言偏倚 仅西班牙语,且为西班牙本土用语 高 跨语言实验显式声明;拉美部署前做域适应
选择偏倚 病例经人工筛选追求多样性,非随机抽样,不代表真实就诊分布 中 汇报时注明"专家策展语料";部署前用本地数据校准
任务窄化偏倚 仅形态学单一实体类型,无部位/分期/时间 中 与 DisTEMIST/CodiEsp 组合使用补全维度
长尾编码偏倚 8,410 个编码高度长尾,罕见码样本极少 高 分层评估;祖先码标签平滑(§6.5 坑点 3)
叙事偏倚 病理检查描述占主导,门诊/影像叙述较少 低 预训练与微调数据分布对齐
时代偏倚 病例发布于 2020 年,肿瘤分类与治疗术语持续演化 中 报告注明 eCIE-O-3.1 版本;新分类码建立映射

§7.2 标注质量

官方质量体系完整:公开指南(三阶段迭代建成)、临床专家标注、MD 定期抽查咨询、五步后标注 QC(一致性复查、码长校验、换行清洗、跨行剔除、首尾字符校验)。但两项关键量化指标——IAA 数值与逐码频次表——均未公开,第三方只能通过"官方评测成绩区间"间接感知标注一致性。引用时建议表述为"专家金标准,质控流程公开,IAA 数值未披露"。

质量要素 公开情况 第三方核验途径
标注指南全文 ✅ 公开(Zenodo record 3878178) 直接阅读并对照标注样本
五步 QC 规则 ✅ 公开(官方页) 在自建解析器中复刻为断言
IAA 数值 ❌ 未披露 小规模双标抽样自行估计
逐码频次表 ❌ 未披露 自行统计 train/dev(勿用 test 统计做训练决策)

§7.3 泛化性评估

部署场景 失效风险 证据/理由
拉美西语医院 中-高 词汇与书写差异(官方未含拉美数据)
非肿瘤科室文本 高 语料为肿瘤专科病例,其他科室术语分布不同
英文系统直迁 高 全库西语;官方结果表中英文模型需 multilingual 变体
ICD-O-3.2 新版编码 中 语料基于 eCIE-O-3.1;新版码需映射表转换
时间演变(新药/新分类) 中 病例时间未公开,WHO 肿瘤分类持续更新
长尾码上的头部模型 高 罕见码训练样本极少,头部模型倾向预测常见码

§7.4 伦理与合规

语料在发布前已完成去标识化,官方数据卡明确"不含个人或敏感信息";以 CC BY 4.0 开放,商用亦仅需署名。但使用方仍应注意:① 临床文本的再标注可能引入新的可识别信息;② 衍生模型用于临床前须独立验证;③ 引用官方论文与 Zenodo DOI 是许可的署名要求的一部分。再分发衍生数据集时,建议随附原始 DOI、CC BY 4.0 声明与本页面的版本引用方式,保持许可链条完整。

§7.5 公平性

语料覆盖全性别与从儿童到老年的年龄段,并刻意纳入常见与罕见肿瘤;但种族、社会经济状态等人口学变量未披露,无法评估模型在这些维度上的公平性表现——跨人群部署前需要本地审计。

§7.6 数据漂移

发布至今已逾 5 年:临床术语(如免疫治疗相关表述)、WHO 肿瘤分类与 ICD-O 版本均在演化;语料采集时间未知加剧了漂移评估的不确定性。建议将 CANTEMIST 定位为"术语能力基准"而非"当前临床分布快照",并在报告中注明编码体系版本(eCIE-O-3.1)。若需近分布数据,可用 background 集与自有院内语料做表示层面的分布对比(如嵌入空间 KS 检验或领域分类器 AUC),以量化漂移幅度。

§7.7 DAIMS 24 项质量检查

# 检查项 状态 说明
1 宽格式 ✅ Brat/TSV/CoNLL 均为逐文档平铺结构,无嵌套表
2 唯一标识 ✅ doc_id(cc_onco 系列)全局唯一,文件名即主键
3 特殊字符 ⚠️ 西语重音字符 + 换行/首尾标点需按官方 QC 规则处理
4 重复行 ✅ 逐文档分发,无重复记录问题
5 缺失编码 ✅ CODING 标签完整;background 无标注为设计使然
6 标签标识 ✅ 单一实体类型 + AnnotatorNotes 承载编码,语义明确
7 罕见类分组 ⚠️ 编码长尾严重,官方未提供罕见码分组或聚合表
8 偏倚评估 ⚠️ 选择性策展,官方未发布代表性/偏倚量化分析
9 数据字典 ✅ 标注指南全文公开(Zenodo record 3878178)
10 信息性缺失解释 ⚠️ "无部位/无时间"是任务设计而非缺失,需使用者自行理解
11 设备记录 ❌ 纯文本语料,无设备/仪器元数据
12 共线性 ⚠️ 文本任务不直接适用;文档级编码间共现关系需自行分析
13 编码映射 ✅ eCIE-O-3.1 ↔ ICD-O-3 官方对照可查(卫生部在线浏览)
14 时间戳处理 ❌ 匿名化移除日期,无法做时序/纵向任务
15 划分建议 ✅ 官方固定划分 + 明确评测协议(仅 test 计分)
16 泄漏讨论 ✅ 文档级原子划分;官方评测边界清晰(test 与 background 分离计分)
17 标签分布 ⚠️ 总码数公开(8,410),但官方未发布逐码频次表
18 测量偏倚 ⚠️ 病理中心型叙事,非病理来源的形态学表达覆盖有限
19 外部验证建议 ✅ 同系列西语语料(DisTEMIST/CodiEsp)可直接衔接做迁移验证
20 版本记录 ⚠️ 单一 Zenodo 版本,无正式 changelog;以指南日期(2020-06)锚定
21 预处理脚本 ⚠️ 无官方预处理包(仅官方评测库),BIO 转换需自行实现
22 合规要求 ✅ CC BY 4.0 开放下载,署名即可,无需注册或协议
23 多模态对齐 ❌ 单模态文本,不涉及跨模态对齐
24 去标识化 ✅ 官方声明已匿名化,无个人敏感信息

DAIMS 评分:16.5 / 24(✅×12 + ⚠️×9 × 0.5 + ❌×3 × 0)

评分解读:CANTEMIST 在"标识、划分、合规、去标识化、数据字典"等结构性维度近乎满分,属于发布工程质量很高的评测语料;失分集中在文本语料的固有局限(无设备/时间戳/多模态)与官方未披露的量化信息(IAA、逐码分布、罕见码分组)。它是一份"可信但窄"的金标准:对形态学抽取与编码任务,即插即用;对超出任务边界的诉求(纵向分析、部位抽取、多模态),需要外部数据补充。与英文同任务语料相比,其"官方划分+公开评测库"的组合降低了复现门槛,这是 16.5 分中结构性得分的主要来源。

对你意味着什么:① 若你的目标是西语肿瘤 NER/NORM/CODING 基准论文——直接采用官方划分与评测库,16.5 分的结构性保障足够支撑可复现研究;② 若你的目标是构建完整肿瘤登记流水线——把 CANTEMIST 与 DisTEMIST(疾病/部位)、CodiEsp(ICD-10)拼成三件套,不要试图从 CANTEMIST 里"榨出"它没有的维度;③ 若你在做跨语言或跨地区模型——把 §7.1 语言偏倚与 §7.3 泛化表写进实验设计,长尾码用祖先码平滑兜底;④ 任何对外汇报都注明 eCIE-O-3.1 版本与"IAA 未披露"的事实,避免过度声明;⑤ 若数据将在生产环境使用——把 §6.3 的预处理验收清单做成 CI 断言,任何数据更新先过清单再入库。

§7.8 外部验证与跨语料矩阵

外部数据集/场景 来源机构 评估任务 性能指标 相对内部变化 关键发现
CANTEMIST 官方 test(25 支队伍) BSC TeMU(CEUR Vol-2664 同行评审) NER micro-F1 0.251-0.870 dev→test 无系统性衰减,Vicomtech 报告 test 略高于 dev BETO 类模型 + 集成为稳定最优范式
CANTEMIST-NORM / CODING 官方 test BSC TeMU(CEUR Vol-2664) NORM / 编码 NORM F1 0.825;CODING MAP 0.847 同上 span 完全匹配时编码正确率 >93%,边界质量是瓶颈
DisTEMIST(同团队后续任务) BSC TeMU(2022,BioASQ/CLEF 体系) 疾病 NER/NORM(SNOMED CT) 各自榜单独立 同一套发布/评测基础设施沿用 CANTEMIST 的 Brat+评测协议模式在西语临床 NLP 中可复制
CANTEMIST Silver Standard BSC TeMU(Zenodo 同记录发布) 弱监督预训练源 —(不作为评测集) 与 gold 同源同分布 可安全用于 MLM/蒸馏,禁止计入任何评测指标

§8 基准性能与生态

§8.1 排行榜(IberLEF 2020 官方 test 集)

排名 模型 性能 年份 关键技术 完整引用 代码
1 HITSZ-ICRC(MRC mBERT-MLP 联合模型) NER F1 0.870 / NORM F1 0.825 2020 机器阅读理解式抽取,NER 与 NORM 联合训练 Xiong et al., 2020, IberLEF 2020 (CEUR Vol-2664), https://ceur-ws.org/Vol-2664/cantemist_overview.pdf https://github.com/xy-always/2020Iberlef
2 Vicomtech(BETO+SciBERT 两步集成) NER F1 0.869 / NORM F1 0.821 / CODING MAP 0.847 2020 BETO 与 SciBERT 双骨干 + 两级集成 Garcia-Pablos et al., 2020, IberLEF 2020 (CEUR Vol-2664, paper17), https://ceur-ws.org/Vol-2664/cantemist_paper17.pdf —
2(并列) ICB-UMA(高召回码列表排序) CODING MAP 0.847(P 0.007 / R 0.928) 2020 高召回候选码生成 + 排序最大化 MAP López-Úbeda et al., 2020, IberLEF 2020 (CEUR Vol-2664), https://ceur-ws.org/Vol-2664/cantemist_overview.pdf https://github.com/guilopgar/CANTEMIST-2020
4 ICB-UMA(BiLSTM-CRF + GloVe/SME/CWE 嵌入) NER F1 0.855 2020 多源词向量 + BiLSTM-CRF,无预训练 LM López-Úbeda et al., 2020, IberLEF 2020 (CEUR Vol-2664), https://ceur-ws.org/Vol-2664/cantemist_overview.pdf https://github.com/guilopgar/CANTEMIST-2020
5 NLNDE(Biaffine 分类器) NER F1 0.853 2020 神经序列标注与依存式 span 分类 Lange et al., 2020, IberLEF 2020 (CEUR Vol-2664), https://ceur-ws.org/Vol-2664/cantemist_overview.pdf —
6 HITSZ-ICRC(BETO 纯 NER 变体) NER F1 0.850 2020 预训练语言模型 + 序列标注基线 Han et al., 2020, IberLEF 2020 (CEUR Vol-2664), https://ceur-ws.org/Vol-2664/cantemist_overview.pdf https://github.com/xy-always/2020Iberlef
7 Recognai(BiLSTM-CRF + FastText + 字符特征) NER F1 0.845 2020 词级 + 字符级特征组合 Carreto Fidalgo, J., 2020, IberLEF 2020 (CEUR Vol-2664), https://ceur-ws.org/Vol-2664/cantemist_overview.pdf https://github.com/recognai/cantemist-ner
8 Hulat-UC3M(双层 BiLSTM-CRF) NER F1 0.834 2020 FastText + PoS + 字符特征 Santamaria Carrasco, S., 2020, IberLEF 2020 (CEUR Vol-2664), https://ceur-ws.org/Vol-2664/cantemist_overview.pdf https://github.com/ssantamaria94/CANTEMIST-Participation

⚠️ 数值不可直接比较的原因:① NER/NORM 的 F1 与 CODING 的 MAP 是不同度量;② 社区榜单(NLP-progress)与官方论文对个别系统的取值口径略有差异(如 Vicomtech 集成在社区榜记 86.9);③ 当年允许每子任务最多 5 次提交,表中取各队最佳 run;④ 部分队伍参与了多个子任务,行间排名仅在各自指标内部成立。

§8.2 SOTA 总结与选型建议

2020 年共享任务后,CANTEMIST 的 NER 榜首(0.870)长期未被大幅刷新,社区复现的首选配置是 BETO/RoBERTa 微调 + CRF;追平 SOTA 的三个杠杆按性价比排序:① span 后处理对齐官方 QC(坑点 7,成本最低收益最大);② background 领域 MLM 预训练;③ MRC 式联合抽取或双骨干集成。CODING 任务建议直接从"NER/NORM 输出聚合 + 排序头"的两步方案起步。

从工程视角,建议把选型拆成三问:① 数据侧——是否已完成坑点 1、3、7 的预处理对齐?② 模型侧——目标任务是 span 质量(NER/NORM,选 BETO+CRF 或 MRC)还是排序质量(CODING,选两步聚合 + 排序头)?③ 汇报侧——是否与官方评测库双跑比对过?三问全绿后再谈刷点,可避免大量无效迭代。

§8.3 评测协议

子任务 主指标 匹配规则 提交约束
CANTEMIST-NER micro-F1(微平均 P/R/F1) span 精确匹配 每队每子任务最多 5 run
CANTEMIST-NORM micro-F1 span 与编码均正确才计 TP 每队每子任务最多 5 run
CANTEMIST-CODING MAP 文档级排序列表,白名单外码剔除 每队每子任务最多 5 run
数据集 语言 关系 差异要点
SPACCC 西班牙语 CANTEMIST 指南的前置语料 疾病/症状/药物实体,无编码映射
CodiEsp 西班牙语 同系列编码任务(格式沿用) ICD-10-CM 诊断/程序码,文档级多标签
DisTEMIST 西班牙语+多语 同团队后续任务(2022) 疾病实体 + SNOMED CT 规范化
n2c2 / i2b2 系列 英语 英文对应生态 无 ICD-O 形态学编码任务
MedMentions 英语 实体链接对照 生物医学文献域,非临床病历

§8.5 关键论文 Top 8

  1. Miranda-Escalada, A., Farré, E., & Krallinger, M. (2020). Named Entity Recognition, Concept Normalization and Clinical Coding: Overview of the Cantemist Track for Cancer Text Mining in Spanish, Corpus, Guidelines, Methods and Results. IberLEF 2020, CEUR Vol-2664, pp. 303-323. — 语料、指南与官方结果的权威总览。
  2. Garcia-Pablos, A., et al. (2020). Vicomtech at CANTEMIST 2020. CEUR Vol-2664 (paper17). — BETO/SciBERT 集成与 span-编码错误分析(>93% vs ~35% 悬崖)。
  3. Xiong, et al. (2020). A Joint Model for Medical Named Entity Recognition and Normalization (HITSZ-ICRC). CEUR Vol-2664. — 冠军方案:MRC 式 NER+NORM 联合建模。
  4. López-Úbeda, P., et al. (2020). Extracting Neoplasms Morphology Mentions in Spanish Clinical Cases through Word Embeddings. CEUR Vol-2664. — 无预训练 LM 的强基线与 CODING 高召回策略。
  5. Lange, L., et al. (2020). NLNDE at CANTEMIST: Neural Sequence Labeling and Parsing Approaches for Clinical Concept Extraction. CEUR Vol-2664. — Biaffine span 分类方法。
  6. Miranda-Escalada, A., et al. (2022). Overview of DisTEMIST at BioASQ. — 同团队姊妹任务,展示 CANTEMIST 协议的可复制性。
  7. Miranda-Escalada, A., Farré, E., & Krallinger, M. (2020). Cantemist guidelines: neoplasms morphology annotation and mapping to CIEO-3. Zenodo record 3878178. — 标注指南原文(2020-06 版 PDF)。
  8. Miranda-Escalada, A., Gonzalez-Agirre, A., Armengol-Estapé, J., & Krallinger, M. (2020). Overview of automatic clinical coding: Annotations, guidelines, and solutions for non-English clinical cases at CodiEsp track of CLEF eHealth 2020. — 同系列编码任务,CODING 子任务 TSV 格式的来源语境。

§8.6 社区活跃度

  • 共享任务吸引 66 支队伍注册、25 支正式提交(约 20% 来自业界),参赛方覆盖西班牙、中国、印度、美国、阿根廷等地(官方 Overview,2020)。
  • 官方评测库、参赛系统仓库(HITSZ-ICRC、lasigeBio、Hulat-UC3M、ICB-UMA、Recognai 等)公开在 GitHub(见 §8.7)。
  • Hugging Face 存在 3 个以上维护镜像(bigbio、PlanTL-GOB-ES、IIC);论文引用 154+(Google Scholar,截至 2026-09),持续出现在西语临床 NLP 与跨语言迁移研究的 related work 中。
  • 官方 Overview 论文与全套参赛工作笔记开放于 CEUR Vol-2664,构成 2020 年后西语临床 NLP 引用网络中的高频节点;同系列任务(CodiEsp、DisTEMIST、Symptemist 等)沿用了同一评测基础设施。

§8.7 生态快照

资源 类型 链接 Star(截至 2026-09) 推荐理由
cantemist-evaluation-library 官方评测脚本 https://github.com/TeMU-BSC/cantemist-evaluation-library — 指标口径唯一权威来源
HITSZ-ICRC 参赛系统 冠军代码 https://github.com/xy-always/2020Iberlef — MRC 联合建模参考实现
lasigeBio 参赛系统 参赛代码 https://github.com/lasigeBioTM/CANTEMIST-Participation — NER/NORM/CODING 全流程
Hulat-UC3M 参赛系统 参赛代码 https://github.com/ssantamaria94/CANTEMIST-Participation — BiLSTM+CRF 细节
ICB-UMA 参赛系统 参赛代码 https://github.com/guilopgar/CANTEMIST-2020 — CODING 高召回策略
bigbio/cantemist HF 数据集镜像 https://huggingface.co/datasets/bigbio/cantemist — 统一 schema 快速加载
IIC/cantemist-ner HF 数据集镜像 https://huggingface.co/datasets/IIC/cantemist-ner — 含许可与敏感信息声明
NLP-progress(西语 NER 页) 社区榜单 https://github.com/liyunpeng19970428/NLP-progress/blob/master/spanish/named_entity_recognition.md — 成绩横向索引

表中 Star 数未逐一采集(截至 2026-09),使用前请以仓库实时数据为准。


§9 相关资源与引用

§9.1 官方资源

资源 链接
共享任务主页 https://temu.bsc.es/cantemist
参赛系统与数据说明页 https://temu.bsc.es/cantemist?cat=2
Gold Standard 语料(Zenodo) https://zenodo.org/records/3773228
标注指南 PDF(Zenodo) https://zenodo.org/records/3878178
官方评测库(GitHub) https://github.com/TeMU-BSC/cantemist-evaluation-library
Overview 论文(CEUR) https://ceur-ws.org/Vol-2664/cantemist_overview.pdf
CIE-O 3.1 官方手册(西班牙卫生部) https://www.sanidad.gob.es/estadEstudios/estadisticas/normalizacion/CIE10/CIEO-3.1._ACCESIBLE.pdf
eCIE-O 在线编码浏览 https://eciemaps.mscbs.gob.es/ecieMaps/browser/index_o_3.html
联系邮箱 encargo-pln-life@bsc.es(任务咨询)/ bsc-temu@bsc.es(数据策展)
BSC TeMU 单元主页 https://temu.bsc.es
Hugging Face bigbio 镜像 https://huggingface.co/datasets/bigbio/cantemist
Hugging Face PlanTL 镜像 https://huggingface.co/datasets/PlanTL-GOB-ES/cantemist-ner

§9.2 BibTeX 引用

@inproceedings{miranda2020named,
  title     = {Named Entity Recognition, Concept Normalization and Clinical Coding:
               Overview of the Cantemist Track for Cancer Text Mining in Spanish,
               Corpus, Guidelines, Methods and Results},
  author    = {Miranda-Escalada, Antonio and Farr{\'e}, Eul{\`a}lia and Krallinger, Martin},
  booktitle = {Proceedings of the Iberian Languages Evaluation Forum (IberLEF 2020),
               CEUR Workshop Proceedings},
  volume    = {2664},
  pages     = {303--323},
  year      = {2020},
  url       = {https://ceur-ws.org/Vol-2664/cantemist_overview.pdf}
}

@misc{cantemist_corpus_2020,
  title        = {Cantemist corpus: gold standard of oncology clinical cases annotated
                  with CIE-O 3 terminology},
  author       = {Miranda-Escalada, Antonio and Farr{\'e}, Eul{\`a}lia and Krallinger, Martin},
  howpublished = {Zenodo},
  year         = {2020},
  doi          = {10.5281/zenodo.3773228},
  url          = {https://zenodo.org/records/3773228}
}

@misc{cantemist_guidelines_2020,
  title        = {Cantemist guidelines: neoplasms morphology annotation and mapping to CIEO-3},
  author       = {Miranda-Escalada, Antonio and Farr{\'e}, Eul{\`a}lia and Krallinger, Martin},
  howpublished = {Zenodo},
  year         = {2020},
  doi          = {10.5281/zenodo.3878178},
  url          = {https://zenodo.org/records/3878178}
}

@inproceedings{garcia2020vicomtech,
  title     = {Vicomtech at CANTEMIST 2020},
  author    = {Garcia-Pablos, Aitor and others},
  booktitle = {Proceedings of the Iberian Languages Evaluation Forum (IberLEF 2020),
               CEUR Workshop Proceedings},
  volume    = {2664},
  year      = {2020},
  url       = {https://ceur-ws.org/Vol-2664/cantemist_paper17.pdf}
}

@inproceedings{lopez2020extracting,
  title     = {Extracting Neoplasms Morphology Mentions in Spanish Clinical Cases
               through Word Embeddings},
  author    = {L{\'o}pez-{\'U}beda, P. and others},
  booktitle = {Proceedings of the Iberian Languages Evaluation Forum (IberLEF 2020),
               CEUR Workshop Proceedings},
  volume    = {2664},
  year      = {2020},
  url       = {https://ceur-ws.org/Vol-2664/cantemist_overview.pdf}
}

§9.3 引用指南

使用语料请至少引用 Overview 论文(miranda2020named)与 Zenodo 语料 DOI;引用编码规则实践时补充标注指南 DOI;引用基准成绩时注明"IberLEF 2020 官方 test 集,micro-F1 / MAP 口径"。若使用了 Hugging Face 镜像的 CoNLL 转换格式,建议在复现说明中同时给出 Zenodo 原始包来源,避免镜像转换细节影响可比性。


§10 AI 使用声明卡

§10.1 AI 模型列表

模型 用途
CodeBuddy Code(大语言模型 agent) 资料检索汇总、初稿撰写、代码示例生成、格式自检

§10.2 AI 参与范围

AI 负责本页面的检索汇总、结构化写作与代码示例起草;所有硬事实数字均回溯至 §10.3 所列公开来源,医学映射表(ICD-11/SNOMED CT)与基准数字经编辑部规则核对,最终内容责任由千方病案医学编辑部承担。代码示例按"可读性优先"编写,生产环境使用前请在自有数据上完成单元测试;评测口径以官方评测库为准。

§10.3 输入来源列表

  1. CANTEMIST 官方主页(共享任务定义、子任务、语料描述). https://temu.bsc.es/cantemist
  2. CANTEMIST 参赛系统与数据说明页(数据划分、QC 规则、发布时间线). https://temu.bsc.es/cantemist?cat=2
  3. Miranda-Escalada, A., Farré, E., & Krallinger, M. (2020). Named Entity Recognition, Concept Normalization and Clinical Coding: Overview of the Cantemist Track… CEUR Vol-2664, pp. 303-323. https://ceur-ws.org/Vol-2664/cantemist_overview.pdf
  4. Garcia-Pablos, A., et al. (2020). Vicomtech at CANTEMIST 2020. CEUR Vol-2664 (paper17). https://ceur-ws.org/Vol-2664/cantemist_paper17.pdf
  5. Cantemist corpus: gold standard of oncology clinical cases annotated with CIE-O 3 terminology. Zenodo record 3773228. https://zenodo.org/records/3773228
  6. Cantemist guidelines: neoplasms morphology annotation and mapping to CIEO-3. Zenodo record 3878178. https://zenodo.org/records/3878178
  7. TeMU-BSC. cantemist-evaluation-library(官方评测脚本与指标口径). https://github.com/TeMU-BSC/cantemist-evaluation-library
  8. BigScience Biomedical / bigbio. Dataset Card for CANTEMIST. https://huggingface.co/datasets/bigbio/cantemist
  9. PlanTL-GOB-ES. cantemist-ner 数据卡(CoNLL 格式、标注者资质、病例内容描述). https://huggingface.co/datasets/PlanTL-GOB-ES/cantemist-ner
  10. IIC. cantemist-ner 数据卡(许可与敏感信息声明). https://huggingface.co/datasets/IIC/cantemist-ner
  11. Xiong, et al. (2020). A Joint Model for Medical Named Entity Recognition and Normalization(HITSZ-ICRC,语料统计与码结构). CEUR Vol-2664. https://scholar.googleusercontent.com/scholar?as_yhi=2020&q=cache:SpJ7MMXCWAgJ:scholar.google.com/
  12. NLP-progress: Named entity recognition — Spanish(CANTEMIST 2020 榜单). https://github.com/liyunpeng19970428/NLP-progress/blob/master/spanish/named_entity_recognition.md
  13. CANTEMIST Participant Systems(参赛仓库索引). https://temu.bsc.es/cantemist?cat=2
  14. Ministerio de Sanidad(西班牙卫生部). CIE-O 3.1 官方手册(形态学/拓扑学码结构). https://www.sanidad.gob.es/estadEstudios/estadisticas/normalizacion/CIE10/CIEO-3.1._ACCESIBLE.pdf
  15. AIHW METEOR. Morphology of cancer code (ICD-O-3) NNNN/N(8000/3 兜底规则). https://meteor.aihw.gov.au/content/399496
  16. ENCR. Data protocol for the European Cancer Information System (ECIS)(行为位与登记规范). https://www.encr.eu/sites/default/files/Data_call/ECIS-data-protocol_2026_20251120.pdf
  17. Antonio Miranda-Escalada 学术主页快照(引用数与论文列表). https://www.xr-scholar.cn/citations?user=1UFCgX0AAAAJ
  18. Barcelona Supercomputing Center 出版页(CANTEMIST Overview 论文著录信息). https://www.bsc.es/print/research-and-development/publications/named-entity-recognition-concept-normalization-and-clinical

§10.4 人工校验表

内容模块 审核者 审核方式 审核状态
§2 医学背景(ICD-O/ICD-11/SNOMED 映射、流行病学、金标准表) 千方病案医学编辑部 与 CIE-O 3.1 手册及官方页交叉比对 ✅ 已验证
§3 数据集规格(划分数字、QC 流程、许可) 千方病案医学编辑部 与 Zenodo record 及官方页交叉比对 ✅ 已验证
§4 数据结构(目录树、DAIMS 字段字典) 千方病案医学编辑部 与 Brat 格式文档及数据卡示例交叉比对 ✅ 已通过
§5 划分与泄漏讨论 千方病案医学编辑部 交叉审核 ✅ 已通过
§6 代码示例与 8 个坑点 千方病案医学编辑部 逻辑审查 + 与官方评测库口径比对 ✅ 已通过
§7 DAIMS 24 项与偏倚分析 千方病案医学编辑部 交叉审核 ✅ 已通过
§8 排行榜与引用数表述 千方病案医学编辑部 与 CEUR 原文及 Scholar 快照交叉比对 ✅ 已验证
§C JSON-LD @graph 千方病案医学编辑部 Schema 字段逐项校验 ✅ 已通过

§10.5 AI 生成章节标注

本页面全部章节由 AI 起草、人工复核后发布;其中 §1.0/§1.2/§2.5/§8.2 的叙述性评价为基于来源事实的编辑性综合,不代表数据集官方立场。

§10.6 最后人工审核

最后人工审核日期:2026-09-05(与 §0 审核声明一致)。

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


相关数据集导航

以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:

  • thyme — 共享标签:医疗NLP / 临床文本 / 命名实体识别 / 肿瘤学
  • carmen — 共享标签:医疗NLP / 临床文本 / 命名实体识别 / 肿瘤学
  • pharmaconer — 共享标签:医疗NLP / 临床文本 / 命名实体识别
  • distemist — 共享标签:医疗NLP / 临床文本 / 命名实体识别
  • meddoprof — 共享标签:医疗NLP / 临床文本 / 命名实体识别
  • umls — 共享标签:医疗NLP / 临床文本 / 命名实体识别
  • radgraph — 共享标签:医疗NLP / 临床文本 / 命名实体识别
  • maccrobat — 共享标签:医疗NLP / 临床文本 / 命名实体识别
  • coral — 共享标签:医疗NLP / 临床文本 / 肿瘤学
  • mimic-iv-ext-pe — 共享标签:医疗NLP / 临床文本

导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

返回 AI-Ready 数据集