PharmaCoNER — 西班牙语药物实体识别语料 AI-Ready Wikipedia

1,000 篇西语临床病例、7,624 条药物/化学实体标注

来源 Barcelona Supercomputing Center (BSC) Text Mining Unit url: https://www.qianfanghub.com/ai-ready-dataset/pharmaconer/0发布时间: 2026-09-16最后更新: 2026-09-25 阅读 39
PharmaCoNER — 西班牙语药物实体识别语料 AI-Ready Wikipedia

信息速览

数据集名称PharmaCoNER — 西班牙语药物实体识别语料 AI-Ready Wikipedia
数据类型1,000 篇临床病例,7,624 条实体标注,396,988 词,CC-BY-4.0 免费获取
规模1,000 篇临床病例(非患者级数据)
接入方式Barcelona Supercomputing Center (BSC) Text Mining Unit url: https://www.qianfanghub.com/ai-ready-dataset/pharmaconer/0
AI 就绪度

数据集封面

PharmaCoNER — 西语药物实体识别语料 AI-Ready Wikipedia


INFOBOX

项目 内容
数据集名称 PharmaCoNER
英文全称 Pharmacological Substances, Compounds and proteins Named Entity Recognition track
别名/简称 PharmaCoNER corpus;BioNLP-OST 2019 药物实体赛道
疾病分类(ICD-11 编码+中文名) 不适用(非疾病标注语料;覆盖肿瘤、泌尿、心脏、呼吸、感染等病例主题)
SNOMED CT 使用:子赛道 2 概念索引标注 SNOMED-CT 概念 ID;主题范围覆盖 Pharmaceutical / biologic product 与 Substance 层级
数据模态 纯文本(西班牙语临床病例章节,BRAT standoff + CoNLL)
AI 任务类型 命名实体识别(NER offset + 分类)+ 概念索引(Entity Linking)
样本总数 1,000 篇临床病例;7,624 条实体提及;396,988 词
数据大小 约 1.28 MB(CoNLL 版)/ 1.3 MB(SPACCC.zip)
数据格式 BRAT standoff(.txt + .ann)、CoNLL 四列、TSV(概念 ID)
许可证 Creative Commons Attribution 4.0 International(CC-BY-4.0)
访问级别 开放(无需注册,Zenodo / HuggingFace 直接下载)
DUO 标签 GRU(通用研究)+ PUB(须公开发表)
语言 西班牙语(es)
首发日期 2019-03-26(训练/开发集发布);语料论文 2019-11
最后更新 2022-11-15(Zenodo 记录最后修订)
发布机构 Barcelona Supercomputing Center (BSC) Text Mining Unit;CIMA, University of Navarra
官方主页 {url_name}/0
下载地址 {url_name}/0
DOI 10.18653/v1/D19-5701(论文);10.5281/zenodo.4270158(数据)
引用次数 101+(Semantic Scholar,截至 2026-09)
AI 就绪度评分 ⭐⭐⭐⭐(4/5)— 官方 train/dev/test 划分与标注指南齐备、HuggingFace 加载脚本一行可用;但缺官方预处理脚本、标注为 BRAT 原始格式,需手动实现转换与评估
页面状态 published

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

医学审核者:千方病案医学编辑部交叉审核:§2 医学背景(SNOMED-CT 映射、实体类别临床语义、临床任务定义)、§7 偏倚分析。

数据工程审核者:千方病案医学编辑部交叉审核:§4 DAIMS 数据字典(BRAT standoff 解析、CoNLL 四列语义)、§5 数据划分策略、§6 预处理 Pipeline 和坑点。

审核日期:2026-09-05

审核方式:交叉审核

利益冲突声明:千方病案医数集与 Barcelona Supercomputing Center(BSC)、CIMA/University of Navarra、PlanTL 及本页面涉及的任何机构无商业利益关联。本页面不销售 PharmaCoNER 数据集本身,仅提供 AI 就绪指南与学术信息服务。编辑者未接受上述机构的任何形式资助。

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

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

数据使用合规:使用本页面描述的数据集前,请务必阅读并遵守数据集原始许可协议。PharmaCoNER 采用 CC-BY-4.0 许可,允许在署名前提下自由共享与改编(含商业用途);使用时须按论文引用要求署名原作者与机构。DUO 标签仅供参考,具体使用限制以数据集官方协议为准。


§1 数据集概览

§1.0 📌 30 秒速览

这是什么? PharmaCoNER 是一份西班牙语的"药物与化学实体词典级"标注语料。它从 SciELO 开放获取的西班牙语医学期刊中,挑选了 1,000 篇临床病例章节,请药物化学专家逐字标出其中的药名、化学物质名、蛋白/基因名——总共 7,624 条实体。语料还附带了第二个任务:为每篇病例标出它提到的药物对应的 SNOMED-CT 国际医学术语编码。它是 BioNLP-OST 2019 共享任务之一,也是第一个专门针对西班牙语医学文本的药物实体识别竞赛语料。

为什么重要? 全球生物医学文本挖掘的绝大部分资源都是英文的。但临床文本几乎总是用本国语言书写——西班牙语母语者超过 4.77 亿人,西班牙一国就有逾 18 万名执业医师。英文语料上训练的模型无法直接迁移到西班牙语临床文本:药物商品名、缩写、重音字符、拉丁美洲与西班牙本土用词差异,都是模型必须重新学习的。PharmaCoNER 第一次为这一空白提供了人工金标准,并给出了可比较的基准线(子赛道 1 最高 F1 0.91052)。

我能用它做什么? 最直接的用途是训练和评测西班牙语药物实体识别模型。其次是做 SNOMED-CT 概念索引(实体链接)研究,这是子赛道 2 的目标。由于语料完全开放(CC-BY-4.0)、体积仅约 1.3 MB、且 HuggingFace 上有一行加载的数据脚本,它非常适合用作西班牙语临床 NLP 的教学素材与迁移学习实验的低成本起点。它也被用于药物不良反应检测、用药相关虚假信息识别、药物-靶点关系抽取等下游任务的上游组件。

§1.1 摘要

PharmaCoNER(Pharmacological Substances, Compounds and proteins Named Entity Recognition track)是 2019 年 BioNLP-OST 共享任务六个赛道之一,由西班牙巴塞罗那超级计算中心(Barcelona Supercomputing Center, BSC)生物文本挖掘单元(TeMU)与纳瓦拉大学应用医学研究中心(CIMA)联合组织,受西班牙"语言技术推动计划"(Plan de Impulso de las Tecnologías del Lenguaje, PlanTL)资助,成果版权归属西班牙数字化与人工智能国务秘书处(SEAD/SEDIA)。

语料的构建路径是"先建源语料、再做专家标注"。组织方首先从 SciELO(Scientific Electronic Library Online)开放获取的西班牙语医学期刊中,由一位执业肿瘤科医生人工筛选出 1,000 篇"临床病例描述章节",再由临床文献专家复核其结构与内容是否接近真实临床记录,形成了西班牙语临床病例语料 SPACCC(1,000 篇 / 396,988 词)。随后,药物化学与药理学专家在这些文本上完成提及级(mention-level)标注:4,398 条 NORMALIZABLES(可归一化到 SNOMED-CT 的化学物)、50 条 NO_NORMALIZABLES、3,009 条 PROTEINAS(蛋白/基因,含肽、肽类激素与抗体)、167 条 UNCLEAR(一般物质类别,不参与评测),合计 7,624 条实体提及。标注工作沿用了 BioCreative CHEMDNER 与 GPRO 两套英文指南,翻译为西班牙语后依据临床文本的信息需求做了规则修改,并通过多轮标注者间一致性(IAA)研究迭代校准,最终标注 IAA 达 93%、概念映射 IAA 达 73%。

任务设置两个子赛道:子赛道 1 要求系统输出实体的精确边界(offset)与类别;子赛道 2 要求系统为每篇文档给出一组唯一的 SNOMED-CT 概念 ID。语料按 500/250/250 随机划分为训练、开发与测试集,另提供 2,751 篇无标注背景集用于银标准扩充。子赛道 1 共 22 支队伍提交 77 次运行,子赛道 2 共 7 支队伍提交 19 次运行;最高分分别为 F1 0.91052 与 0.91593。

§1.2 战略价值

维度一:非英语生物医学 NLP 的基础设施缺口填补。 在 PharmaCoNER 之前,药物与化学实体识别的主流资源——CHEMDNER、BC5CDR、BioCreative GPRO——全部是英文的。这意味着任何面向西班牙语市场的临床文本挖掘应用,要么从零标注数据,要么依赖机器翻译后的英文模型,后者在药物商品名与西班牙语缩写上错误率极高。PharmaCoNER 通过公开发布标注指南、金标准、银标准与训练好的 tagger,把西班牙语药物 NER 的起点从"没有数据"提升到"有可比基准"。这一价值在其后的西班牙语临床 NLP 生态中得到了验证:从 BARR2、CANTEMIST、MEDDOCAN 到 DisTEMIST、LivingNER,西班牙语临床语料呈现明显的"PlanTL 家族"特征,共享相似的许可(CC-BY-4.0)、标注工具(BRAT)与发布渠道(Zenodo),PharmaCoNER 是这一家族中较早、且唯一专注药物实体的成员。

维度二:为实体链接研究提供了带概念的标注对。 大多数 NER 语料只标边界和类别,不做概念归一化。PharmaCoNER 的第二个子赛道要求把 4,398 条 NORMALIZABLES 提及映射到 SNOMED-CT 概念 ID,这使其成为少数同时具备"提及级 NER 金标准"与"文档级概念索引金标准"的语料。对于研究实体链接、知识库对齐、医学概念规范化的团队,这份双任务标注是难得的评估材料。其概念索引 IAA 为 73%,明显低于标注 IAA 的 93%——这个差距本身就揭示了西班牙语药物概念归一化的真实难度,也是该语料最有价值的"负面知识"之一。

维度三:低资源临床 NLP 的高性价比练手集。 语料体积仅约 1.3 MB,1,000 篇文档、16,504 个句子,可以在单张消费级 GPU 甚至 CPU 上完成完整微调。配合 HuggingFace 上一行加载的数据脚本,任何团队都能在数小时内搭起一条西班牙语药物 NER 的完整流水线。对于教学、课程项目、跨语言迁移学习的对照实验,它是极佳的成本/收益平衡点。

§1.3 同类数据集横向对比

数据集 语言 规模(train/val/test) 模态 标注内容 与 PharmaCoNER 的差异化
PharmaCoNER 西班牙语 500 / 250 / 250 篇 文本(临床病例) 药物/化学/蛋白实体 + SNOMED-CT 概念 唯一专注西语药物化学实体,含概念索引子任务
MEDDOCAN 西班牙语 500 / 250 / 250 篇 文本(临床病例) 个人身份信息(PHI) 同源 SPACCC 抽样,任务是去标识化而非药物实体
CANTEMIST 西班牙语 501 / 500 / 300 篇 文本(肿瘤记录) 肿瘤形态学实体 + ICD-O 任务域为肿瘤命名实体,非药物
DisTEMIST 西班牙语 750 / 0 / 250 篇 文本(临床记录) 疾病实体 + SNOMED-CT 目标是疾病而非药物;无 dev 划分
LivingNER 西班牙语 1,000 / 500 / 485 篇 文本(多来源) 物种命名实体 目标为物种名,与临床用药无关
SocialDisNER 西班牙语 6,000 / 2,000 / 2,000 文本(社交媒体) 疾病提及 语域为推特非正式语,与临床病例差异极大
CHEMDNER 英文 10,000 篇摘要 文本(PubMed 摘要) 化学物与药物 英文对照版本,PharmaCoNER 指南直接改编自它
BC5CDR 英文 1,500 篇 文本(PubMed) 化学物 + 疾病 + 关系 同时含关系抽取标注,规模更大但为英文

注:上表规模数据来自西班牙语临床 NLP 综述论文的汇总表(arXiv:2308.02199)与各语料官方页面;不同论文对 train/val/test 列名的口径可能不同(样本数 vs 文档数),横向比较时需注意口径。PharmaCoNER 与 MEDDOCAN、CANTEMIST、CodiEsp、DisTEMIST、LivingNER、SocialDisNER、BARR2 同属 PlanTL 资助的西班牙语临床 NLP 语料家族,许可均为 CC-BY-4.0。

§1.4 版本时间轴

日期 事件 备注
2018-11-27 SPACCC 源语料发布(Zenodo 2560316) 1,000 篇临床病例 / 396,988 词,CC-BY-4.0
2019-03-18 样例集与评测脚本发布 参赛者可用样例调试提交格式
2019-03-26 训练集与开发集发布 train 500 篇 / dev 250 篇
2019-05-31 测试集发布(含背景集) test 250 篇 + 2,751 篇无标注背景集
2019-06-25 评测期结束(系统提交截止) 子赛道 1:77 runs;子赛道 2:19 runs
2019-07-01 带金标准标注的测试集发布 允许参赛者复盘错误分析
2019-08-19 Working notes 论文提交截止 各参赛队系统描述论文
2019-09-16 论文录用通知(同行评审)
2019-11-04 BioNLP-OST 2019 Workshop(中国香港) 与 EMNLP-IJCNLP 2019 合办
2019-11 语料主论文发表于 ACL Anthology(D19-5701) 页 1-10
2020-11 Zenodo 数据集记录建立(10.5281/zenodo.4270158) 含金标准、背景集与标注指南
2022-11-15 Zenodo 记录最后修订 构建日期字段对应的最后版本
2022 HuggingFace PlanTL-GOB-ES/pharmaconer 脚本发布 版本号 1.1.0,CoNLL 四列格式
2023-08 西班牙语临床语言模型综述收录 arXiv:2308.02199 将其列为标准 NER 语料

§1.5 典型应用场景

场景 1:西班牙语临床药物实体识别模型训练。 最核心的用途。使用 500 篇训练集微调多语言 BERT 或西班牙语临床预训练模型(如 RigoBERTa Clinical、BETO 系),在 250 篇测试集上评估。任务形式是 B/I/O 序列标注,8 个标签(O + B/I × 4 类)。

场景 2:SNOMED-CT 概念索引(实体链接)研究。 给定一篇文档,输出该文档提到的所有药物对应的 SNOMED-CT 概念 ID 集合。这是一个集合匹配任务,评测用 micro-average F1。适合研究词典匹配、实体嵌入相似度检索与混合检索策略。

场景 3:跨语言迁移学习的对照实验。 用英文 CHEMDNER 或 BC5CDR 预训练,再迁移到 PharmaCoNER;或反向研究"英文药物 NER 模型在西班牙语上衰减多少"。由于 PharmaCoNER 的标注指南直接改编自 CHEMDNER 与 GPRO,标签语义可比性较高,是设计跨语言实验的理想对照组。

场景 4:临床文本预处理组件开发。 PharmaCoNER 配套发布了西班牙语医学分词器、分句器、词形还原器、POS tagger、化学药物词典、医学缩写词表与药物命名前后缀规则。这些工具可用于搭建更广泛的西班牙语临床 NLP 流水线,而不限于本次任务本身。

场景 5:药物不良反应与用药信息监测的上游模块。 论文明确指出,药物实体识别是后续药物不良反应检测、用药相关虚假信息识别、药物-靶点关系抽取的必备前置步骤。PharmaCoNER 训练的识别器可作为这些下游系统的输入层。

场景 6:教学与课程项目。 语料小、任务清晰、有金标准、有公开排行榜,且许可宽松,非常适合作为 NLP 课程中序列标注与实体链接模块的课程作业数据。


§2 医学背景

§2.1 ICD-11 编码表

PharmaCoNER 本身不标注疾病,因此不存在"语料层面的 ICD-11 编码"。但语料的来源文档覆盖多个临床学科,其主题可映射到 ICD-11 章节。下表给出语料涉及的临床主题与对应 ICD-11 分类,用于理解数据的临床分布,而非逐条标注映射。

临床领域 ICD-11 章节 ICD-11 编码范围 语料中的角色
肿瘤 02 Neoplasms 2A00-2F9Z 语料主要来源学科之一;化疗方案实体集中出现
泌尿系统疾病 16 Diseases of the genitourinary system GC00-GC9Z 常见病例类型;泌尿系统用药密集
循环系统疾病 11 Diseases of the circulatory system BA00-BE2Z 心血管用药(抗凝、降压、他汀类)密集
呼吸系统疾病 12 Diseases of the respiratory system CA00-CB9Z 抗感染与平喘类用药
感染性疾病 01 Certain infectious or parasitic diseases 1A00-1H0Z 抗生素实体高度集中
内分泌/代谢 05 Endocrine, nutritional or metabolic diseases 5A00-5D46 降糖药、激素类实体

需要强调:上表是对语料学科分布的定性归纳,来自官方对 SPACCC 的学科描述(肿瘤、泌尿、心脏、呼吸、感染病等)。PharmaCoNER 不提供疾病层面的金标准标注,任何疾病编码映射都需要另行标注。

§2.1b SNOMED CT 映射表

PharmaCoNER 与 SNOMED-CT 的关系是任务级的,不是简单的标签映射。子赛道 2 要求把文档中可归一化的化学物提及映射到 SNOMED-CT 概念 ID。下表说明四类实体与 SNOMED-CT 的关系。

PharmaCoNER 标签 与 SNOMED-CT 的关系 SNOMED-CT 语义层级 术语示例
NORMALIZABLES 可人工归一化到 SNOMED-CT 概念 ID Pharmaceutical / biologic product;Substance 具体药物成分、化学物质名
NO_NORMALIZABLES 无法归一化到唯一概念 ID 无对应唯一概念 含义模糊或未收录的化学物提及
PROTEINAS 本任务未要求映射 SNOMED-CT;遵循 BioCreative GPRO 指南 无对应(蛋白/基因域由其他本体覆盖) 蛋白、基因、肽类激素、抗体
UNCLEAR 不参与评测,也不做概念映射 部分可对应一般 Substance 概念 化疗方案名、疫苗、制剂类别、通用物质(如 Alcohol、Gluten)

官方并未在数据发布中附带一份"常用药物 → SNOMED-CT 码"的映射词典供直接使用,映射关系以文档级编码列表的形式存在于子赛道 2 的金标准中。这意味着使用者若要做概念索引,需要自己接入西班牙语版 SNOMED-CT 发行版(受 UMLS/SNOMED International 许可约束,与 CC-BY-4.0 的语料许可相互独立),这一点是实践中最容易踩坑的地方之一(详见 §6.5 坑点 5)。

§2.2 临床背景与数据来源语境

理解 PharmaCoNER,必须先理解"临床病例报告"(clinical case report)这种文体的特殊性。病例报告是对单一临床观察的科学记录,结构上通常是"引言—病例描述—讨论",包含患者人口学信息、主诉、既往史、检查发现、诊断、治疗经过与转归。组织方明确指出了一个关键性质:这类叙事"同时具有生物医学文献与临床记录(如出院小结)的双重特性"。这正是选择病例报告而非期刊综述或社交媒体文本的原因——它既有正式医学出版物的术语规范,又有接近真实病历的自由行文与缩写习惯。

语料的原始出处是 SciELO(Scientific Electronic Library Online),一个汇集拉丁美洲、南非与西班牙科学期刊全文的开放获取电子图书馆。组织方从 SciELO 中抽取临床病例,由执业肿瘤科医生人工分类为"结构与内容接近真实临床文本"与"不适用于本任务"两类,并自动移除图注、把包含多个病例的文章拆分为单篇病例。由此产生了 SPACCC(Spanish Clinical Case Corpus),也就是 PharmaCoNER 的母语料。SPACCC 的 1,000 篇病例在学科上分布广泛,覆盖肿瘤、泌尿、心脏、呼吸、感染病等,这种多样性被组织方视为"能覆盖多样化化学物与药物"的必要条件。

从文本挖掘的角度,Spanish Clinical Case Corpus 的价值还在于它是 PlanTL 西班牙语临床 NLP 语料家族的共同母体。MEDDOCAN、CANTEMIST 等语料都从 SPACCC 抽样或与之共享来源,这形成了西班牙语临床 NLP 生态中一个重要特征:多个数据集之间可能存在文档级重叠,跨数据集混合训练时必须检查重叠(详见 §5.3)。

§2.3 临床任务定义

PharmaCoNER 定义的不是临床决策任务,而是支撑临床决策的文本理解任务。下表把两个子赛道翻译为临床 NLP 工作流中的具体任务定位。

临床 NLP 任务层 PharmaCoNER 对应设计 输入 输出 临床意义
实体识别(筛查级) 子赛道 1:NER offset + 实体分类 病例纯文本 实体边界 + 4 类标签之一 从非结构化临床叙述中定位所有药物/化学/蛋白提及
概念规范化(诊断级类比) 子赛道 2:概念索引 病例纯文本 该文档涉及的唯一 SNOMED-CT 概念 ID 集合 把自由文本药名对齐到标准术语,支持跨机构聚合
关系抽取(后续任务,本语料不覆盖) 未标注 — — 药物-靶点、药物-不良反应关系
用药信息结构化(后续任务,本语料不覆盖) 未标注 — — 剂量、频次、疗程、给药途径

需要特别注意:PharmaCoNER 只做提及级(mention-level)标注,不标注剂量、频次、疗程或药物相互作用。论文在讨论部分明确将其列为"未来任务"。因此,任何试图从 PharmaCoNER 直接获得用药方案信息的做法都是超出语料设计范围的误用。

§2.4 患者人群表

维度 说明 来源
来源 SciELO 开放获取西班牙语医学期刊中的临床病例描述章节 官方语料描述
时间范围 语料构建于 2018 年,源文献跨越多个年份(官方未披露具体起止) SPACCC 发布信息
年龄 未做统一披露;病例报告涉及的年龄跨度大,含儿科与老年病例 官方未披露具体分布
性别 官方未披露具体分布 —
种族/族裔 官方未披露;来源期刊覆盖西班牙与拉丁美洲 —
就医类型 不适用(病例报告,非医院信息系统记录) —
地理覆盖 西班牙语国家(西班牙及拉丁美洲 SciELO 期刊来源国) 官方语料描述
学科分布 肿瘤、泌尿、心脏、呼吸、感染病等 官方语料描述
病例类型 单一临床观察的科学记录,经医师筛选为"接近真实临床文本" SPACCC README

因为 PharmaCoNER 是公开文献文本语料而非患者级 EHR 数据,它不包含可分析的患者人口学变量。任何需要患者层面协变量的研究都不能基于此语料,这是使用前必须澄清的边界。

§2.5 临床价值

PharmaCoNER 的临床价值是间接的、工具性的,体现在三个层面。

第一,它是"可迁移的术语基础设施"。西班牙语临床文本中的药名表达极其多样:国际非专利名(INN)、商品名、化学名、缩写、拉丁美洲与西班牙本土的俗称并存。一个能稳定识别这些提及的系统,是任何用药安全监测、临床决策支持或药物流行病学研究的前置条件。PharmaCoNER 提供的金标准使这类系统可以被客观评测,而不是各说各话。

第二,它验证了"非英语临床 NLP 是可行的"。任务结果显示,顶尖系统在子赛道 1 上达到 F1 0.91052,与英文药物 NER 的水平可比。这个结论对西班牙语临床 NLP 的投入决策有实际影响——它说明差距不在方法,而在资源。

第三,它给出了"哪些部分仍然难"的清晰地图。NORMALIZABLES 类别系统性优于 PROTEINAS 类别 4 至 9 个百分点;NO_NORMALIZABLES 类别的中位数 F1 为 0,意味着半数以上系统直接放弃该类别;概念索引的最高分(0.91593)虽高,但整体中位数只有 0.81058,且与第二名的差距超过 6 分,说明该任务的成功高度依赖具体的资源工程而非通用方法。这些负面结果对临床 NLP 项目的风险预判极有价值。

§2.6 金标准表

划分 文档数 金标准性质 标注方式 标注者 用途
训练集(train) 500 篇 人工金标准 BRAT standoff 实体标注 + 概念 ID 药物化学与药理学专家 模型训练
开发集(dev) 250 篇 人工金标准 同上 同上 超参数调优与早停
测试集(test) 250 篇 人工金标准 同上 同上 最终评测(共享任务期间隐藏金标准)
背景集(background) 2,751 篇 无标注 无 无 团队预测生成银标准语料

标注质量的关键数字:标注者间一致性(IAA)在实体标注任务上达 93%,在概念映射任务上为 73%。这两个数字的区别很重要——93% 说明"哪里是药物提及"这件事在专家之间有高度共识;73% 说明"这个提及对应哪个 SNOMED-CT 概念"存在实质分歧。后者不是标注失误,而是药物概念本身的多义性与粒度选择问题的真实反映。

标注流程采用迭代一致性校准:组织方先把 BioCreative CHEMDNER 与 GPRO 的英文指南翻译为西班牙语,在 SPACCC 的样例集上试标,通过 IAA 研究反复修正标注标准,直到达成高一致性后才正式标注全量。这个过程由执业医师与药物化学专家共同参与规则的临床化改写。


§3 数据集规格

§3.0 版本抉择矩阵

PharmaCoNER 存在多个获取渠道与格式版本,选择取决于你的下游用途。

你的需求 推荐版本 大小 理由
想最快跑通 NER 基线 HuggingFace PlanTL-GOB-ES/pharmaconer(v1.1.0,CoNLL) 约 1.28 MB load_dataset 一行加载,已是 token 级 B/I/O 标签,无需解析 BRAT
需要实体边界与概念 ID 的完整信息 Zenodo 记录 4270158(BRAT standoff + TSV) 约 1 MB(压缩) BRAT .ann 保留原始 offset;TSV 提供子赛道 2 概念 ID
研究概念索引/实体链接 Zenodo 记录 4270158 的 subtask-2 TSV 同上 文档级 filename + code 两列,是唯一的概念金标准来源
需要更大规模文本做领域预训练 SPACCC 全量(Zenodo 2560316) 1.3 MB 1,000 篇无实体标注,但含完整病例正文,可用于 MLM 继续预训练
需要无标注数据做半监督 PharmaCoNER background set 随 Zenodo 记录发布 2,751 篇无标注文档,官方用于生成银标准
快速原型/教学演示 HuggingFace bigbio/pharmaconer(BigBIO) 约 1 MB 统一的 BigBIO KB schema,可与其他生物医学 NER 语料共享代码路径

注意:不同渠道的行数/句子数统计存在细微差异(早期描述记 8,129/3,787/3,952 句,官方 HuggingFace 脚本记 8,074/3,764/3,931 句)。做严格可复现实验时应以官方 HuggingFace 脚本(v1.1.0)的统计为准,并在论文中注明所用版本。

§3.1 模态详情

维度 说明
模态 纯文本,单一模态
语言 西班牙语(es),单语
文本单位 临床病例描述章节(一篇 = 一个文档)
平均长度 396.2 词/篇(官方披露)
句子总数 16,504 句(官方 Zenodo 描述)
字符集 拉丁字母含重音符号(á é í ó ú ü ñ)与常见医学缩写
文档类型 叙事性医学散文,结构含患者描述、检查、诊断、治疗、讨论
是否含图像 不含;源文献图注已被自动移除
是否含表格 源文献中的表格在语料构建中未被保留为结构化数据

作为对比参照,同源的 SPACCC 在另一份综述中被记为 382,470 tokens,而 PharmaCoNER 官方记 396,988 words。两者统计口径不同(token 切分规则差异),不应直接互算。

§3.2 按子集样本数表

子集 文档数 标注句数(官方 HF 脚本 v1.1.0) 标注句数(早期描述) 占比
train 500 8,074 8,129 50%
dev 250 3,764 3,787 25%
test 250 3,931 3,952 25%
合计(金标准) 1,000 15,769 15,868 100%
background(无标注) 2,751 — — 不适用
语料总词数 — 396,988 词 — —
语料总句数 — 16,504 句 — —

注:15,769 与 16,504 两个句数口径的差异,可能源于"含标注句"与"全文句"的区分。官方未逐一解释该差异,使用时建议以实际加载后的计数为准,不要预设某个数字。

§3.3 格式表

格式 文件 结构 适用子赛道 说明
BRAT standoff .txt + .ann 文本文件 + 独立标注文件 子赛道 1 标注行形如 T1\tNORMALIZABLES 120 129\tmetformina
CoNLL 四列 train-set_1.1.conll 等 token 级四列,句间空行 子赛道 1 HuggingFace 版格式;四列为 ID、token、标签等
TSV 概念索引文件 filename + code 两列 子赛道 2 每行一个 文档-概念ID 对,一篇文档多行
纯文本 .txt 无标注正文 背景集 2,751 篇无标注文档
Zip 归档 SPACCC.zip 打包的病例文本 源语料 Zenodo 2560316,1.3 MB

BRAT 的 .ann 文件是理解原始语料的关键。标注行格式为 T<编号>\t<类型> <起始偏移> <结束偏移>\t<提及原文>,偏移以字符为单位(不是字节),对含重音符号的西班牙语文本,字符与字节的差异会导致偏移错位,这是预处理中最容易出现的错误(详见 §6.5 坑点 2)。

§3.4 存储大小

项目 大小 来源
PharmaCoNER CoNLL 版(HF 镜像统计) 约 1.28 MB HuggingFace IIC/pharmaco-ner 页面统计
SPACCC.zip(源语料) 1.3 MB Zenodo 2560316 文件清单
解压后文本(估算) 数 MB 量级 官方未单独披露

官方未单独披露 PharmaCoNER 自身归档的精确字节数。上表所列是社区镜像与源语料页面的公开统计。这个体量意味着:整个语料可以放在一封电子邮件的附件里,加载到内存后占用极小,任何硬件配置都不是瓶颈。

§3.5 标注方式

层级 方式 执行者 说明
源文本筛选 人工 执业肿瘤科医师 从 SciELO 全量中筛选"接近真实临床文本"的病例
源文本复核 人工 临床文献专家 复核代表性、结构与内容相关性
实体标注 人工(专家) 药物化学与药理学专家 提及级标注,BRAT 工具
概念映射 人工(专家) 药物化学与药理学专家 映射到 SNOMED-CT 概念 ID
指南开发 人工 + 迭代 医师 + 药物化学专家 改编 CHEMDNER/GPRO 指南,IAA 迭代校准
银标准生成 自动(集成) 参赛系统预测融合 用于背景集的弱标注扩充

该语料属于纯人工金标准,不含任何自动标注成分(银标准是独立于金标准之外的补充资源)。这一点对其作为评估基准的可信度至关重要。

§3.6 标注者资质与一致性

项目 内容
实体标注者 药物化学与药理学专家(medicinal chemistry and pharmacology experts)
指南临床化参与 执业医师(practicing physicians)
初始筛选者 执业肿瘤科医师
复核者 临床文献专家(clinical documentalist)
实体标注 IAA 93%
概念映射 IAA 73%
校准方法 样例集上的迭代式标注一致性分析,直到达成高 IAA 才全量标注
标注工具 BRAT(brat.nlplab.org)

93% 与 73% 的差距是本语料最重要的质量信号。它说明"识别药物提及"在专家间争议较小,而"把药物提及对齐到唯一 SNOMED-CT 概念"存在系统性分歧。常见分歧来源包括:同一药物成分对应多个概念(成分 vs 产品)、复方制剂的粒度选择、以及西班牙语药名与 SNOMED-CT 西班牙语版术语的表述差异。使用概念索引金标准时,应把 73% 视为性能上限的现实参照,而不是把 100% 当作可达目标。

§3.7 采集周期

阶段 时间 说明
SPACCC 构建与发布 2018-11-27 Zenodo 记录建立
标注指南开发与 IAA 校准 2018 年内 官方未披露精确起止
语料标注完成 2019 年上半年 与训练集发布(2019-03-26)时间线吻合
共享任务运行 2019-03 至 2019-11 含提交、评测、论文与工作坊
金标准与背景集公开 2020-11(Zenodo 记录)至 2022-11(最后修订) 版本号 1.1

§3.8 地域覆盖

维度 内容
文本来源国 西班牙,以及 SciELO 收录的拉丁美洲国家期刊
SciELO 覆盖范围 拉丁美洲、南非与西班牙的开放获取科学期刊
语言变体 以西班牙(欧洲)医学术语为主,可能混入拉丁美洲用词
机构来源 文本来自公开期刊,不含单一医院或单一机构的系统性偏斜
地理限制 无;CC-BY-4.0 允许全球范围内使用

一个常被忽略的问题是语言变体偏斜。SciELO 同时收录西班牙与拉丁美洲期刊,但医学写作规范上,欧洲西班牙语术语(如 paracetamol vs 拉美 acetaminofén)的使用比例可能不均。官方未披露按国家或语言变体的分布统计,因此无法量化这一偏斜。若模型要部署到特定拉美国家,建议先做小规模术语差异审计。

§3.9 设备规格

项目 说明
采集设备 不适用(文本来自公开出版物)
标注工具 BRAT 标注平台
硬件要求(官方) 官方未披露
硬件要求(使用侧) 微调 BERT-base 级模型建议 1 张 8 GB 以上显存 GPU;推理与教学可 CPU 完成

§3.10 深度溯源链

层级 内容 可验证来源
L1 原始出版 SciELO 开放获取西班牙语医学期刊中的临床病例文章 scielo.org
L2 语料筛选 肿瘤科医师筛选 + 临床文献专家复核,移除图注、拆分多病例文章 SPACCC README
L3 源语料 SPACCC:1,000 篇 / 396,988 词,CC-BY-4.0 Zenodo 2560316
L4 标注语料 PharmaCoNER:1,000 篇,7,624 条实体 + 概念 ID Zenodo 4270158
L5 格式分发 BRAT standoff(Zenodo)/ CoNLL(HuggingFace v1.1.0)/ BigBIO(社区) 各渠道页面
L6 共享任务 BioNLP-OST 2019,22 队(子赛道 1)/ 7 队(子赛道 2) ACL Anthology D19-5701

溯源链完整且每一层都有公开可验证的记录,这在临床 NLP 语料中并不常见。使用者在论文中应至少引用 L3(SPACCC)与 L4(PharmaCoNER)两个来源,避免只引语料而遗漏源文本的许可与筛选过程。


§4 数据结构

§4.0 目录树

Zenodo 归档与 HuggingFace 仓库的目录结构略有不同。以下为两类分发的典型形态。

pharmaconer/                          # Zenodo 4270158 解压后(BRAT 版)
├── train/
│   ├── S0001-1.txt                   # 病例纯文本(UTF-8)
│   ├── S0001-1.ann                   # BRAT 标注文件
│   ├── ...
│   └── (共 500 篇 txt + 500 篇 ann)
├── dev/
│   ├── S0500-1.txt
│   ├── S0500-1.ann
│   └── (共 250 篇 txt + 250 篇 ann)
├── test/
│   ├── S0750-1.txt
│   ├── S0750-1.ann
│   └── (共 250 篇 txt + 250 篇 ann)
├── background/
│   └── (2,751 篇无标注 .txt)
├── subtask2/
│   ├── train_codes.tsv               # 概念索引:filename \t code
│   ├── dev_codes.tsv
│   └── test_codes.tsv
└── annotation_guidelines.pdf          # 标注指南

pharmaconer/                          # HuggingFace PlanTL-GOB-ES/pharmaconer
├── README.md
├── pharmaconer.py                    # 数据加载脚本,版本 1.1.0
├── train-set_1.1.conll               # 四列 CoNLL,token 级
├── dev-set_1.1.conll
└── test-set_1.1.conll

BRAT 版与 CoNLL 版不是简单互换关系。BRAT 保留字符级 offset 与文档结构,适合做概念索引与自定义切分;CoNLL 版已完成分词与标签对齐,适合直接送入序列标注模型,但丢失了文档边界信息(不同文档的句子在文件中以空行分隔,需依赖 id 字段或按文件切分)。选择哪一版取决于你的任务(详见 §3.0)。

§4.1 DAIMS 数据字典

下表描述 CoNLL 版与 BRAT 版的核心字段语义。字段名以 HuggingFace 脚本(v1.1.0)与 BRAT 规范为准。

字段名 类型 说明 示例值 AI 用途 观测误差 信息性缺失编码 取值范围
id string 句子标识(HF 版),通常含文档标识与句序 S0001-1-s3 分组、切分、可复现采样 官方未披露具体构造规则 无 任意字符串
tokens sequence[string] 分词后的 token 序列 ["El", "paciente", "recibió", "metformina"] 模型输入 分词规则影响边界对齐 无 西班牙语子词
ner_tags sequence[ClassLabel] 与 tokens 等长的 B/I/O 标签序列 ["O","O","O","B-NORMALIZABLES"] 监督信号 与分词粒度耦合;嵌套实体被展平 O 表示非实体 O / B,I × 4 类,共 9 个标签
T<编号>(BRAT) 标注行 ID BRAT 实体标注的唯一编号 T1 实体级聚合 仅文件内唯一 无 T + 整数
类型(BRAT) 实体类别 四类之一 NORMALIZABLES 分类目标 UNCLEAR 不参与评测 无 NORMALIZABLES / NO_NORMALIZABLES / PROTEINAS / UNCLEAR
起始偏移(BRAT) integer 实体在原文中的起始字符位置 120 复用原始 offset 字符 vs 字节错位风险高 无 ≥ 0
结束偏移(BRAT) integer 实体结束字符位置(不含) 129 同上 同上 无 > 起始偏移
提及原文(BRAT) string 实体表面形式 metformina 词典构建、错误分析 大小写与重音需标准化 无 西班牙语字符串
filename(TSV) string 文档标识 S0001-1 文档级聚合 需与 txt/ann 文件名严格一致 无 文档 ID
code(TSV) string SNOMED-CT 概念 ID 具体数字概念码 实体链接目标 概念版本漂移 部分文档可能无概念行 SNOMED-CT 概念标识

实际可用的标签体系(HF ClassLabel,共 9 个)为:O、B-NO_NORMALIZABLES、B-NORMALIZABLES、B-PROTEINAS、B-UNCLEAR、I-NO_NORMALIZABLES、I-NORMALIZABLES、I-PROTEINAS、I-UNCLEAR。注意类别的排列顺序,它决定了标签 ID 映射,写评估代码时不要凭直觉假设顺序(详见 §6.5 坑点 1)。

§4.2 标签分布

实体类别 提及数 占比 是否参与评测 备注
NORMALIZABLES 4,398 57.7% 是 主干类别,可映射 SNOMED-CT
PROTEINAS 3,009 39.5% 是 蛋白/基因/肽/抗体,指南改编自 GPRO
NO_NORMALIZABLES 50 0.66% 是 极度稀疏,多数系统忽略
UNCLEAR 167 2.2% 否 标注但排除在评测外
合计 7,624 100% —

这个分布是理解整个语料难点的钥匙。两个评测类别加起来占 97.2%,但它们的比例是 59:41;而 NO_NORMALIZABLES 只有 50 条,在 7,624 条中几乎不可学习。论文明确记录了后果:该类别在中位数系统上的 F1 为 0,说明半数以上的参赛系统完全放弃了它(详见 §6.5 坑点 4)。

§4.3 关键统计

统计项 数值 来源
文档总数 1,000 篇 官方语料描述
总词数 396,988 词 官方语料描述
平均词数/篇 396.2 词 Zenodo 官方描述
总句数 16,504 句 Zenodo 官方描述
实体提及总数 7,624 条 论文 §2.2
平均实体密度 约 7.6 条/篇 推算(7,624 / 1,000)
平均句长 约 24.1 词/句 推算(396,988 / 16,504)
概念索引文档数 250 篇测试集文档 子赛道 2 金标准
background 文档数 2,751 篇 综述论文汇总

推算值已明确标注为推算。使用时若需精确数字,应自行从 CoNLL 版统计 token 数与实体数——不同分词器会得到略有差异的结果。

§4.4 数据层级

层级 单位 数量关系 携带标注
L1 语料 全部文档 1 个 无
L2 文档 一篇临床病例 1,000 篇 文档级概念 ID(子赛道 2)
L3 句子 一个句子 约 16,504 句 无(句边界由分词/分句确定)
L4 token 一个词/子词 约 396,988 词 token 级 B/I/O(子赛道 1)
L5 实体提及 一个连续 span 7,624 条 类别 + 字符 offset + 概念 ID

注意 L4 与 L5 不是严格的包含关系:一个实体提及可能跨越多个 token(对应多个 B/I 标签),也可能在分词后与 token 边界不重合。模型层面的标签是 token 级的,实体层面的评估必须先把 token 级预测还原为 span,这一步的还原规则直接决定评测分数(详见 §6.5 坑点 3)。

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

缺失情形 编码方式 信息性含义 处理建议
非实体 token O 标签 明确表示"此处无药物/蛋白实体" 作为负样本正常参与训练
UNCLEAR 提及 独立标签 B/I-UNCLEAR 有实体但官方不评测 训练时可保留(提供信号),评测时必须排除
概念 ID 缺失 TSV 中该文档无对应行 该文档无可归一化药物提及 在文档级集合评估中视为空集,非缺失
背景集无标注 无 .ann 文件 官方未提供金标准,用于团队预测生成银标准 不可用于监督训练,除非自建弱标签
患者人口学字段 不存在 语料为公开文献文本,本就不含此类字段 不要构造虚假的"缺失值处理"流程
语料自身的空白行 CoNLL 中的空行 句边界分隔符 按句切分时作为分隔标记,不作为缺失

PharmaCoNER 的"缺失"概念与结构化临床数据集(如 MIMIC)完全不同。这里没有检验值缺失、没有生命体征缺失、没有出院小结缺失——因为数据本身不是从信息系统导出的。唯一需要认真处理的是 O 标签与 UNCLEAR 的语义区分,以及概念索引任务中"空集"与"未标注"的区别。


§5 划分与使用建议

§5.1 官方划分

划分 文档数 占比 用途 金标准可得性
train 500 50% 模型训练 公开
dev 250 25% 超参数调优、早停、模型选择 公开
test 250 25% 最终评测 共享任务期间隐藏,2019-07-01 后公开
background 2,751 无标注 银标准生成 仅纯文本

官方划分是随机抽样,未按学科、文档长度或实体密度做分层。这一点需要注意:由于总量只有 1,000 篇,随机划分下各子集的学科构成、平均长度、实体密度可能存在波动。若你的研究报告了子集间的统计差异,应说明这是随机划分的自然结果,而非设计意图。

§5.2 社区惯例划分

绝大多数后续工作沿用官方的 500/250/250 划分,以保证结果可与共享任务排行榜比较。常见的两种变体:

惯例 做法 适用场景 注意事项
官方三分法 直接用 train/dev/test 与排行榜对齐 最推荐
train+dev 合并 750 篇训练,250 篇测试 数据量吃紧时提升性能 结果不可与官方排行榜直接比较,必须声明
交叉验证 对 1,000 篇做 5 折或 10 折 追求更稳健的性能估计 与官方划分结果不可比;需固定种子并公开折划分
跨语料零样本 仅用英文语料训练,直接在 test 上评测 跨语言迁移研究 需明确标注为 zero-shot,不与微调结果并列

§5.3 泄漏风险

PharmaCoNER 的泄漏风险有三个层次,都值得认真对待。

第一层:SPACCC 家族内部重叠。 PharmaCoNER、MEDDOCAN、CANTEMIST 等语料都源自或部分源自 SPACCC。如果训练集和评测集来自不同但同源的语料,可能存在文档级甚至段落级重叠。官方并未发布一份跨语料的文档重叠表。实践建议:在做跨语料实验前,先对文档做近似重复检测(如 SimHash 或句级 n-gram Jaccard,阈值 0.8 以上人工复核)。

第二层:背景集与测试集的来源关系。 官方说明测试集是从更大的无标注背景集中抽取的。这意味着背景集中的文档与测试集文档在主题域、期刊来源上高度相似。用背景集做半监督或领域适应是安全的,但如果背景集被用于某种形式的伪标签选择,而选择标准又与测试集评估标准耦合,就会引入隐性泄漏。

第三层:预训练语料污染。 源文本来自 SciELO 开放获取期刊,全部是公开可获取的。任何在此公开网络上训练的现代大语言模型(包括多语言 BERT 系与 LLM)都可能已经接触过这些文本。这会导致"零样本"结果虚高,且无法完全排除。建议的做法是:报告零样本结果时明确声明存在潜在预训练污染,并在论文中同时给出微调结果作为对照。这是当前生物医学 NLP 评测的普遍问题,PharmaCoNER 因文本公开性高而尤为突出。

§5.4 划分策略建议

研究目标 建议划分 理由
与共享任务排行榜对齐 官方 500/250/250 可比性优先
追求最高单模型性能 官方划分 + 最终用 test 评测 dev 只用于模型选择
稳健的性能置信区间 官方划分 + 对 test 做 bootstrap 重采样 test 只有 250 篇,单次评测方差大
医学领域泛化研究 按学科分层重划分 官方随机划分不保证学科均衡
低资源研究 从 train 中再抽样 10%/25%/50% 子集 固定子集种子并公开,便于复现

§5.5 交叉验证建议

PharmaCoNER 的总量(1,000 篇 / 16,504 句 / 7,624 条实体)在国内医学 NLP 语料中属于中小规模。当研究目标是估计模型的泛化性能而非复现排行榜时,交叉验证比单次划分更合适。具体建议:

  1. 在实体层面分层折分,而不是在文档层面简单均分。保证每折中 NORMALIZABLES、PROTEINAS、NO_NORMALIZABLES 的比例接近全量分布。由于 NO_NORMALIZABLES 全量只有 50 条,若不做分层,某些折可能一条都没有,导致该类指标无法计算。
  2. 保持文档完整性,不要把同一篇文档的句子分到不同折。否则模型会在训练时见过测试文档的另一半,造成严重高估。
  3. 报告每折与折间标准差,而不是只报平均。前二名系统在官方 test 上仅差 0.00084 F1,说明系统间差异常常小于评测噪声。
  4. 固定并公开折划分文件。这是让结果可复现的最低要求。

§5.6 外部验证建议

PharmaCoNER 上的高分不代表真实临床部署可用。建议至少做以下外部验证:

验证类型 推荐外部数据 验证目标
跨语料域外测试 MEDDOCAN、CANTEMIST、DisTEMIST(同为西班牙语临床文本) 检验对非 SPACCC 来源文本的泛化
跨语域测试 SocialDisNER(西班牙语健康推文) 检验从正式临床文本到非正式文本的迁移能力
跨语言对照 CHEMDNER、BC5CDR(英文) 量化西班牙语模型相对英文基线的差距
真实 EHR 验证 机构内部脱敏临床记录(需伦理批准) 检验对真实医院文本的适配度
时间外验证 语料发布后新发表的西班牙语病例 检验对术语演变的稳健性

其中"真实 EHR 验证"是最容易被跳过也最关键的一步。PharmaCoNER 的文本是"接近但不是"真实临床记录,两者在缩写密度、模板化表达、非规范拼写上的差异可能很大。


§6 AI 就绪指南

§6.0 云端快速启动

PharmaCoNER 只有约 1.3 MB,任何环境都能快速启动。若使用 Google Colab 或类似云环境,完整流程如下(无需 GPU 即可完成数据准备,微调建议开 GPU)。

# 环境准备:Colab 自带 datasets/transformers 时可跳过安装
# !pip install -q datasets transformers seqeval torch

import datasets
from datasets import load_dataset

# 一行加载官方语料(CoNLL 版,版本 1.1.0)
ds = load_dataset("PlanTL-GOB-ES/pharmaconer")

print(ds)                       # DatasetDict(train/dev/test)
print(ds["train"][0])           # 单条样本:id / tokens / ner_tags
print(ds["train"].features["ner_tags"].feature.names)
# ['O', 'B-NO_NORMALIZABLES', 'B-NORMALIZABLES', 'B-PROTEINAS', 'B-UNCLEAR',
#  'I-NO_NORMALIZABLES', 'I-NORMALIZABLES', 'I-PROTEINAS', 'I-UNCLEAR']

若无法访问 HuggingFace Hub,可改用 Zenodo 归档(BRAT 版)手动下载后本地解析,做法见 §6.2 与 §6.3。

§6.1 快速上手

下面的最小可用示例假设你已经拿到 CoNLL 版数据。在运行前请先确认目录结构:本示例预期 data_root 目录下直接存放三个 CoNLL 文件,data_root 与文件名的拼接关系是 os.path.join(data_root, "train-set_1.1.conll") 等。

# 目录结构预期(与本示例的 data_root 拼接关系严格对应):
# data_root/
# ├── train-set_1.1.conll
# ├── dev-set_1.1.conll
# └── test-set_1.1.conll
#
# 最小可用子集:仅需 train-set_1.1.conll 即可跑通训练流程;
# dev 用于早停与模型选择;test 用于最终评测(本示例不加载 test,
# 避免在开发阶段反复查看测试集造成隐性调参)。

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

data_root = "./pharmaconer"                       # 按需修改
model_name = "dccuchile/bert-base-spanish-wwm-cased"   # 西班牙语 BERT(BETO 系)

tokenizer = AutoTokenizer.from_pretrained(model_name)

# 1) 读取 CoNLL 四列文件为「句子列表」
def read_conll(path):
    sentences, tokens, tags = [], [], []
    with open(path, encoding="utf-8") as f:
        for line in f:
            line = line.rstrip("\n")
            if not line.strip():                  # 空行 = 句边界
                if tokens:
                    sentences.append({"tokens": tokens, "tags": tags})
                    tokens, tags = [], []
                continue
            parts = line.split("\t")
            if len(parts) < 4:
                continue
            tokens.append(parts[1])
            tags.append(parts[3] if len(parts) > 3 else parts[-1])
    if tokens:                                    # 文件末尾可能无空行
        sentences.append({"tokens": tokens, "tags": tags})
    return sentences

train_sents = read_conll(os.path.join(data_root, "train-set_1.1.conll"))
dev_sents   = read_conll(os.path.join(data_root, "dev-set_1.1.conll"))
print(f"train 句数={len(train_sents)}  dev 句数={len(dev_sents)}")
# 预期输出量级:train 约 8,074 句,dev 约 3,764 句(以实际文件为准)

这段代码刻意保留了 if len(parts) < 4: continue 与末尾兜底逻辑,因为真实文件可能有列数异常或缺少末尾空行,健壮的读取函数能避免后续莫名其妙的标签错位。

§6.2 数据获取

渠道 地址形态 格式 大小 是否需要注册 许可
Zenodo(官方归档) {url_name}/0 BRAT + TSV + 背景集 约 1 MB(压缩) 否 CC-BY-4.0
HuggingFace 官方镜像 {url_name}/0 CoNLL 四列 约 1.28 MB 否 CC-BY-4.0
HuggingFace BigBIO 版 {url_name}/0 BigBIO KB schema 约 1 MB 否 CC-BY-4.0
SPACCC 源语料(Zenodo) {url_name}/0 纯文本 zip 1.3 MB 否 CC-BY-4.0
官方任务主页 {url_name}/0 链接汇总 — 否 —

获取方式一(推荐,最快):

from datasets import load_dataset
ds = load_dataset("PlanTL-GOB-ES/pharmaconer")      # 自动下载并缓存

获取方式二(离线环境,BRAT 版):

# 从 Zenodo 归档下载后解压;文件名以归档实际清单为准
mkdir -p pharmaconer && cd pharmaconer
# 将 Zenodo 记录 4270158 的归档下载到当前目录后:
unzip -q pharmaconer.zip -d .
ls -R . | head -40
# 预期可见 train/ dev/ test/ background/ subtask2/ 等目录

申请流程说明:PharmaCoNER 无需任何申请,无需签署数据使用协议,无需伦理审批材料,直接下载即可使用。这是它相对多数临床数据集(如 MIMIC 需 CITI 培训与凭证化申请)的显著优势。唯一的义务是署名——CC-BY-4.0 要求在使用时按标准方式引用原作者与机构。

需要特别提醒的是:语料本身是 CC-BY-4.0,但若你要做概念索引(子赛道 2)并接入 SNOMED-CT,西班牙语版 SNOMED-CT 的获取受 UMLS 或 SNOMED International 的独立许可约束,与语料许可不通用。这是两条完全独立的合规链条,不能混为一谈。

§6.3 预处理全流程

完整预处理分四步:格式转换 → 文本清洗 → 标签标准化 → 数据增强(可选)。以下代码从 BRAT 原始格式出发,输出可直接训练的 token 级样本。

# 步骤 1:BRAT standoff 解析器
# 目录结构预期:
# data_root/train/*.txt 与 data_root/train/*.ann 成对存在
# 拼接关系:txt_path = os.path.join(data_root, split, f"{doc_id}.txt")

import os, re, glob

def parse_brat_ann(ann_path, char_to_byte=None):
    """解析 BRAT .ann 文件,返回 [(start, end, label, text), ...]
    默认使用字符偏移(Python str 索引即字符偏移)。
    若需与字节偏移互转,传入 char_to_byte 函数。
    """
    ents = []
    with open(ann_path, encoding="utf-8") as f:
        for line in f:
            line = line.rstrip("\n")
            if not line or not line.startswith("T"):
                continue                      # 跳过关系/事件行(本语料无)
            try:
                _, body, text = line.split("\t", 2)
            except ValueError:
                continue                      # 容错:跳过异常行
            fields = body.split()
            if len(fields) < 3:
                continue
            label, start, end = fields[0], int(fields[1]), int(fields[2])
            ents.append((start, end, label, text))
    # BRAT 要求按起始位置排序,但源文件不保证,这里强制排序
    return sorted(ents, key=lambda x: (x[0], x[1]))

def load_document(txt_path):
    with open(txt_path, encoding="utf-8") as f:
        return f.read()

# 步骤 2:清洗 —— 去除多余空白、统一引号(不改动重音符号)
def clean_text(text):
    text = text.replace("\u00a0", " ")        # 不间断空格 -> 普通空格
    text = re.sub(r"[ \t]+", " ", text)        # 折叠连续空白
    text = re.sub(r"\n{3,}", "\n\n", text)     # 折叠多余换行
    return text.strip()

# 步骤 3:把实体 span 转成 BIO 标签(字符级 -> 之后按 token 对齐)
def span_to_bio_char(text, ents, labels):
    tags = ["O"] * len(text)
    for s, e, lab, _ in ents:
        if lab not in labels:
            continue                          # 未定义的类别跳过
        tags[s] = f"B-{lab}"
        for i in range(s + 1, min(e, len(text))):
            tags[i] = f"I-{lab}"
    return tags

LABELS = ["NORMALIZABLES", "NO_NORMALIZABLES", "PROTEINAS", "UNCLEAR"]

# 示例:处理单篇文档
doc_id = "S0001-1"
txt = clean_text(load_document(os.path.join(data_root, "train", f"{doc_id}.txt")))
ents = parse_brat_ann(os.path.join(data_root, "train", f"{doc_id}.ann"))
char_tags = span_to_bio_char(txt, ents, LABELS)
print(f"字符数={len(txt)}  实体数={len(ents)}  首个实体={ents[0] if ents else None}")

清洗步骤中有一个刻意的克制:不做小写化、不做重音去除。西班牙语中 ácido 与 acido 是不同字符串,去掉重音会破坏实体表面形式,也会让 SNOMED-CT 词典匹配失败。若确需大小写不敏感匹配,应只在词典查找环节做,而不是在语料预处理阶段全局小写化。

# 步骤 4:按 tokenizer 对齐标签(这是最容易出错的一步,务必校验)
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("dccuchile/bert-base-spanish-wwm-cased")

def encode_with_labels(text, char_tags):
    enc = tokenizer(text, return_offsets_mapping=True,
                    truncation=True, max_length=512, return_tensors=None)
    offsets = enc.pop("offset_mapping")
    labels, prev_label, prev_end = [], "O", -1
    for (s, e) in offsets:
        if s == e:                                # 特殊 token
            labels.append(-100)
            prev_label, prev_end = "O", -1
            continue
        tag = char_tags[s] if s < len(char_tags) else "O"
        # 同一实体被切成多个子词时,把后续子词的 B- 改为 I-
        if tag.startswith("B-") and s == prev_end and prev_label != "O":
            tag = "I-" + tag[2:]
        labels.append(tag)
        prev_label, prev_end = tag, e
    enc["labels"] = labels
    return enc

enc = encode_with_labels(txt[:1000], char_tags[:1000])
print(enc["input_ids"][:10], enc["labels"][:10])

标签对齐规则是决定评测分数公平性的关键。这里采用的规则是:子词的首个子词取 B-(若前一个 token 属于同一实体,则改为 I-),其余子词取 I-。不同实现可能采用"仅首子词保留标签、其余置 -100"的变体,这会造成训练信号差异。无论采用哪种,都应在论文中明确写出。

§6.4 PyTorch DataLoader

以下为完整可运行的 Dataset 与 DataLoader 实现,从 BRAT 目录直接构建。

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

LABEL_LIST = [
    "O",
    "B-NO_NORMALIZABLES", "B-NORMALIZABLES", "B-PROTEINAS", "B-UNCLEAR",
    "I-NO_NORMALIZABLES", "I-NORMALIZABLES", "I-PROTEINAS", "I-UNCLEAR",
]
LABEL2ID = {l: i for i, l in enumerate(LABEL_LIST)}
ID2LABEL = {i: l for l, i in LABEL2ID.items()}

class PharmaCoNERDataset(Dataset):
    """目录结构预期:
       root/
       ├── train/  *.txt + *.ann
       ├── dev/    *.txt + *.ann
       └── test/   *.txt + *.ann     (金标准公开后可用)
       拼接关系:os.path.join(root, split, f"{doc_id}.{ext}")
    """
    def __init__(self, root, split, tokenizer, max_length=512):
        self.tokenizer = tokenizer
        self.max_length = max_length
        self.samples = []
        split_dir = os.path.join(root, split)
        for txt_path in sorted(glob.glob(os.path.join(split_dir, "*.txt"))):
            ann_path = txt_path[:-4] + ".ann"
            if not os.path.exists(ann_path):
                continue                       # 无标注文档(背景集)跳过
            self.samples.append((txt_path, ann_path))

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

    def __getitem__(self, idx):
        txt_path, ann_path = self.samples[idx]
        text = clean_text(load_document(txt_path))
        ents = parse_brat_ann(ann_path)
        char_tags = span_to_bio_char(text, ents, LABELS)
        enc = encode_with_labels(text, char_tags)
        item = {k: torch.tensor(v) for k, v in enc.items()
                if k in ("input_ids", "attention_mask", "token_type_ids", "labels")}
        item["labels"] = torch.tensor(
            [LABEL2ID.get(t, -100) if t != -100 else -100 for t in enc["labels"]]
        )
        return item

def collate_fn(batch):
    maxlen = max(x["input_ids"].size(0) for x in batch)
    out = {"input_ids": [], "attention_mask": [], "labels": []}
    has_tti = all("token_type_ids" in x for x in batch)
    if has_tti:
        out["token_type_ids"] = []
    for x in batch:
        pad = maxlen - x["input_ids"].size(0)
        out["input_ids"].append(torch.cat([x["input_ids"], torch.zeros(pad, dtype=torch.long)]))
        out["attention_mask"].append(torch.cat([x["attention_mask"], torch.zeros(pad, dtype=torch.long)]))
        out["labels"].append(torch.cat([x["labels"], torch.full((pad,), -100, dtype=torch.long)]))
        if has_tti:
            out["token_type_ids"].append(torch.cat([x["token_type_ids"], torch.zeros(pad, dtype=torch.long)]))
    return {k: torch.stack(v) for k, v in out.items()}

# 实例化
tokenizer = AutoTokenizer.from_pretrained("dccuchile/bert-base-spanish-wwm-cased")
train_ds = PharmaCoNERDataset("./pharmaconer", "train", tokenizer)
dev_ds   = PharmaCoNERDataset("./pharmaconer", "dev",   tokenizer)

train_loader = DataLoader(train_ds, batch_size=16, shuffle=True,
                          collate_fn=collate_fn, num_workers=2)
dev_loader   = DataLoader(dev_ds, batch_size=32, shuffle=False,
                          collate_fn=collate_fn, num_workers=2)

batch = next(iter(train_loader))
print({k: tuple(v.shape) for k, v in batch.items()})
# 预期:{'input_ids': (16, L), 'attention_mask': (16, L), 'labels': (16, L), ...}

collate_fn 中把 padding 位置的标签设为 -100,这是 PyTorch 交叉熵损失默认忽略的索引。若忘记这一步,填充位置会被当作 O 类参与训练,模型会学到"padding 处无实体"这一无意义信号,并在长文本上系统性偏向预测 O。

微调循环的标准骨架如下:

from transformers import AutoModelForTokenClassification
from torch.optim import AdamW

model = AutoModelForTokenClassification.from_pretrained(
    "dccuchile/bert-base-spanish-wwm-cased",
    num_labels=len(LABEL_LIST),
    id2label=ID2LABEL, label2id=LABEL2ID,
)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)
opt = AdamW(model.parameters(), lr=3e-5, weight_decay=0.01)

model.train()
for epoch in range(3):
    total = 0.0
    for batch in train_loader:
        batch = {k: v.to(device) for k, v in batch.items()}
        out = model(**batch)
        out.loss.backward()
        torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0)
        opt.step(); opt.zero_grad()
        total += out.loss.item()
    print(f"epoch {epoch} loss={total / len(train_loader):.4f}")

§6.5 坑点 8 个

⚠️ 坑点 1:标签 ID 顺序与直觉不一致导致评估静默出错(分类:评估误用)

问题:HuggingFace ClassLabel 的标签顺序是 O, B-NO_NORMALIZABLES, B-NORMALIZABLES, ...——注意 B-NO_NORMALIZABLES 排在 B-NORMALIZABLES 之前。若你的评估代码假设"先 NORMALIZABLES 后 NO_NORMALIZABLES",或自己用 sorted() 构造标签列表,标签 ID 会整体错位,导致 F1 数值看起来"偏低但不算离谱",静默无效。
症状:模型训练 loss 正常下降,但 seqeval 报告的 F1 明显低于论文基准(如 0.60 而非 0.85);混淆矩阵中 NORMALIZABLES 与 NO_NORMALIZABLES 大量互相误判。
解决:

  1. 简单方法:永远从数据集对象读取标签顺序,不要手写列表 —— names = ds["train"].features["ner_tags"].feature.names,然后用 {n: i for i, n in enumerate(names)} 构造映射。
  2. 进阶方法:在评估前加断言校验 —— assert id2label[pred_id].lstrip("BI-") in {"O", "NORMALIZABLES", "NO_NORMALIZABLES", "PROTEINAS", "UNCLEAR"},并在训练前打印一次 model.config.id2label 与数据集标签名做逐项比对。
  3. SOTA 方法:把标签映射写进配置文件并做哈希校验,训练、评估、推理三处读取同一份配置,任何不一致直接抛异常终止。
    参考:PharmaCoNER HuggingFace 加载脚本(ClassLabel 顺序定义处)

⚠️ 坑点 2:BRAT 字符偏移与 Python 字节偏移混淆,实体整体错位(分类:预处理陷阱)

问题:BRAT .ann 中的 offset 是以字符(Unicode code point)计的,而部分文本处理库(如某些版本的 spaCy 或直接对 bytes 切片)使用字节偏移。西班牙语含大量重音符号(á é í ó ú ñ),每个字符占 2 个字节,两者从第一个重音符号出现位置起就全部错位。
症状:实体 span 的原文与实体表面形式不匹配(如标为 metformina 却切出 etformina);实体起始位置随文档中重音字符数量线性偏移;训练集上指标虚高但错误分析时发现大量边界错误的实体。
解决:

  1. 简单方法:始终用 Python str 索引做切片 —— text[start:end],因为 str 索引就是字符偏移。不要对 .encode() 后的 bytes 切片。
  2. 进阶方法:加自校验 —— 解析后立即验证 text[start:end] == mention_text,不一致则记录并报警。批量统计不一致率,正常应接近 0。
  3. SOTA 方法:用 tokenizer(..., return_offsets_mapping=True) 拿到 token 到字符的映射,全程在字符坐标系里对齐,最后统一转换为 token 标签;对整语料做一次"实体文本回读一致性"报告并纳入数据质量门禁。
    参考:BRAT standoff 规范

⚠️ 坑点 3:token 级预测还原为实体 span 的规则不同,F1 差异可达数个百分点(分类:评估误用)

问题:模型输出的是 token 级 B/I 标签,而评测针对实体级 span。还原规则(是否合并跨句实体、如何处理孤立的 I- 标签、子词标签如何折叠)没有唯一标准,不同实现得到的 F1 不可比。论文记录系统间最大与中位数差距仅 6 个百分点,还原规则的差异足以吞掉这个差距。
症状:自己的复现结果与论文报告差 2 到 5 个 F1 点,但代码逻辑检查无误;换一个 seqeval 版本结果又变了;同一模型在不同团队复现出不同分数。
解决:

  1. 简单方法:直接用 seqeval 的 classification_report,并固定其版本号写进论文。
  2. 进阶方法:显式处理孤立 I- 标签 —— seqeval 默认把 I-X 出现在 B-X 之前视为新实体开头,而共享任务的官方评测脚本可能视为非法并丢弃。实现两个版本并报告差异。
  3. SOTA 方法:把评测脚本纳入版本控制并公开,报告时同时给出 micro-F1 与按类别 F1;对 test 集做 bootstrap(如 1,000 次重采样)给出 95% 置信区间,避免把 0.00084 的差距当作真实提升。
    参考:论文 Table 6 统计

⚠️ 坑点 4:NO_NORMALIZABLES 极度稀疏,类别权重与阈值选择陷阱(分类:标签理解 / 偏倚陷阱)

问题:NO_NORMALIZABLES 在 7,624 条实体中只有 50 条(0.66%)。论文明确记录该类别在参赛系统中位数 F1 为 0,即半数以上系统完全忽略它。若你按常规做法直接训练,几乎必然复现这个结果;若你强行加大类别权重,又会显著损害主类性能。
症状:评估报告里 NO_NORMALIZABLES 的 precision / recall / F1 全为 0 或接近 0;模型从不预测该标签;试图通过 class weight 修复后,NORMALIZABLES 的 F1 明显下滑。
解决:

  1. 简单方法:把该类别从评测中显式排除,并在论文中说明"沿用多数参赛系统的做法"。若必须报告,则单独说明样本量仅 50 条、指标不稳定。
  2. 进阶方法:用 focal loss 或对稀疏类做词表/规则增强 —— 该类的语义定义是"无法归一化到唯一 SNOMED-CT 概念的化学物提及",这类提及往往是模糊描述或未收录术语,可构造规则特征(如是否含"compuesto""preparado"等模糊词)。
  3. SOTA 方法:把 NER 改为"先检测提及、再分类类别"的两阶段结构,让类别分类器只作用于已确定的 span,避免稀疏类在共享参数下被主类淹没;同时报告排除了该类的加权主指标,保证与排行榜可比。
    参考:论文 Table 5 按类别结果

⚠️ 坑点 5:接入西班牙语 SNOMED-CT 时的许可与版本漂移(分类:工程陷阱)

问题:语料是 CC-BY-4.0,但概念索引子赛道需要 SNOMED-CT 西班牙语版,后者受 UMLS 或 SNOMED International 的独立许可约束,通常需要注册与接受条款。更棘手的是:金标准概念 ID 是基于当年特定版本的 SNOMED-CT 标注的,你接入新版后可能发现概念已失效、合并或层级调整,导致无法匹配。
症状:概念索引任务中大量金标准 ID 在你的 SNOMED-CT 发行版里查不到;某些 ID 仍在但语义已变;同一模型换一个 SNOMED-CT 版本 F1 波动明显。
解决:

  1. 简单方法:先只做子赛道 1(NER),跳过概念索引。绝大多数应用只需要药物提及边界。
  2. 进阶方法:做概念索引时,明确记录所用 SNOMED-CT 版本号与获取日期,并统计"金标准 ID 在本地发行版中的命中率"。命中率低于 95% 说明版本不匹配,应先解决版本问题再谈模型性能。
  3. SOTA 方法:构建概念 ID 的历史映射表(对失效 ID 回溯到其替代概念),并在评估时同时报告严格匹配与"放宽到上位概念"的匹配结果,把版本漂移的影响显式量化。
    参考:Zenodo 数据记录(许可与数据集边界说明)

⚠️ 坑点 6:把 UNCLEAR 当作普通类别训练或评估(分类:标签理解)

问题:UNCLEAR 类有 167 条标注,官方明确说明它不参与评测,只是作为"医学上有意义的附加标注"。若你在训练时把 UNCLEAR 与三类评测实体等同处理,模型会把容量浪费在评测外的类别上;若在评估时把它计入,指标会与排行榜不可比。
症状:训练正常但评测 F1 低于论文基准;错误分析发现模型把大量应标注为 NORMALIZABLES 的提及预测为 UNCLEAR(因为两者语义确有重叠);与公开排行榜比较时数字对不上。
解决:

  1. 简单方法:评估时过滤掉所有 UNCLEAR 实体,只对三类评测实体计算指标。
  2. 进阶方法:训练时保留 UNCLEAR 标签(它提供了"这里有个类药物提及但不可归一化"的信号,有助于减少误报),但在导出预测与计算指标时统一排除;在论文中说明这一处理。
  3. SOTA 方法:把 UNCLEAR 作为"丢弃类"(ignore class),在损失中将其标签置为 -100,同时对评估做精细切分,分别报告"含 UNCLEAR"与"不含 UNCLEAR"两套指标以显示影响幅度。
    参考:官方任务说明(UNCLEAR 不参与评测的声明)

⚠️ 坑点 7:西班牙语缩写识别困难,模型在缩写实体上系统性漏检(分类:偏置陷阱 / 预处理陷阱)

问题:官方在讨论中明确指出"某些缩写(abbreviations)仍然很难"。临床病例中药物常以缩写或简写形式出现,缩写往往没有重音符号、长度极短、与普通词形近,且同一缩写在文档内首次出现时可能有全称定义、后续只出现缩写。模型难以判断缩写是否指代药物。
症状:全称实体识别良好,但缩写形式的药物提及 recall 明显偏低;错误分析显示大量漏检集中在 2 至 5 个字符的短提及上;同一文档内缩写与全称的识别性能差异显著。
解决:

  1. 简单方法:在训练集中统计缩写型实体的比例与其平均长度,作为错误分析的基线;不要只看总体 F1。
  2. 进阶方法:引入字符级特征或字符级 CNN/子词注意力,让模型对短字符串敏感;同时利用语料自身提供的"西班牙语医学缩写词表与全称映射"资源做词典增强。
  3. SOTA 方法:做文档级上下文建模——把全称-缩写的首次定义对识别出来,作为文档级特征注入;或使用支持长上下文的编码器,让模型在同一文档内建立缩写与全称的关联。
    参考:官方结果讨论幻灯片

⚠️ 坑点 8:test 集仅 250 篇,系统排名对随机种子与解码策略高度敏感(分类:评估误用 / 工程陷阱)

问题:子赛道 1 前二名系统的 F1 差距仅 0.00084(0.91052 vs 0.90968),而 test 集只有 250 篇文档。这种量级下的排名差异极可能只是评测噪声或随机种子差异,而不是方法优劣。若你据此宣称"超过 SOTA",结论不可靠。
症状:同一模型换随机种子后 F1 波动超过前二名的差距;自己复现第二名系统的结果反而高于第一名;不同解码策略(argmax vs CRF 维特比)带来的差异大于系统间差异。
解决:

  1. 简单方法:用 3 至 5 个随机种子重复训练,报告均值与标准差;若两模型的标准差区间大幅重叠,不要声称有优劣。
  2. 进阶方法:对 test 集做 bootstrap 重采样估计 F1 的 95% 置信区间;用配对 bootstrap 检验两个系统的预测差异是否显著。
  3. SOTA 方法:报告时区分"单次运行结果"与"多次运行均值±标准差",并公开所有随机种子与配置文件;在论文中明确写"与先前工作的差距在评测噪声范围内",这是更严谨也更有价值的结论。
    参考:论文 Table 6 与排名讨论

§6.6 数据增强

增强方式 安全性 说明 风险
同义词替换(药名→同义药名) ❌ 危险 会改变实体语义与概念映射 破坏 SNOMED-CT 金标准对应关系
随机词删除 / 交换 ❌ 危险 临床文本中语序与否定词携带关键信息 可能制造语义相反的文本
非实体部分的回译(西→英→西) ⚠️ 谨慎 仅对非实体 span 做回译,保留实体原文 可能改变上下文语义
实体替换(同类别实体互换) ⚠️ 谨慎 只在 NORMALIZABLES 内部互换药名 需同步处理概念 ID,否则概念任务失效
子词级 dropout(如 BERT 的 whole word masking 继续预训练) ✅ 安全 在 SPACCC 无标注文本上继续 MLM 预训练 无标签污染风险
外部无标注数据继续预训练 ✅ 安全 用 SPACCC 1,000 篇 + 背景集 2,751 篇做领域适应 建议去重,避免与 test 重叠
跨语言数据增强 ✅ 安全 用英文 CHEMDNER/BC5CDR 做辅助任务或迁移 需验证标签语义可比性
大小写/重音扰动 ❌ 危险 会破坏实体表面形式与词典匹配 西班牙语重音具语义区分作用

核心原则:实体 span 的文本与边界不能被增强破坏。PharmaCoNER 的标注是提及级的,任何改变实体表面形式或边界的操作都会使金标准失效。相对安全的增强集中在"非实体上下文"与"外部无标注文本的领域适应"两条路径。

§6.7 模型推荐

模型 类型 适用场景 备注
dccuchile/bert-base-spanish-wwm-cased(BETO 系) 西班牙语 BERT 微调基线,首选起点 全词掩码,适合西班牙语;参数量 110M
BERT-multilingual-cased 多语言 BERT 跨语言对照实验 西班牙语性能通常低于单语 BETO 系
RigoBERTa Clinical 西班牙语临床专用编码器 追求更高性能 在西班牙语临床语料上预训练,需确认许可
Spanish Clinical Flair / 西语临床词向量 静态/上下文化嵌入 低资源基线、消融对照 相对 transformer 通常落后
Bi-LSTM-CRF + GloVe/医学词向量 经典序列标注 复现共享任务期基线(PharmaCoNER Tagger) 参数量小、推理快;2019 年基线配置
BERT + CRF 解码层 混合 提升实体边界一致性 共享任务中表现良好
多任务模型(NER + 概念索引共享编码器) 多任务 同时优化两个子赛道 论文未来工作方向之一

选型建议:先用 BETO 系微调得到可复现基线,再考虑临床领域预训练模型。不要一开始就上最大的模型——在 250 篇测试集上,模型容量的收益很容易被评测噪声掩盖(见坑点 8)。

§6.8 硬件需求

场景 硬件 显存 预计时间 说明
数据探索 / 格式转换 任意 CPU — 秒级 语料仅约 1.3 MB
推理(已微调模型) CPU 或任意 GPU < 2 GB 秒级 250 篇测试集批量推理
微调 BERT-base(BETO 系) 单张 GPU 8 GB 以上 分钟级至小时级(视 epoch 与 batch) 语料小,主要瓶颈是加载与日志
微调 BERT-large / 临床大模型 单张 GPU 16 GB 以上 小时级 收益不确定,受评测噪声限制
交叉验证(10 折) 单张 GPU 同微调 10 倍微调时间 建议用脚本批处理,避免手动重复

整体而言,PharmaCoNER 的硬件门槛极低,任何具备一张中端 GPU 的环境都能完整开展研究,这也是它适合教学的原因之一。

§6.9 评估指标代码

# 实体级 micro-F1(子赛道 1),使用 seqeval
# !pip install -q seqeval
from seqeval.metrics import classification_report, f1_score, precision_score, recall_score

LABEL_LIST = [
    "O",
    "B-NO_NORMALIZABLES", "B-NORMALIZABLES", "B-PROTEINAS", "B-UNCLEAR",
    "I-NO_NORMALIZABLES", "I-NORMALIZABLES", "I-PROTEINAS", "I-UNCLEAR",
]
# 官方评测只涉及三类实体(UNCLEAR 不参与)
EVAL_LABELS = ["NORMALIZABLES", "NO_NORMALIZABLES", "PROTEINAS"]

def decode_predictions(logits, attention_mask, id2label):
    """argmax 解码为标签序列列表,跳过 padding 与特殊 token(label=-100)"""
    preds = logits.argmax(-1)
    out = []
    for seq, mask in zip(preds, attention_mask):
        row = []
        for p, m in zip(seq, mask):
            if m.item() == 0:
                continue
            row.append(id2label[p.item()])
        out.append(row)
    return out

def to_entity_level(tag_seqs, allowed=EVAL_LABELS):
    """token 级标签 -> 实体级标签列表;过滤 padding 与非评测类别"""
    sequences = []
    for seq in tag_seqs:
        cur, ent, ents = None, None, []
        for tag in seq:
            if tag == "O" or tag == "-100":
                if cur:
                    ents.append(cur); cur, ent = None, None
                continue
            # -100 在解码后已去掉;此处只处理 B-/I-
            prefix, label = tag.split("-", 1)
            if label not in allowed:
                if cur:
                    ents.append(cur); cur, ent = None, None
                continue
            if prefix == "B" or (cur is None):
                if cur:
                    ents.append(cur)
                cur, ent = label, label
            else:
                cur = label
        if cur:
            ents.append(cur)
        sequences.append(ents)
    return sequences

def evaluate(y_true_tags, y_pred_tags):
    """y_*_tags 为 token 级 BIO 标签序列的列表(字符串)"""
    # seqeval 期望 IOB2 格式的字符串序列,直接传入即可
    print(classification_report(y_true_tags, y_pred_tags, mode="strict", digits=4))
    return {
        "micro_f1": f1_score(y_true_tags, y_pred_tags, average="micro"),
        "micro_p":  precision_score(y_true_tags, y_pred_tags, average="micro"),
        "micro_r":  recall_score(y_true_tags, y_pred_tags, average="micro"),
    }

# 概念索引(子赛道 2):文档级集合评估
def concept_index_f1(gold_map, pred_map):
    """gold_map/pred_map: {doc_id: set(concept_id)}
    micro-F1 = 2PR/(P+R),P/R 在「全部文档的全部预测对」上汇总
    """
    tp = fp = fn = 0
    for doc in gold_map:
        g, p = set(gold_map[doc]), set(pred_map.get(doc, set()))
        tp += len(g & p); fp += len(p - g); fn += len(g - p)
    prec = tp / (tp + fp) if (tp + fp) else 0.0
    rec  = tp / (tp + fn) if (tp + fn) else 0.0
    f1   = 2 * prec * rec / (prec + rec) if (prec + rec) else 0.0
    return {"precision": prec, "recall": rec, "f1": f1}

评估时务必区分两件事:seqeval 的 mode="strict" 要求实体边界与类别完全一致;mode="default" 允许一定宽松。共享任务采用的是严格匹配(offset 与类别均需精确匹配),复现时应使用严格模式以保持可比性。

§6.10 MLOps 笔记

环节 建议 理由
数据版本 固定语料版本(HF 脚本 v1.1.0)与下载日期 不同渠道统计口径有差异,版本不明会导致结果不可复现
标签映射 把 LABEL_LIST 写入配置文件并哈希 见坑点 1,标签顺序错位是静默失败
随机种子 固定 Python / NumPy / PyTorch / CUDA 种子 test 仅 250 篇,种子敏感(见坑点 8)
模型选择 用 dev 选择、test 只评一次 反复查看 test 等于在 test 上调参
评测脚本 版本控制 + 公开 还原规则差异会改变 F1(见坑点 3)
概念 ID 版本 记录 SNOMED-CT 发行版与获取日期 概念漂移(见坑点 5)
领域适应 记录是否使用 SPACCC/背景集继续预训练 影响与论文基准的可比性
部署前检查 在目标机构的真实脱敏记录上做小规模验证 病例报告与真实 EHR 存在语域差异

§7 质量评估与局限性

§7.1 已知偏倚

偏倚类型 描述 严重程度 缓解措施
来源选择偏倚 仅使用 SciELO 开放获取期刊;非开放获取文献中的术语分布可能不同 中 在论文中声明覆盖边界;外部验证时补入机构内部文本
病例报告文体偏倚 病例报告记录"值得发表的单一观察",罕见病与典型教学病例占比高于真实门诊分布 高 不要据此估计药物使用频率;做频率分析时须重新加权
学科分布偏倚 覆盖肿瘤、泌尿、心脏、呼吸、感染病等,但未按真实病种负担加权 中 报告学科分布;跨学科性能差异需单独分析
归一化偏倚 NORMALIZABLES 占 57.7%,标注倾向于"能用 SNOMED-CT 归一化的化学物" 高 明确区分"可归一化"与"全部药物提及",不要把 F1 当作药物识别总能力
类别不平衡 NO_NORMALIZABLES 仅 0.66%,中位数系统 F1 为 0 高 分层评估;报告该类样本量;或显式排除并声明
语言变体偏斜 以西班牙(欧洲)医学术语为主,拉美变体可能被欠代表 中 部署到拉美市场前做术语差异审计;官方未披露分布
医院层级偏倚 来源为三级医院与学术期刊,基层医疗场景可能欠代表 中 外部验证时纳入基层或社区医疗文本
时间偏倚 语料构建于 2018-2019,新药与更新的术语未覆盖 中 定期核查新药命名;结合更新的药物词典
预训练污染 源文本公开可获取,可能已被大模型预训练语料吸收 高 报告零样本结果时声明污染风险;以微调结果为主结论

§7.2 标注质量

指标 数值 解读
实体标注 IAA 93% 专家对"什么是药物/化学/蛋白提及"高度一致,边界争议小
概念映射 IAA 73% 对"对应哪个 SNOMED-CT 概念"存在实质分歧,是任务固有难度
指南来源 BioCreative CHEMDNER + GPRO(翻译并临床化改编) 与英文任务标签语义可比,利于跨语言研究
一致性校准流程 迭代式 IAA 研究直至达标 有明确的质控闭环,非一次性标注
标注者背景 药物化学与药理学专家 + 执业医师参与规则制定 具备临床与化学双重专业支撑
是否含自动标注 否(金标准为纯人工) 作为评估基准的可信度较高
银标准 独立发布,来自参赛系统集成预测 可用于弱监督,不应用于模型选择

需要提醒的是:IAA 是标注者之间的一致程度,不是标注与"绝对真理"的一致程度。93% 的实体标注 IAA 意味着这套金标准在专家内部自洽,但如果你的应用场景对某些实体类别的定义与组织方不同(例如你把疫苗算作药物,而本语料将其归入 UNCLEAR),那么在你的场景下它就不再是金标准。

§7.3 泛化性

目标场景 失效风险 证据
真实医院 EHR 自由文本 高 语料是"接近但非"真实临床记录;缩写密度、模板化表达与非规范拼写差异大
西班牙语健康社交媒体文本 高 语域差异极大;官方在讨论中明确提到需要覆盖更广的文档类型(如社交媒体)
拉丁美洲西班牙语临床文本 中 药物命名(如 paracetamol/acetaminofén)与缩写习惯存在地区差异,官方未披露分布
其他生物医学子领域(如药物说明书) 中 语料的文体为叙事性病例报告,说明书文本为清单式,句式差异大
非药物实体识别任务 高 标签体系仅覆盖药物/化学/蛋白,无法迁移到疾病、症状、检查等
英文或其他语言 高 单语语料,无跨语言标注;需另做迁移学习与验证
药物剂量/频次/疗程抽取 高 语料不含这些标注,完全超出设计范围
药物-药物相互作用抽取 高 无关系标注,只有提及级 span

§7.4 伦理

PharmaCoNER 在伦理上的合规基础较好,因为它使用的是已公开发表的科学文献,而非患者病历。官方在 HuggingFace 数据卡中明确声明"Includes no personal or sensitive information"。源语料的构建过程包括:由肿瘤科医师筛选内容接近真实临床记录的病例、自动移除图注、把含多个病例的文章拆分为单篇病例。这些步骤的目的是获得结构可控的文本,而非隐私保护——文本本身已是公开出版物。

需要明确的几点:

  1. 无患者隐私风险主张的边界。官方声明"不含个人或敏感信息",其依据是源文本为公开文献。但公开发表的病例报告中可能包含罕见的病例细节,理论上存在通过细节组合推断个体的可能。医疗 AI 研究者在报告中应避免复述可能指向具体个体的罕见病例细节,这是学术写作的基本规范而非本语料特有的要求。
  2. CC-BY-4.0 的署名义务。使用时必须按标准方式引用原作者与机构。把语料打包再分发、或用于商业产品,都需保留署名与许可声明。
  3. 下游应用的临床责任。用 PharmaCoNER 训练的模型若用于临床场景,责任在于部署方。语料本身不提供任何临床有效性保证,其来源是病例报告而非经过验证的临床决策数据。
  4. 不涉及伦理审批。语料获取不需要 IRB 批准。但如果研究者要把它与机构内部 EHR 数据结合使用,则结合后的研究会落入需要伦理审批的范畴。

§7.5 公平性

维度 现状 风险 建议
语言变体 以欧洲西班牙语为主 拉美用户场景下术语识别率可能偏低 分地区评估;必要时补充本地术语词典
疾病/学科覆盖 肿瘤、泌尿、心脏、呼吸、感染病等较均衡 罕见病与精神科用药可能欠代表 报告按学科的细分性能
药物类型覆盖 以可归一化到 SNOMED-CT 的化学物为主 草药、传统药物、替代疗法提及可能被系统性漏检 若应用涉及传统医学,需额外标注与验证
机构层级 学术期刊来源,偏三级医疗 基层与社区医疗场景性能未知 在基层医疗机构文本上做补充验证
患者人口学 语料不含人口学标注 无法评估年龄/性别相关的性能差异 若应用需要公平性分析,需在外部数据上做

PharmaCoNER 因为不含患者人口学标注,无法直接用于"不同人群模型性能是否公平"的分析。这是一个结构性限制,不是可以通过数据处理弥补的缺陷。要做公平性分析,必须引入带人口学标注的外部临床数据。

§7.6 数据漂移

漂移类型 来源 影响 缓解
术语漂移 新药上市、命名规则更新、旧药退市 模型对新药名的召回下降 定期更新药物词典;结合规则与生物医学知识库
概念漂移 SNOMED-CT 版本更新导致概念失效或合并 概念索引任务的映射失配 记录版本;构建历史映射表(见坑点 5)
文体漂移 医学写作规范变化、结构化摘要普及 模型对新型行文格式的适应变差 混入近期文本做持续预训练
语域漂移 应用场景从病例报告迁移到 EHR 或社交媒体 性能大幅下降 领域适应;在目标语域上做少量标注
语言变体漂移 拉美与欧洲西班牙语用词进一步分化 特定市场的识别率下降 分市场评估与本地化词典

§7.7 DAIMS 24 项检查

# 检查项 状态 说明
1 宽格式 ✅ 每行一个 token,标签列与 token 列一一对应,符合宽格式
2 唯一标识 ✅ HF 版含 id 字段;BRAT 版文档 ID 与标注 ID(T 编号)唯一
3 特殊字符 ✅ 保留西班牙语重音符号(á é í ó ú ñ)与医学缩写,未做有损转换
4 重复行 ⚠️ 未发现系统性重复;但 SPACCC 家族语料间可能存在文档级重叠,官方未发布重叠表
5 缺失编码 ✅ 非实体用 O,padding 用 -100,语义明确
6 标签标识 ✅ 9 个 ClassLabel(O + B/I × 4 类),命名规范统一
7 罕见类分组 ⚠️ NO_NORMALIZABLES 仅 50 条(0.66%),中位数系统 F1 为 0;官方未做分组处理
8 偏倚评估 ⚠️ 官方未提供正式的偏倚评估报告;本词条 §7.1 给出了分析性归纳
9 数据字典 ✅ 本词条 §4.1 提供 8 列 DAIMS 字段字典
10 信息性缺失解释 ✅ O、-100、UNCLEAR、概念空集的语义均已说明(§4.5)
11 设备记录 ✅ 不适用(纯文本语料,无采集设备);已明确标注不适用
12 共线性 ⚠️ 未做特征共线性分析;对文本语料需关注实体长度与类别之间的相关性
13 编码映射 ✅ 标签、SNOMED-CT 概念 ID 的映射关系已说明;SNOMED-CT 版本依赖已提示
14 时间戳处理 ⚠️ 语料粒度到文档,无时间戳字段;时间信息仅体现在源文献发表时间,官方未提供
15 划分建议 ✅ 官方 500/250/250 划分明确;§5.4 给出分层重划分建议
16 泄漏讨论 ✅ §5.3 讨论三层泄漏风险(家族重叠、背景集关系、预训练污染)
17 标签分布 ✅ §4.2 给出四类实体提及数与占比
18 测量偏倚 ⚠️ 未做测量偏倚分析;IAA 93%/73% 是唯一公开的质量量化指标
19 外部验证建议 ✅ §5.6 与 §7.8 给出外部验证矩阵
20 版本记录 ✅ §1.4 版本时间轴;HF 脚本版本号 1.1.0 已记录
21 预处理脚本 ⚠️ 官方未提供预处理脚本;仅有数据加载脚本。本词条 §6.3 提供完整预处理流程
22 合规要求 ✅ CC-BY-4.0 明确;SNOMED-CT 独立许可风险已在 §6.2 与坑点 5 提示
23 多模态对齐 ✅ 不适用(单模态纯文本);已明确标注不适用
24 去标识化 ✅ 源文本为公开科学文献;官方声明不含个人信息

DAIMS 评分:18.5 / 24

评分解读:PharmaCoNER 在"数据本体的规范性"上得分很高——唯一标识、特殊字符保留、缺失编码、标签体系、划分、标签分布、合规要求、去标识化这八项均为满分,这符合它作为共享任务金标准的定位:数据本身必须是干净、可评估、可复现的。扣分集中在"围绕数据的方法学文档"上:官方没有发布正式的偏倚评估报告,没有提供预处理脚本,没有做共线性与测量偏倚的量化分析,也没有文档级时间戳字段。其中最值得注意的是 NO_NORMALIZABLES 的罕见类问题——官方既未合并该类,也未在评测协议中对它做特殊说明,只是通过论文表格呈现了"中位数 F1 为 0"这一事实。对使用者而言,这意味着该类别的任何指标都需要自己承担解释责任。

对你意味着什么:

  1. 可以直接信任的部分:标签体系、文档划分、实体计数、许可条款。这些都可以原样用于研究和发表,不需要重新验证。
  2. 需要自己补齐的部分:预处理脚本、标签对齐规则、评测还原规则。本词条 §6.3 至 §6.4 与 §6.9 提供了可直接复用的实现,但你必须自己验证它们与共享任务官方评测脚本的一致性。
  3. 需要主动规避的部分:不要在论文中把 NO_NORMALIZABLES 的 F1 作为主指标;不要声称概念索引达到了接近 1.0 的性能(IAA 上限 73% 决定了现实天花板);不要用零样本结果声称方法优越(存在预训练污染风险)。
  4. 需要额外投入的部分:如果目标场景是真实 EHR,必须先做域外验证;如果目标市场是拉丁美洲,必须先做术语变体审计;如果要做概念索引,必须先解决 SNOMED-CT 版本与许可问题。

§7.8 外部验证矩阵

外部数据集/场景 来源机构 评估任务 性能指标 相对内部变化 关键发现
官方 test 集(250 篇,子赛道 1) BSC TeMU / CIMA NER offset + 分类 最高 micro-F1 0.91052(xiongying);第二名 0.90968;投票融合 0.92355 基准 前二名差距 0.00084,处于评测噪声量级
官方 test 集(250 篇,子赛道 1,按类别) BSC TeMU / CIMA 分类别 NER NORMALIZABLES 最高 F1 0.94253;PROTEINAS 最高 0.88709;NO_NORMALIZABLES 中位数 F1 为 0 类别间差异 4-9 分 NORMALIZABLES 系统性优于 PROTEINAS;半数以上系统放弃 NO_NORMALIZABLES
官方 test 集(250 篇,子赛道 2) BSC TeMU / CIMA SNOMED-CT 概念索引 最高 F1 0.91593(FSL);第二名 0.85347 与 NER 任务不可直接比较 第一与第二名差距超过 6 分,该任务高度依赖资源工程质量
官方 test 集(子赛道 2,系统统计) BSC TeMU / CIMA 概念索引分布 min 0.49207 / mean 0.75936 / median 0.81058 / max 0.91593 系统间方差大 概念索引的整体中位数明显低于 NER 任务
西班牙语临床模型对比(综述引用) 多机构 西班牙语临床 NER 横向评测 综述汇总 PharmaCoNER 为 500/250/250 标准语料之一 不适用 该语料被广泛用作西班牙语临床编码器模型的标准评测集

上表只收录有同行评审论文或官方结果页支撑的数字。需要强调:不同参赛系统的性能差异不能直接归因于方法优劣,因为各系统使用的预训练资源(是否使用医学词向量、是否集成多个模型)不同,论文本身也指出系统间方差较大。


§8 基准性能与生态

§8.1 排行榜

子赛道 1:NER offset 与实体分类(micro-average F1)

排名 模型/队伍 性能(micro-F1) 年份 关键技术 完整引用 代码
1 xiongying 0.91052 2019 BERT 做 NER 分类,Bpool(Bi-LSTM + max/mean pooling)做概念索引 Xiong, Y., Shen, Y., Huang, Y., Chen, S., Tang, B., Wang, X., Chen, Q., Yan, J., Zhou, Y. (2019). A Deep Learning-Based System for PharmaCoNER. In Proceedings of the 5th Workshop on BioNLP Open Shared Tasks (pp. 33-37). ACL. DOI 10.18653/v1/D19-5706 见 ACL Anthology D19-5706
2 FSL 0.90968 2019 神经网络 NER + 编辑距离归一化 系统论文见 BioNLP-OST 2019 会议论文集(官方结果页汇总) 见官方任务结果页
3 m-stoeckel 0.89888 2019 Bi-LSTM-CRF + 多语言 BERT 微调 系统论文见 BioNLP-OST 2019 会议论文集(官方结果页汇总) 见官方任务结果页
组合 系统投票融合(voting) 0.92355 2019 多系统预测投票集成 Gonzalez-Agirre, A., Marimon, M., Intxaurrondo, A., Rabal, O., Villegas, M., Krallinger, M. (2019). PharmaCoNER: Pharmacological Substances, Compounds and proteins Named Entity Recognition track. In Proceedings of the 5th Workshop on BioNLP Open Shared Tasks (pp. 1-10). ACL. DOI 10.18653/v1/D19-5701 官方论文
参考 VSP(Bi-LSTM-CRF + 字符特征) 0.7629 2019 两层 Bi-LSTM(字符级 + 词级)+ CRF,未用预训练词向量 Suárez-Paniagua, V. (2019). VSP at PharmaCoNER 2019. In Proceedings of the 5th Workshop on BioNLP Open Shared Tasks (pp. 16-20). ACL. DOI 10.18653/v1/D19-5703 见 ACL Anthology D19-5703
参考 sohrab(Contextual Exhaustive) 0.8676 2019 span enumeration + 上下文 span 表示 Sohrab, M. G., Pham, M. T., Miwa, M., Takamura, H. (2019). A Neural Pipeline Approach for the PharmaCoNER Shared Task using Contextual Exhaustive Models. In Proceedings of the 5th Workshop on BioNLP Open Shared Tasks (pp. 47-55). ACL. DOI 10.18653/v1/D19-5708 见 ACL Anthology D19-5708

子赛道 2:概念索引(SNOMED-CT,micro-average F1)

排名 模型/队伍 性能(micro-F1) 年份 关键技术 完整引用 代码
1 FSL 0.91593 2019 神经网络 NER + 编辑距离概念归一化 系统论文见 BioNLP-OST 2019 会议论文集(官方结果页汇总) 见官方任务结果页
2 ixamed 0.85347 2019 自建概念索引方法 系统论文见 BioNLP-OST 2019 会议论文集(官方结果页汇总) 见官方任务结果页
3 xiongying 0.83914 2019 Bpool(Bi-LSTM + max/mean pooling) Xiong, Y. et al. (2019). A Deep Learning-Based System for PharmaCoNER. ACL. DOI 10.18653/v1/D19-5706 见 ACL Anthology D19-5706
组合 无提升 — 2019 投票融合在子赛道 2 未带来提升 Gonzalez-Agirre, A. et al. (2019). PharmaCoNER 论文. ACL. DOI 10.18653/v1/D19-5701 官方论文

数值不可直接比较的原因:第一,两个子赛道的指标含义不同(span 匹配 vs 集合匹配),不可横向对比;第二,各队伍使用的预训练资源差异很大——有的用了医学词向量与多语言 BERT,有的仅用随机初始化嵌入,论文明确提到系统间方差较大;第三,test 集只有 250 篇文档,前二名差距 0.00084 远小于合理估计的评测噪声,排名不应被解释为方法优劣的定论;第四,子赛道 1 的"组合"成绩是多个系统投票集成的结果,并非单一模型,与单个系统不具可比性。

§8.2 SOTA 总结与选型建议

你的目标 推荐方案 预期性能区间 理由
快速可复现基线 西班牙语 BERT(BETO 系)微调 micro-F1 约 0.86-0.90 单模型、依赖少、训练快;接近 2019 年顶尖单系统水平
追求单模型上限 临床领域预训练编码器(如 RigoBERTa Clinical)微调 + CRF 解码 可能略高于通用 BERT 领域预训练在临床文本上通常有增益,但需确认许可
追求排行榜级性能 多模型集成/投票 论文记录 0.92355 论文证明投票融合有效;但工程成本高,且与单模型不可比
教学/演示 小模型(如 multilingual BERT 或 DistilBERT 多语言版) micro-F1 约 0.80-0.87 语料小,小模型即可达到可展示水平
概念索引 词典匹配 + 实体嵌入相似度 + 编辑距离的混合管线 F1 约 0.80-0.92 子赛道 2 的第一名方案即采用编辑距离匹配;纯神经方法在该任务上未显示优势
跨语言研究 英文语料预训练 + 西班牙语微调 视迁移策略而定 PharmaCoNER 标签语义与 CHEMDNER/GPRO 可比,适合作对照组

§8.3 评测协议

项目 子赛道 1 子赛道 2
任务定义 输出实体的精确 offset 与类别 输出文档级唯一 SNOMED-CT 概念 ID 集合
匹配方式 严格匹配:起始、结束位置与类别均须一致 集合匹配:文档内的 ID 集合比对
指标 micro-average precision / recall / F1 micro-average precision / recall / F1
参与类别 NORMALIZABLES / NO_NORMALIZABLES / PROTEINAS 对应 NORMALIZABLES 提及的概念
排除类别 UNCLEAR(不评测) 无
提交形式 标注文件(对应 BRAT .ann 的格式) TSV(filename, code)
参赛规模 22 队 / 77 runs 7 队 / 19 runs
数据集 关系 规模 差异
SPACCC 母语料 1,000 篇 / 396,988 词 无实体标注,仅文本
MEDDOCAN 同源(SPACCC 抽样) 500/250/250 标注个人身份信息而非药物
CANTEMIST 同为西班牙语临床 NER 501/500/300 标注肿瘤形态学实体
CodiEsp 同为西班牙语临床编码 500/250/250 任务是 ICD-10 编码分类
DisTEMIST 同为西班牙语临床 NER 750/0/250 标注疾病实体 + SNOMED-CT
LivingNER 同为西班牙语临床 NER 1,000/500/485 标注物种命名实体
SocialDisNER 同为西班牙语 NER 6,000/2,000/2,000 语域为社交媒体
NUBes 同为西班牙语生物医学语料 29,682 句 标注否定与不确定性
BARR2 同为西班牙语临床语料 318/146/220 标注缩写与全称对
CHEMDNER PharmaCoNER 的指南来源 10,000 篇摘要 英文药物/化学 NER
BC5CDR 同类英文语料 1,500 篇 化学物 + 疾病 + 关系,规模更大
GPRO PROTEINAS 类别指南来源 英文 蛋白/基因 NER

上述语料中,MEDDOCAN、CANTEMIST、CodiEsp、DisTEMIST、LivingNER、SocialDisNER、BARR2 与 PharmaCoNER 同属 PlanTL 资助的西班牙语临床 NLP 语料家族,共享 CC-BY-4.0 许可与 BRAT 标注格式。

§8.5 关键论文 Top 8

  1. Gonzalez-Agirre, A., Marimon, M., Intxaurrondo, A., Rabal, O., Villegas, M., Krallinger, M. (2019). PharmaCoNER: Pharmacological Substances, Compounds and proteins Named Entity Recognition track. In Proceedings of the 5th Workshop on BioNLP Open Shared Tasks (pp. 1-10). ACL. DOI 10.18653/v1/D19-5701 — 语料主论文,定义任务、数据与标注体系,报告两个子赛道的完整结果统计。任何使用该语料的工作都必须引用。

  2. Xiong, Y., Shen, Y., Huang, Y., Chen, S., Tang, B., Wang, X., Chen, Q., Yan, J., Zhou, Y. (2019). A Deep Learning-Based System for PharmaCoNER. In Proceedings of the 5th Workshop on BioNLP Open Shared Tasks (pp. 33-37). ACL. DOI 10.18653/v1/D19-5706 — 子赛道 1 第一名系统,BERT 用于 NER、Bpool 用于概念索引,是两个子赛道的强基线。

  3. Suárez-Paniagua, V. (2019). VSP at PharmaCoNER 2019: Recognition of Pharmacological Substances, Compounds and Proteins with Recurrent Neural Networks in Spanish Clinical Cases. In Proceedings of the 5th Workshop on BioNLP Open Shared Tasks (pp. 16-20). ACL. DOI 10.18653/v1/D19-5703 — 使用两层 Bi-LSTM(字符级 + 词级)+ CRF 的简洁方案,未用预训练词向量即达 F1 0.7629,是理解序列标注基线复杂度的好参照。

  4. Sohrab, M. G., Pham, M. T., Miwa, M., Takamura, H. (2019). A Neural Pipeline Approach for the PharmaCoNER Shared Task using Contextual Exhaustive Models. In Proceedings of the 5th Workshop on BioNLP Open Shared Tasks (pp. 47-55). ACL. DOI 10.18653/v1/D19-5708 — 提出枚举全部候选 span 并分类的"穷举式"方法,子赛道 1 得 F1 0.8676,展示了不同于 BIO 标注的建模范式。

  5. Intxaurrondo, A., Marimon, M., Gonzalez-Agirre, A., Lopez-Martin, J. A., Rodriguez, H., Santamaria, J., Villegas, M., Krallinger, M. (2018). Finding Mentions of Abbreviations and Their Definitions in Spanish Clinical Cases: The BARR2 Shared Task Evaluation Results. In IberEval@SEPLN 2018 (pp. 280-289) — 同源 SPACCC 语料上的缩写识别任务,是理解 PharmaCoNER 中缩写难点的重要背景文献。

  6. Krallinger, M. et al. (2015). The CHEMDNER corpus of chemicals and drugs and its annotation principles. Journal of Cheminformatics — PharmaCoNER 标注指南的英文来源之一(CHEMDNER 赛道),理解标签语义传承的必读文献。

  7. Pérez-Pérez, M. et al. (2017). BioCreative V.5 GPRO track — PROTEINAS 类别标注指南的来源,规定了蛋白/基因/肽/抗体的标注边界。

  8. 西班牙语临床语言模型综述(arXiv:2308.02199,2023) — 把 PharmaCoNER 与 BARR2、MEDDOCAN、CANTEMIST、DisTEMIST、LivingNER、SocialDisNER 等一并汇总为标准西班牙语临床语料,提供了统一口径的规模对照表,是了解生态定位的高效入口。

§8.6 社区活跃度

指标 现状 说明
共享任务参赛 子赛道 1:22 队 77 runs;子赛道 2:7 队 19 runs 2019 年举办,参与规模中等偏上
论文引用量 101+(Semantic Scholar,截至 2026-09) 持续被西班牙语临床 NLP 工作引用
后续任务衍生 SMM4H 2020(社交媒体药物提及)等 论文明确提到向社交媒体语域扩展
语料家族 MEDDOCAN、CANTEMIST、CodiEsp、DisTEMIST、LivingNER、SocialDisNER、BARR2 PlanTL 资助的西班牙语临床 NLP 语料群
社区镜像 HuggingFace PlanTL-GOB-ES 官方镜像、bigbio 版、IIC 版 多渠道分发,降低使用门槛
官方维护 GitHub 仓库 PlanTL-GOB-ES/PharmaCoNER 仅含 README 官方仓库基本为静态索引页,活跃开发有限
配套工具 PharmaCoNER tagger、西班牙语医学分词/分句/POS/词形还原工具、化学药物词典、缩写词表 官方一次性发布,未见持续更新

§8.7 生态快照

资源 类型 链接 Star/状态(截至 2026-09) 推荐理由
官方任务主页(TeMU/BSC) 文档 {url_name}/0 静态页,仍可访问 任务说明、日程、配套资源的总入口
Zenodo 官方数据记录 数据 {url_name}/0 开放访问 金标准 + 背景集 + 标注指南的唯一权威来源
HuggingFace 官方镜像 数据 + 脚本 {url_name}/0 一行加载 最快上手路径,CoNLL 版即用
HuggingFace BigBIO 版 数据 + 脚本 {url_name}/0 社区维护 统一的生物医学 NER schema,便于跨语料组合
SPACCC 源语料(GitHub) 数据 + 文档 {url_name}/0 静态 需要无标注大规模文本做领域预训练时使用
SPACCC 源语料(Zenodo) 数据 {url_name}/0 开放访问 与 PharmaCoNER 同一母语料,DOI 可引用
ACL Anthology 主论文 论文 {url_name}/0 开放获取 引用与结果统计的权威出处
BioNLP-OST 2019 工作坊页 会议 {url_name}/0 归档页 了解六赛道全景与会议背景

需要说明的是,官方 GitHub 仓库(PlanTL-GOB-ES/PharmaCoNER)本身只有一个 README,不包含代码或数据文件;真正的数据在 Zenodo,可用格式在 HuggingFace。Star 数不适用于该仓库(无实质内容),因此上表以"状态"替代 Star 指标。这一结构在早期共享任务语料中很常见:GitHub 只作为索引页,发行渠道另行选定。


§9 相关资源与引用

§9.1 官方资源

资源 说明
官方任务主页 任务介绍、日程、配套资源索引、联系方式
Zenodo 数据记录(4270158) 金标准(train/dev/test)+ 背景集 + 标注指南 + 银标准
Zenodo SPACCC 记录(2560316) 母语料 1,000 篇病例,CC-BY-4.0,1.3 MB
GitHub PlanTL-GOB-ES/PharmaCoNER 官方索引仓库
GitHub PlanTL-GOB-ES/SPACCC 源语料仓库与 README
HuggingFace PlanTL-GOB-ES/pharmaconer 官方数据加载脚本,版本 1.1.0
HuggingFace bigbio/pharmaconer BigBIO 社区版
ACL Anthology D19-5701 主论文
BioNLP-OST 2019 工作坊页面 会议与六赛道背景

以上资源的实际访问地址在本站对应词条页面统一提供(见 INFOBOX 的"官方主页"与"下载地址"行)。

§9.2 官方联系方式

用途 联系方式
任务与数据咨询 encargo-pln-life@bsc.es
PlanTL 相关咨询 plantl-gob-es@bsc.es
源语料版权 西班牙数字化与人工智能国务秘书处(SEAD/SEDIA)

§9.3 BibTeX 引用

@inproceedings{gonzalez-agirre-etal-2019-pharmaconer,
  title     = "{P}harma{C}o{NER}: Pharmacological Substances, Compounds and proteins Named Entity Recognition track",
  author    = "Gonzalez-Agirre, Aitor and Marimon, Montserrat and Intxaurrondo, Ander and Rabal, Obdulia and Villegas, Marta and Krallinger, Martin",
  booktitle = "Proceedings of The 5th Workshop on BioNLP Open Shared Tasks",
  month     = nov,
  year      = "2019",
  address   = "Hong Kong, China",
  publisher = "Association for Computational Linguistics",
  url       = "https://aclanthology.org/D19-5701",
  doi       = "10.18653/v1/D19-5701",
  pages     = "1--10"
}

引用源语料时的 BibTeX:

@dataset{intxaurrondo_etal_2018_spaccc,
  title     = "{SPACCC}: {S}panish {C}linical {C}ase {C}orpus",
  author    = "Intxaurrondo, Ander and Krallinger, Martin and Gonzalez-Agirre, Aitor and Marimon, Montserrat and Villegas, Marta",
  year      = "2018",
  publisher = "Zenodo",
  version   = "2019-02-01",
  doi       = "10.5281/zenodo.2560316",
  url       = "https://doi.org/10.5281/zenodo.2560316"
}

引用参赛系统时的模板:

@inproceedings{xiong-etal-2019-deep,
  title     = "A Deep Learning-Based System for {P}harma{C}o{NER}",
  author    = "Xiong, Ying and Shen, Yedan and Huang, Yuanhang and Chen, Shuai and Tang, Buzhou and Wang, Xiaolong and Chen, Qingcai and Yan, Jun and Zhou, Yi",
  booktitle = "Proceedings of the 5th Workshop on BioNLP Open Shared Tasks",
  month     = nov,
  year      = "2019",
  address   = "Hong Kong, China",
  publisher = "Association for Computational Linguistics",
  doi       = "10.18653/v1/D19-5706",
  pages     = "33--37"
}

§9.4 引用指南

使用情形 应引用
使用语料做研究或发表 主论文(Gonzalez-Agirre et al. 2019)+ Zenodo 数据记录
分析或复用语料的源文本 追加引用 SPACCC(Intxaurrondo et al. 2018,DOI 10.5281/zenodo.2560316)
与某个参赛系统对比 需同时引用该系统的论文(如 Xiong et al. 2019)
使用 HuggingFace 加载脚本 主论文 + 注明脚本版本(v1.1.0)
概念索引任务 主论文 + 明确说明所用 SNOMED-CT 发行版与获取日期
再分发语料 保留 CC-BY-4.0 声明与全部原始署名信息

§10 AI 使用声明卡

§10.1 AI 模型列表

项目 内容
撰写辅助模型 大语言模型辅助生成与结构化整理
检索工具 通用网络检索与页面抓取工具
人工参与 章节结构设计、事实核对、代码审读由编辑完成
生成范围 全文草稿、表格结构、代码示例初稿、JSON-LD 序列化

§10.2 AI 参与范围

环节 AI 参与程度 说明
事实检索与来源核对 辅助 AI 执行检索并整理来源,编辑核对官方页面与论文原文
章节结构 辅助 结构来自本站写作规范,非 AI 自行设计
数值填写 辅助 所有数值均来自检索到的官方或论文来源,未做推算的已标注
代码示例 辅助 由 AI 起草,编辑审读逻辑与 API 用法
偏倚与局限分析 辅助 基于官方文档与论文 limitations 整理,编辑补充归纳
结论与建议 辅助 编辑负责最终判断与表述

§10.3 输入来源列表

  1. Gonzalez-Agirre, A., Marimon, M., Intxaurrondo, A., Rabal, O., Villegas, M., Krallinger, M. (2019). PharmaCoNER: Pharmacological Substances, Compounds and proteins Named Entity Recognition track. Proceedings of the 5th Workshop on BioNLP Open Shared Tasks, pp. 1-10. ACL. DOI 10.18653/v1/D19-5701
  2. PharmaCoNER 官方任务主页,Biomedical Text Mining Unit, Barcelona Supercomputing Center(任务说明、日程、实体类别、奖金设置)
  3. Zenodo 数据记录 4270158:PharmaCoNER corpus: gold standard annotations of Pharmacological Substances, Compounds and proteins in Spanish clinical case reports(语料规模、划分、IAA、格式、许可)
  4. HuggingFace 数据集 PlanTL-GOB-ES/pharmaconer 数据加载脚本(版本 1.1.0,标签体系、句数统计、许可)
  5. HuggingFace 数据集 bigbio/pharmaconer 数据加载脚本(BigBIO 版 schema 与描述)
  6. GitHub PlanTL-GOB-ES/SPACCC README(源语料构建过程、许可、版权方)
  7. Zenodo 记录 2560316:SPACCC: Spanish Clinical Case Corpus(1,000 篇 / 396,988 词、1.3 MB、DOI)
  8. Xiong, Y., Shen, Y., Huang, Y., Chen, S., Tang, B., Wang, X., Chen, Q., Yan, J., Zhou, Y. (2019). A Deep Learning-Based System for PharmaCoNER. Proceedings of the 5th Workshop on BioNLP Open Shared Tasks, pp. 33-37. ACL. DOI 10.18653/v1/D19-5706
  9. Suárez-Paniagua, V. (2019). VSP at PharmaCoNER 2019. Proceedings of the 5th Workshop on BioNLP Open Shared Tasks, pp. 16-20. ACL. DOI 10.18653/v1/D19-5703
  10. Sohrab, M. G., Pham, M. T., Miwa, M., Takamura, H. (2019). A Neural Pipeline Approach for the PharmaCoNER Shared Task using Contextual Exhaustive Models. Proceedings of the 5th Workshop on BioNLP Open Shared Tasks, pp. 47-55. ACL. DOI 10.18653/v1/D19-5708
  11. PharmaCoNER 官方结果讨论幻灯片(BioNLP-OST 2019 Workshop,2019-11-04,中国香港):参赛队伍数、前三名成绩、投票融合结果、缩写难点讨论、配套资源清单
  12. A Survey of Spanish Clinical Language Models(arXiv:2308.02199,2023):西班牙语临床语料汇总表与规模口径对照
  13. A comparative analysis of Spanish Clinical encoder-based models on NER and classification tasks(PMC11339503):西班牙语临床语料许可与划分对照表
  14. BioNLP-OST 2019 工作坊官方页面:会议日期、地点、赛道构成与投稿安排
  15. Semantic Scholar 论文页(CorpusID: 207925157):引用量统计(101+,截至 2026-09)

§10.4 人工校验表

内容模块 审核者 审核方式 审核状态
§1 数据集概览(规模、划分、定位) 千方病案医学编辑部 与官方任务主页、Zenodo 记录、主论文逐项核对 ✅ 已通过
§2 医学背景(SNOMED-CT 关系、临床任务) 千方病案医学编辑部 对照论文任务定义与 SNOMED-CT 用途说明复核 ✅ 已验证
§3 数据集规格(版本、格式、大小、标注) 千方病案医学编辑部 对照 HuggingFace 脚本与 Zenodo 记录核对 ✅ 已通过
§4 数据结构(目录树、DAIMS 字段字典) 千方病案医学编辑部 对照 BRAT 规范与加载脚本字段定义复核 ✅ 已验证
§5 划分与使用建议(泄漏风险) 千方病案医学编辑部 结合 SPACCC 家族语料来源关系判断 ✅ 已通过
§6 代码与坑点(8 个坑点、Pipeline) 千方病案医学编辑部 逐段审读代码逻辑、API 用法与坑点来源 ✅ 已验证
§7 质量评估(偏倚、DAIMS 24 项) 千方病案医学编辑部 对照官方文档与论文 limitations 复核 ✅ 已通过
§8 基准与生态(排行榜数字) 千方病案医学编辑部 与论文 Table 5/6 及官方结果页逐数字核对 ✅ 已验证
§9 资源与引用(BibTeX、DOI) 千方病案医学编辑部 与 ACL Anthology 与 Zenodo 记录核对 ✅ 已通过
§10 AI 使用声明与来源列表 千方病案医学编辑部 复核来源完整性与引用格式 ✅ 已验证

§10.5 AI 生成章节标注

章节 生成方式 说明
frontmatter AI 起草 + 人工核对 schema_org 字段按本站规范填写,数值来自官方来源
INFOBOX AI 起草 + 人工核对 每个字段均有来源支撑,不可得字段整行省略
§0 E-E-A-T 模板填充 审核声明与免责文本采用本站固定模板
§1-§5 AI 起草 + 人工核对 事实与数值逐项对照来源
§6 AI 起草 + 人工审读 代码逻辑经审读,坑点来自官方文档与论文的真实失败模式
§7 AI 起草 + 人工核对 偏倚与局限性基于论文 limitations 与官方声明归纳
§8 AI 起草 + 人工核对 排行榜数字逐项核对论文表格
§9-§10 AI 起草 + 人工核对 引用格式与来源清单经复核

§10.6 最后人工审核日期

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

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


相关数据集导航

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

  • distemist — 共享标签:医疗NLP / 临床文本 / 命名实体识别
  • meddoprof — 共享标签:医疗NLP / 临床文本 / 命名实体识别
  • cantemist — 共享标签:医疗NLP / 临床文本 / 命名实体识别
  • umls — 共享标签:医疗NLP / 临床文本 / 命名实体识别
  • radgraph — 共享标签:医疗NLP / 临床文本 / 命名实体识别
  • mimic-iv-ext-pe — 共享标签:医疗NLP / 临床文本
  • rad-coreference-resolution — 共享标签:医疗NLP / 临床文本
  • radgraph2-radiology-reports — 共享标签:医疗NLP / 临床文本
  • maccrobat — 共享标签:医疗NLP / 临床文本 / 命名实体识别
  • thyme — 共享标签:医疗NLP / 临床文本 / 命名实体识别

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

返回 AI-Ready 数据集