信息速览
CRAFT — 生物医学全文本体标注金标准 AI-Ready Wikipedia
INFOBOX
| 数据集名称 | Colorado Richly Annotated Full-Text (CRAFT) Corpus |
| 英文全称 | Colorado Richly Annotated Full-Text Corpus |
| 别名/简称 | CRAFT、CRAFT Corpus、Colorado Richly Annotated Full-Text |
| 疾病分类 | 无单一疾病分类(跨学科生物医学文献);疾病层经 MONDO 疾病本体标注(ICD-11 示例:3A00 贫血 / 5A11 2 型糖尿病 / 2A00 实体肿瘤,详见 §2.1) |
| SNOMED CT | 无患者级临床术语映射;本体层对应 138875005 SNOMED CT Concept 语义层级(详见 §2.1b) |
| 数据模态 | 生物医学文献全文文本(含句法、共指、语义三层人工标注) |
| AI 任务类型 | 命名实体识别(NER)、命名实体归一化(NEN,即概念识别)、句法依存分析、共指消解、关系抽取、生物医学文本挖掘、知识图谱构建、生物策展辅助 |
| 样本总数 | 97 篇全文(67 篇训练集 + 30 篇测试集)/ 20 个概念标注集 / 140,000+ 条概念标注 / 790,000+ token |
| 数据大小 | 175.0 MB(v5.0.0 完整 ZIP);文本身仅约数十 MB |
| 数据格式 | TXT(纯文本)/ NXML(PMC 原生)/ Knowtator XML / BioNLP stand-off / CoNLL-U / Penn Treebank / UIMA XMI / OBO(本体)/ RDF |
| 许可证 | Creative Commons Attribution 3.0 Unported(CC BY 3.0) |
| 访问级别 | 开放(无需注册、无需申请,GitHub / SourceForge 直接下载) |
| DUO 标签 | NRES, PUB |
| 语言 | 英文 |
| 首发日期 | 2012-07-09(BMC Bioinformatics 论文与首版 67 篇同期发布) |
| 最后更新 | 2022-07-26(v5.0.2,修复 CoNLL 文档 #end 标签追加问题) |
| 发布机构 | 科罗拉多大学丹佛分校计算生物科学项目(UC Denver, Computational Bioscience Program) |
| 官方主页 | https://github.com/UCDenver-ccp/CRAFT |
| 下载地址 | https://github.com/UCDenver-ccp/CRAFT/archive/refs/tags/v5.0.0.zip |
| DOI | 10.1186/1471-2105-13-161(概念标注论文)/ 10.1093/database/bax087(UBERON 标注论文) |
| 引用次数 | 470+(Google Scholar,截至 2026-09) |
| AI 就绪度评分 | ⭐⭐⭐⭐(4/5)— 有官方 67/30 划分与 Docker 评测套件、格式转换脚本齐全;扣分项:无现成 PyTorch DataLoader、原生 stand-off 格式需自行转换、不连续标注需特殊处理 |
| 页面状态 | published |
§0 E-E-A-T 信任声明与免责声明
医学审核者:千方病案医学编辑部交叉审核:§2 医学背景(本体术语与临床语义层级的对应关系、语料采样人群描述、金标准描述)、§7 偏倚分析。
数据工程审核者:千方病案医学编辑部交叉审核:§4 DAIMS 数据字典(stand-off 标注字段与偏移量语义)、§5 数据划分策略、§6 预处理 Pipeline 和坑点。
审核日期:2026-09-05
审核方式:交叉审核
利益冲突声明:千方病案医数集与科罗拉多大学丹佛分校、CRAFT 语料开发团队无任何商业利益关联。本页面不销售 CRAFT 数据集本身,仅提供 AI 就绪指南与学术信息服务。编辑者未接受 UC Denver 或任何相关资助机构的任何形式资助。
医疗免责声明:本页面提供的医学信息仅供研究和教育目的,不构成医疗建议、诊断或治疗方案。数据集的医学描述基于公开发表的文献,未经逐一临床验证。任何基于该数据集训练的 AI 模型在应用于临床决策前,必须经过独立的临床验证和监管审批。
技术免责声明:本页面的代码示例、预处理建议和基准性能数据基于公开资料整理,不保证在特定环境下的准确性和适用性。使用者应自行验证代码安全性和数据预处理流程的正确性。千方病案医数集不对因使用本页面信息而导致的任何直接或间接损失承担责任。
数据使用合规:使用本页面描述的数据集前,请务必阅读并遵守数据集原始许可协议。CRAFT 以 CC BY 3.0 许可发布,允许在署名前提下自由复制、分发与改编,但不得暗示原作者或机构为你的使用背书。语料中的期刊文章来自 PubMed Central 开放获取子集,再分发时须保留原始出处与许可声明。DUO 标签仅供参考,具体使用限制以数据集官方协议为准。
§1 数据集概览
§1.0 30 秒速览
这是什么? CRAFT 是一本「被人工逐字拆解过的生物医学论文合集」。它收录了 97 篇开放获取的期刊全文,篇幅合计超过 790,000 个词(token)。与常见的「只标摘要」的语料不同,这 97 篇文章从第一句到最后一句、包括 Methods 与 Discussion 在内被完整覆盖。研究团队为每篇文章做了三层人工标记:句界、词性与完整语法树(句法层);「it」「this protein」「p53」究竟指同一个东西还是不同东西(共指层);以及文中出现的每一个细胞类型、化学分子、基因、蛋白质、解剖部位分别对应国际本体里的哪个编号(语义层)。
为什么重要? 生物医学文献的知识绝大多数写在正文而不是摘要里,而计算机恰恰最不擅长读正文。CRAFT 出现之前,评测命名实体识别系统主要依赖摘要语料或人工构造的短句,系统在摘要上表现优异、一到全长正文就大幅掉分。CRAFT 第一次提供了量级足够大、标注质量足够高、且覆盖多学科全长正文的金标准,让「模型在真实全文上到底行不行」变成可被定量回答的问题。它因此成为生物医学概念识别领域公认的试金石,并直接定义了 2019 年 BioNLP Open Shared Tasks 的概念标注赛道。
我能用它做什么? 最典型的用法有三类:一是训练或评测生物医学命名实体识别与概念归一化模型(识别「autosomal」这个 span 并归一化到 GO:0030849);二是评测文本预处理工具链,包括分句器、分词器、词性标注器与依存句法分析器在真实科学语体下的表现;三是研究科学文献特有的语言现象,例如不连续提及(「somatic and germ cells」同时指两类细胞)、跨本体重叠标注和长距离共指。全部内容以 CC BY 3.0 发布,无需注册即可下载,是少数可放心用于商业与学术双重场景的开放语料。
§1.1 摘要
CRAFT 的工作可以概括为「在一个严格的采样框内,用统一指南对全文做穷尽式本体标注」。
采样框的定义方式直接决定了语料的面貌。研究团队没有随机抽取期刊文章,而是界定了这样一个集合:所有曾被小鼠基因组信息学(Mouse Genome Informatics,MGI)用作至少一条 Gene Ontology 或 Mouse Phenotype Ontology 注释证据的期刊论文。这个选择带来两个效果:语料天然聚焦于实验小鼠(Mus musculus)遗传学,同时学科分布极广,覆盖遗传学、分子生物学、细胞生物学、发育生物学、神经科学等方向。
标注在正文的纯文本版本上进行,采用 stand-off(分离式)标注:正文与标注分存于不同文件,标注通过字符偏移量指回正文。好处是同一份文本可叠加任意多套标注而互不污染,代价是偏移量计算成为一切下游工作的前提。语义标注依据单一一套书面指南,标注者约每周开会校准,从而取得稳定较高的标注者间一致性。句法标注产出 Penn Treebank 风格成分句法树,后由 CLEAR Parser 派生出依存句法树(官方说明该派生未经人工校订)。共指标注改编自 OntoNotes 指南,覆盖所有同指基础名词短语,为语料新增近 30,000 条标注。
语义层的本体选择遵循开放生物医学本体(OBO)体系。首版覆盖九个本体与术语体系;v2.1 加入 UBERON 解剖学标注与 MOP 分子过程本体,v5.0 加入 MONDO 疾病本体,最终形成十个实体类型、每类含 proper(仅用本体正式类)与 extended(使用 CRAFT 自建扩展类)两个版本、合计 20 个标注集的结构。
§1.2 战略价值
维度一:解决「摘要—全文鸿沟」的评测基础设施问题。 生物医学 NLP 长期存在结构性错配:训练与评测资源集中在摘要,而真实的知识抽取需求落在全文。摘要在句长、术语密度、指代结构、信息冗余度上与正文存在系统性差异,导致摘要上训练的模型迁移到全文时性能显著下降(基因提及识别任务尤为明显)。更大的障碍是缺少一致性的评测对象——不同研究各自随意划分训练/测试集,甚至直接在全语料上评测,结果彼此无法比较。CRAFT 把全文标注做成金标准,并在 v4 中把 30 篇预留文章作为固定官方测试集释放,配合开源 Docker 评测镜像,第一次让全文概念识别有了可复现的排行榜。
维度二:让「概念归一化」而非仅「实体识别」成为可评测任务。 大量早期系统只做 NER,即划出「这是什么实体」,却不回答「它对应本体里的哪一个编号」。CRAFT 的标注携带完整的本体类标识符(如 CL:0000604、GO:0030849),评测协议要求系统直接输出类 ID,从而把 NEN(命名实体归一化)推到了一等公民的位置。这在实用层面意义重大:知识图谱构建与生物策展辅助场景中,只识别出「一个蛋白质」几乎无用,必须定位到唯一标识符才能与数据库记录连接。
维度三:为「困难语言现象」提供定量证据。 语料中 1,264 条不连续标注、788 条同类部分重叠标注、3,362 条跨类重叠标注,构成真实世界中罕见但不可忽略的复杂标注集合。2019 年共享任务的所有参赛系统都未能识别任何不连续 span,这个「集体零分」本身即是有价值的发现,把长程依赖与多 span 结构明确标记为下一代架构的攻关方向。此外,共指研究表明沿 IDENTITY 链传播可为全语料新增 106,263 个命名实体,相较八个已标注本体的语义类提及总量增长 76%——定量说明仅靠 span 级标注会系统性低估信息量。
§1.3 同类数据集横向对比
| 数据集 | 发布机构 | 规模 | 文本范围 | 标注层次 | 本体覆盖 | 许可与获取 | 差异化定位 |
|---|---|---|---|---|---|---|---|
| CRAFT | UC Denver | 97 篇全文 / 790,000+ token | 完整正文(含 Methods) | 语义 + 句法 + 共指 | 10 类实体 / 8 本体(proper + extended 20 集) | CC BY 3.0,公开直下 | 唯一同时具备全长正文、多本体语义标注与共指标注的金标准 |
| GENIA | 东京大学(Tsujii 实验室) | 约 2,000 篇摘要 + 部分全文 | 以摘要为主 | 语义(TERM)+ 句法 | 自有实体类别体系 | 需申请,许可受限 | 规模大、句法标注经典,但以摘要为主且实体体系非 OBO 对齐 |
| BioInfer / PennBioIE | 图尔库大学 / 宾夕法尼亚大学 | 1,100 句 / 约 4,000 篇摘要 | 单句 / 摘要 | 关系 + 实体 / 语义 + 句法 | 无 OBO 归一化 / 领域特化类别 | 开放 | 标注细致但粒度局限(句子级或摘要级),类别非社区本体 |
| BC5CDR | BioCreative V | 1,500 篇 PubMed 文章 | 摘要 | 化学物质 + 疾病 NER 与关系 | MeSH 对齐 | 开放(CDR 挑战赛) | 关系抽取金标准,但仅摘要、仅两个实体类型 |
| Cadec | 波恩大学等 | 150 篇药品说明书 | 短文档 | 语义 NER | 自有药物类别 | 开放 | 面向药物警戒,语体与生物医学论文差异大 |
| jNLPBA / GENETAG | 多机构 | 数万句 | 摘要句子 | 仅基因 / 蛋白质 NER | 无归一化 | 开放 | 数据量大但任务单一、无本体归一化与全文覆盖 |
| CRAFT-ST 2019 赛道数据 | UC Denver | 67 训练 + 30 测试 | 全文 | 语义 + 句法 + 共指 | 同上 | CC BY 3.0 | 即 CRAFT v3.1.3 的评测切分,是 CRAFT 自身的竞赛化封装 |
| 从对比可以看出,CRAFT 的规模在语料库中并非最大,它的不可替代性来自「层次组合」:全长正文 + 多本体归一化 + 共指 + 句法,四者同时具备的公开语料目前仍只有它一个。 |
§1.4 版本时间轴
| 版本 | 发布日期 | 关键变化 | 语料规模 |
|---|---|---|---|
| v0.9 | 2012-05-27(README 更新) | 首批内部发布,提供 GPML / Knowtator XML / UIMA XMI / Penn Treebank / AO RDF / CoNLL 依赖树多格式,支持 BRAT 在线浏览 | 67 篇 |
| v1.0 / v2.0 | 2012-2013 | 与 Bada et al. 2012 论文同期;补充 RDF 表示与本体 OBO 文件 | 67 篇 |
| v2.1 | 2017(Database 论文) | 加入 UBERON 解剖学标注,为当时最大规模公开金标准解剖标注集 | 67 篇 |
| v3.0 / v3.1.x | 2018-2019 | 概念标注重大更新:采用更新版本本体,引入扩展类(extension classes),新增 MOP 与 UBERON 标注;v3.1.3 为 2019 共享任务指定版本 | 67 篇 + 30 篇预留 |
| v4.0.0 | 2019-09-18 | 整合为共享任务预留的 30 篇文章,语料达到设计全量 | 97 篇 |
| v4.0.1 | 2021-02-16 | 修正少量错误标注,补充共指标注指南 | 97 篇 |
| v5.0.0 | 2022-02-16 | 加入 MONDO 疾病本体标注 | 97 篇 |
| v5.0.1 | 2022-07(同日发布) | 修复阻止 MONDO 标注与其他标注类型共用的问题 | 97 篇 |
| v5.0.2 | 2022-07-26 | 修复 CoNLL 格式文档 #end 标签未正确追加的缺陷(最新版) |
97 篇 |
§1.5 典型应用场景
- 命名实体识别与概念归一化的训练与评测。 在 20 个标注集上分别训练模型并按本体报告指标,是最标准的用法:可只选一个本体(如 GO_BP)深入调优,也可跑满全部本体考察泛化。
- 全文预处理工具链的鲁棒性体检。 利用句法层的人工句界、分词与词性标注,量化评估 spaCy、Stanza、SciSpacy 等工具在科学语体下的性能落差,为流水线选型提供依据。
- 共指消解与科学文献指代现象研究。 IDENTITY 链可用于训练评测共指模型;通用域中被视为「泛指」的名词短语在生物医学文本中常指向特定本体类,构成系统性挑战。
- 不连续与重叠标注的建模研究。 1.46% 的不连续标注是明确的技术靶点,可用 CRAFT 作为唯一可用的真实评测集设计 span-set 解码方案。
- 生物策展辅助与知识图谱构建。 采样框本身即 MGI 策展证据文献,适合训练「提取可用于数据库注释的证据句」的工具;extended 集则提供了本体类与 CRAFT 扩展类的映射关系,可用于本体对齐研究。
§2 医学背景与临床语境
§2.1 语义层级与 ICD-11 编码对照
CRAFT 本身是文本语料而非患者数据库,不含 ICD 诊断编码。为便于医学读者建立直观定位,下表给出语料文献中高频出现的疾病主题与其在 ICD-11 中的对应编码,并注明该主题在 CRAFT 中实际对应的本体层(MONDO 于 v5.0.0 加入)。
| 标签 | ICD-11 编码 | ICD-11 中文名 | CRAFT 本体层对应 | 语料中的典型表现 |
|---|---|---|---|---|
| 血液系统疾病 | 3A00 | 缺铁性贫血 | MONDO:0002280 贫血 | 小鼠造血功能缺陷表型描述 |
| 代谢性疾病 | 5A11 | 2 型糖尿病 | MONDO:0005148 | 糖代谢相关基因敲除模型 |
| 实体肿瘤 | 2A00 | 恶性肿瘤(实体瘤) | MONDO:0004992 癌症 | 肿瘤发生相关基因与通路讨论 |
| 神经系统疾病 | 8A00 | 神经系统疾病 | MONDO 神经类 | 运动障碍、神经退行表型 |
| 免疫系统疾病 | 4A00 | 免疫系统疾病 | MONDO 免疫类 | 免疫缺陷与炎症通路 |
| 发育异常 | LD2F | 先天性畸形 | MONDO 发育类 | 胚胎致死与器官发育缺陷 |
| 心血管疾病 | BA00 | 心脏疾病 | MONDO 心血管类 | 心肌结构与功能异常模型 |
| 遗传性疾病 | LD2F.1 | 单基因遗传病 | MONDO 遗传类 | 单基因突变导致的表型 |
需要强调:上表中 ICD-11 编码是编者依据疾病主题添加的导航性对照,不来自 CRAFT 原始标注。CRAFT 的疾病标注使用 MONDO 疾病本体标识符,且 MONDO 标注集不存在扩展类版本,评测目录名有两套可选:MONDO_WITHOUT_GENOTYPE_ANNOTATIONS 与 MONDO_WITH_GENOTYPE_ANNOTATIONS。 |
§2.1b SNOMED CT 语义层级映射
CRAFT 的语义标注全部使用 OBO 本体,与 SNOMED CT 无直接映射关系。下表说明 CRAFT 各本体层与 SNOMED CT 概念层级的语义对应,供临床信息学读者参考其与临床术语体系的距离。
| 标签 | SNOMED CT 码 | 术语 | CRAFT 本体层 | 语义对应说明 |
|---|---|---|---|---|
| 顶层概念 | 138875005 | SNOMED CT Concept | 全套 OBO 本体 | 两者均为形式化本体,但顶层设计不同:SNOMED 面向临床记录,OBO 面向实验生物学 |
| 解剖结构 | 91723000 | Anatomical structure | UBERON | CRAFT 的 UBERON 标注对应「解剖实体」,以跨物种比较解剖为核心,比 SNOMED 解剖轴更侧重模型动物 |
| 细胞 | 15200002 | Cell structure | CL(Cell Ontology) | CL 覆盖类型学层级的细胞分类,排除细胞系细胞;SNOMED 细胞条目偏组织结构描述 |
| 化学物质 | 410942007 | Drug or medicament | CHEBI | CHEBI 覆盖化合物本体化学定义,范围远宽于 SNOMED 的药物条目 |
| 蛋白质 | 88878007 | Protein | PR(Protein Ontology) | PR 以进化家族与修饰型态组织蛋白质,与 SNOMED 的实体化分类不一一对应 |
| 生物过程 | 410876001 | Physiologic process | GO_BP | GO 生物过程面向基因产物功能,与 SNOMED 的临床过程概念粒度不同 |
| 疾病 | 64572001 | Disease | MONDO(v5.0.0 起) | MONDO 整合多个疾病本体,与 SNOMED 疾病轴可部分交叉但无官方映射表 |
| 物种 | 410607006 | Organism | NCBITaxon | NCBITaxon 覆盖全部生物分类阶元,SNOMED 仅覆盖医学相关物种 |
| 结论性提示:CRAFT 是实验生物学本体的语料,而非临床术语的语料。把 CRAFT 训练的模型直接用于临床记录(如电子病历中的 SNOMED CT 编码)会面临显著的领域迁移问题——两者共享「本体驱动」的方法论,但词汇分布、句子结构、实体类别边界均不同。 |
§2.2 语料主题简介与学科分布
CRAFT 的核心采样人群不是患者,而是「被小鼠遗传学研究引用过的论文」。理解这一点是理解整个语料偏倚结构的关键。
采样框来自小鼠基因组信息学(MGI)的证据追溯:凡是 MGI 曾用某篇论文作为至少一条 Gene Ontology 或 Mouse Phenotype Ontology 注释证据的来源,该论文即进入候选池。因此语料中的文章共享一个语义特征——都包含可被策展的、关于基因功能或小鼠表型的实证陈述;学科上则高度分散,覆盖遗传学、分子生物学、细胞生物学、发育生物学、神经科学、免疫学、生理学等。物种分布印证了这一偏向:NCBITaxon 标注涉及非洲爪蟾(Xenopus laevis)、小鼠(Mus musculus)、大鼠属(Rattus)、褐家鼠(Rattus norvegicus)与人类(Homo sapiens),其中小鼠相关表述占主导;高频被标注的基因与蛋白质包括 Grid2ip、TPP1、Suox、Ntf3、Ces1e 等,均来自小鼠遗传学研究文献。
因此需注意:原论文的论证是开放获取文章在语言结构与语义内容上与传统期刊文章无系统性差异,故可代表更广泛的生物医学文献。该论证在语言学层面成立,但在主题分布层面并不能推出 CRAFT 代表临床医学文献——它的代表性在于语体与标注质量,不在于疾病谱的均衡覆盖。
§2.3 临床与计算任务定义
CRAFT 支撑的是信息抽取任务链,而非传统临床决策任务。下表把通用临床任务框架映射到 CRAFT 可支撑的计算任务,便于读者理解其在医疗 AI 版图中的位置。
| 任务层级 | 临床场景类比 | CRAFT 对应计算任务 | 输入 | 输出 | 主要评测指标 |
|---|---|---|---|---|---|
| 筛查 | 文献筛选与证据发现 | 概念识别(span 检测) | 全文纯文本 | 实体边界 | Precision / Recall / F1(边界匹配) |
| 诊断 | 疾病/表型判定 | 概念归一化(NEN) | 实体 span | 本体类 ID | Precision / Recall / F1(类 ID 匹配) |
| 分级 | 语义粒度区分 | extended 类判定 | 模糊表述 | 扩展类 ID | 同上,分 proper / EXT 两档报告 |
| 预后 | 关系与机制推断 | 关系抽取 / 共指消解 | 多个实体与指代链 | 关系三元组 / 指代链 | MUC / B³ / CEAF / LEA |
| 结构化 | 病历结构化入库 | 句法与词法分析 | 原始文本 | 依存树 / 词性序列 | LAS / MLAS / BLEX / 词性准确率 |
| 质控 | 策展一致性 | 标注者间一致性评估 | 双重标注 | IAA 分数 | F-score 形式的一致性 |
| 任务一的难点在于科学语体的形态复杂性:希腊字母、化学式下标、连字符复合词、基因名中的斜杠(如 “Mcm4/6/7”)都会让通用分词器出错,而分词错误会直接传导为边界错误。 | |||||
| 任务二的难点在于同义与多义的双向歧义。同一个类可以有无穷多种表述(“autosomal” 对 GO:0030849),同一个表述也可能映射到不同类(“cell” 在 CL、GO、UBERON 中各有其类)。评测要求系统输出唯一的类 ID,因此归一化阶段通常需要借助本体词典查找。 | |||||
| 任务三的难点在于本体覆盖边界。某个表述落在本体正式类之外时,proper 标注集里根本没有合法答案,这时 extended 类提供了「可用的近似落点」——这也是为什么加入扩展类在多数本体上提升了系统性能(见 §8.1)。 |
§2.4 语料来源人群特征表
由于 CRAFT 是文本文献语料,此处的「人群」指语料的文献来源构成,而非患者人群。为遵守信息不可得即省略的原则,缺少可靠来源的维度整行省略。
| 维度 | 说明 |
|---|---|
| 来源 | PubMed Central 开放获取子集(PMC Open Access Subset)的 97 篇期刊全文 |
| 采样框 | 曾被小鼠基因组信息学(MGI)用作至少一条 GO 或 MPO 注释证据的论文 |
| 时间跨度 | 文献发表于 2012 年以前,覆盖 1998-2012 区间 |
| 物种侧重 | 以实验室小鼠(Mus musculus)为主,兼有非洲爪蟾、大鼠、人类等模型与物种 |
| 学科分布 | 遗传学、分子生物学、细胞生物学、发育生物学、神经科学、免疫学等多学科 |
| 文档类型 | 研究论文全文,含摘要、引言、材料与方法、结果、讨论、参考文献 |
| 语言 | 英文 |
| 可获取性 | 全部为开放获取,许可允许再分发 |
| 标注者资质 | 经统一书面指南培训并定期校准的语义标注团队,使用 Knowtator 工具链 |
§2.5 临床与科研价值
对生物医学知识基础设施的价值。 数据库(GO 注释库、UniProt、MGI)的内容维护高度依赖人工策展,而策展速度远赶不上文献增长。CRAFT 提供的正是「把论文中的实体与本体类对应起来」这一核心技能的监督数据,是自动化策展辅助系统的训练基础,可用于构建快速定位证据句、自动建议本体类 ID 的工具。
对临床 NLP 的间接价值。 CRAFT 不直接处理病历,但其训练出的概念识别能力是临床文本处理的前置能力:识别临床笔记中的药物名、疾病名并归一化到标准术语体系,与识别论文中的化学物质、基因并归一化到 OBO 本体在方法论上同源。它是许可宽松的练手与预训练场,但模型迁移到临床必须经过领域适配。
对方法学研究的价值。 语料中系统化的干扰现象——不连续提及、跨类重叠、长距离共指、缩写与全称混用——提供了明确的失败模式清单。2019 年共享任务中「所有参赛系统在不连续标注上集体为零」即是典型体现:它把一个曾被忽视的问题定义为公开挑战。
§2.6 金标准描述
| 维度 | 说明 |
|---|---|
| 划分方式 | 官方两段式:67 篇训练/开发 + 30 篇测试。v3.1.3 及更早版本仅发布 67 篇,30 篇保留至 2019 共享任务评测期;v4.0.0 起整合发布全部 97 篇 |
| 划分依据 | 按文章划分,同一篇文章的全文与全部标注始终位于同一侧,不存在跨集合的 span 泄漏 |
| 标注层次 | 三层:语义(概念标注)/ 句法(句界、分词、词性、成分句法、依存句法)/ 共指(IDENTITY 链与应用同位语) |
| 标注方式 | 人工标注,非众包、非自动预标注后修订;语义标注依据单一一套书面指南 |
| 标注工具 | Knowtator(Protege 插件,v1.7.4 为标注时使用版本),可辅以 BRAT 在线浏览 |
| 一致性保障 | 标注者约每周开会校准;论文报告 IAA 以 F-score 衡量并达到稳定较高水平;共指标注 IAA 依指标不同介于 0.480(entity-based CEAF)至 0.858(Class-B3) |
| 标注者资质 | 由 CRAFT 团队专职语义标注负责人牵头,标注者经统一指南培训 |
| 扩展类设计 | extended 类由 CRAFT 语义标注负责人基于 OBO 正式类创建,用于跨本体类语义统一、难以区分类的合并、以及更贴合文本实际用法的对应类 |
| 性质 | 金标准(gold standard),非银标准、非自动生成、非众包标注 |
§3 数据集规格
§3.0 版本抉择矩阵
CRAFT 存在多个历史版本,且标注内容差异显著。选择版本时应以下游任务是否依赖官方测试集为第一判据。
| 你的需求 | 推荐版本 | 大小 | 理由 |
|---|---|---|---|
| 复现 CRAFT-ST 2019 共享任务结果,或需要官方固定测试集 | v3.1.3 | 与 v4 相近 | 共享任务官方指定版本,30 篇测试集的黄金标准与该版本绑定;用其他版本复现会得到不可比的数字 |
| 通用训练与评测 / 需要疾病(MONDO)标注 | v5.0.2(最新) | 约 175 MB ZIP | 集成 97 篇全量,含 v5.0.0 起引入的 MONDO 疾病本体标注,并修复了 CoNLL #end 标签缺陷;v4.x 及更早版本不含疾病标注 |
| 需要与既有文献(2021 年前多数工作)对比 | v4.0.1 | 约 175 MB ZIP | 该版本被大量后续研究采用(如 Devkota 等的 GRU 概念识别工作使用 v4.0.1),对比性最好 |
| 需要最纯净、不含扩展类的标注 | 任一版本的 proper 标注集 | 与主包相同 | proper 集仅含 OBO 正式类,可直接对齐上游本体版本;EXT 集包含 CRAFT 自建类,不可直接复用 |
| 仅需快速实验,不想处理 stand-off 偏移 | HuggingFace bigbio/craft |
视缓存而定 | 已封装为 NER / NED 任务格式,省去格式转换;代价是共指标注未被包含 |
| 选择建议:以 v5.0.2 的 proper 标注集作为主训练数据,同时保留 v3.1.3 的 30 篇测试集用于与已发表结果对比。若论文需要报告与 CRAFT-ST 2019 可比的数字,则必须整体切换到 v3.1.3。 |
§3.1 模态详情
| 模态维度 | 内容 | 格式 | 可机器读取性 |
|---|---|---|---|
| 正文文本 | 97 篇期刊全文的纯文本版本(由 PMC NXML 派生,标注偏移量以其为基准) | .txt(UTF-8) |
直接读取 |
| 正文源文件 | PMC 原生结构化 XML,仅作溯源用途 | .nxml |
需 XML 解析 |
| 概念标注 | 十个实体类型 × proper/extended 的 stand-off 标注 | Knowtator XML / .bionlp;兼容格式为 GENIA 风格嵌入 XML |
需与正文偏移量对齐;GENIA XML 不完整(多 span 标注被排除) |
| 句法标注 | Penn Treebank 风格成分句法树 | .tree / treebank |
需树解析器 |
| 依存标注 | CLEAR Parser 从 treebank 派生的依存树 | CoNLL-U / CoNLL-X | 直接读取 |
| 共指标注 | IDENTITY 链与应用同位语关系 | Knowtator XML / BRAT | 需专门解析 |
| 本体文件 | 标注所用本体的 OBO 文件(含 CRAFT 扩展类定义) | .obo |
需 OBO 解析 |
| 语义网络 | AO RDF 表示的文档与标注 | RDF/XML | 需 RDF 工具链 |
§3.2 按子集与本体统计的标注数量
下表汇总语料各部分的规模。训练集标注分布数据来自官方共享任务统计,仅列有可靠来源的项。
| 子集 / 本体 | 文档数 | Token 数 | 标注条数 | 唯一类 ID 数 |
|---|---|---|---|---|
| 训练集(67 篇) | 67 | 575,296 | 近 100,000(全部本体合计) | 未逐类报告 |
| 测试集(30 篇) | 30 | 239,409 | 未单独报告 | 未单独报告 |
| 全语料(97 篇) | 97 | 790,000+ | 140,000+ | 未逐类报告 |
| PR_EXT(训练集内最多) | 67 | — | 19,862 | 1,075 |
| MOP(训练集内最少) | 67 | — | 240 | 16 |
| GO_BP 不连续标注 | 67 | — | 493(不连续) | — |
| 共指标注(新增) | 97(v4 起) | — | 近 30,000 | — |
| 全语料不连续标注 | 97 | — | 1,264 | — |
| 解读要点:各本体之间的标注量差异达两个数量级(PR_EXT 的 19,862 条对 MOP 的 240 条)。这意味着在「全本体平均 F1」这类汇总指标上,PR 与 GO 类会主导整体得分;若研究关注稀有本体,必须报告 per-ontology 结果而非汇总数字。 |
§3.3 数据格式与文件扩展名
| 格式 | 扩展名 | 承载内容 | 优点 | 已知限制 |
|---|---|---|---|---|
| 纯文本 | .txt |
正文 | 一切偏移量的基准 | 无结构信息 |
| PMC XML | .nxml |
正文 + 出版元数据 | 保留出版结构 | 偏移量与标注不匹配,仅作溯源 |
| Knowtator XML | .xml |
概念 + 共指 | 工具链完整,可导入 Knowtator | 偏移按 Java 字符,非 Java 环境可能错位 |
| Unicode XML | .xml(xml/ 目录) |
概念 + 共指 | 偏移为 Unicode code point,跨语言安全 | 与 Knowtator 目录易混淆 |
| BioNLP stand-off | .bionlp |
概念 | 评测套件与多数神经网络工具直接支持 | 需自写 span 对齐逻辑 |
| GENIA 嵌入 XML | .xml |
概念 + POS | 兼容 GENIA 生态 | 表示能力不完整,多 span 标注被排除 |
| CoNLL-U / Penn Treebank | .conllu / .tree |
依存句法 / 成分句法 | 通用序列标注输入 / 语言学标准格式 | 只承载单一标签,无法表达重叠;成分树需树解析器 |
| UIMA XMI | .xmi |
概念 + 句法 + 共指 | 与 UIMA 生态集成 | 偏移按 Java 字符 |
| OBO | .obo |
本体定义 | 可直接载入 ontology 工具 | 版本与上游 OBO 可能不同步 |
| RDF/XML | .rdf |
标注的语义网表示 | 支持 SPARQL 查询 | 生态工具链较重 |
§3.4 存储大小与资源需求
| 项目 | 大小 | 说明 |
|---|---|---|
| v5.0.0 完整 ZIP | 175.0 MB | 含全部文本、标注与本体文件;Zenodo 归档记录为该数值 |
| 解压后估计占用 | 约 0.5-1 GB | 多格式重复存储同一标注导致体积膨胀(估计值,非官方发布数字) |
| 纯文本正文 | 数十 MB 量级 | 97 篇全文,790,000+ token |
| 内存需求(训练) | 单卡消费级 GPU 即可 | 语料规模小,BioBERT 级别模型可在 16 GB 显存内完成微调 |
| 磁盘建议预留 | 5 GB | 含原包、解压、缓存与实验输出 |
| CRAFT 在存储维度上属于轻量级语料,其挑战不在数据体量,而在标注格式的复杂度与多集合并存的解析成本。 |
§3.5 标注方式
| 标注维度 | 方式 | 说明 |
|---|---|---|
| 语义(概念)标注 | 纯人工,指南驱动 | 依据单一一套书面指南;标注者每周开会校准;覆盖「几乎所有本体概念的所有提及」 |
| 句法标注 | 纯人工 | 人工产出 Penn Treebank 风格成分句法树,含句界、分词与词性 |
| 依存句法 | 自动派生 | 由 CLEAR Parser 从人工 treebank 数据生成,官方明确指出未经人工校订 |
| 共指标注 | 人工,指南适配 | 改编 OntoNotes 指南,标注所有同指基础名词短语的 IDENTITY 链与应用同位语 |
| 扩展类生成 | 人工设计,语义标注负责人 | 基于 OBO 正式类创建,用于跨本体类统一与歧义消解 |
| 是否众包 | 否 | 由项目专职标注团队完成 |
| 是否自动预标注 | 否 | 全流程人工 |
| 实践含义:语义与共指层是可信的金标准,依存层应视为「高质量但未校订的派生数据」。依赖依存结构的研究应与人工 treebank 交叉核对,或在论文中声明使用的是自动派生结果。 |
§3.6 标注者资质与一致性
CRAFT 的标注者是一支持续参与项目、接受统一指南培训并定期校准的专职团队。关键做法与结果:统一指南——全部语义标注基于同一条书面指南,这是取得稳定较高标注者间一致性(IAA)的直接原因;定期校准——标注者约每周开会讨论边界分歧并更新指南,会议周期覆盖整个标注过程;IAA 度量——以 F-score 为一致性指标,分类别统计 CHEBI、GO_BP、GO_MF、GO_CC、CL、NCBITaxon、SO 等本体的 IAA,并在论文中以图表呈现其随校准会议次数收敛的趋势;共指一致性——IAA 依度量方式差异很大,从 0.480(entity-based CEAF)到 0.858(Class-B3)不等,说明共指任务的「一致性」高度依赖所选度量,报告单一数字可能误导;质量外部证据——部分系统基于 CRAFT 训练后能构建高性能模型,被视为语料质量高的额外证据,其意义独立于高 IAA 本身。
§3.7 采集周期
语料文章发表于 2012 年以前,跨度覆盖 1998-2012。标注工作自 2000 年代末持续至 2010 年代初:首版 67 篇概念标注随 2012 年论文发布;UBERON 解剖标注于 2017 年补充;共指标注于 2017 年完成;预留给共享任务的 30 篇于 2019 年 9 月整合进 v4.0.0;MONDO 疾病标注于 2022 年 2 月加入 v5.0.0。项目呈现「分阶段、长周期、持续修订」特征,而非一次性建库。
§3.8 地域与语种覆盖
| 维度 | 覆盖情况 |
|---|---|
| 出版地域 | 语料文章来自国际性英文生物医学期刊,非单一国家出版物 |
| 机构归属 | 文章作者机构分布广泛,以欧美研究机构为主(依 PMC 开放获取子集构成) |
| 语种 | 仅英文 |
| 多语言支持 | 无;标注指南与本体类标签均为英文 |
| 模型生物地理相关性 | 以实验室小鼠研究为主,兼有爪蟾、大鼠与人类相关文献 |
§3.9 工具链与设备规格
| 环节 | 工具 | 备注 |
|---|---|---|
| 标注平台 | Knowtator v1.7.4(Protege 插件) | 官方推荐浏览版本即为标注所用版本;需为 Protege 分配至少 2 GB 内存 |
| 在线浏览 | BRAT rapid annotation tool | 只读部署,无法正确渲染不连续标注 |
| 格式转换 | CRAFT 官方 file-conversion 套件(Clojure 实现) | 从原生格式转换为 BioNLP、CoNLL-U 等;仓库语言统计为 Clojure 100% |
| 构建工具 | build.boot | 官方仓库以 boot 构建任务驱动格式转换 |
| 依存分析生成 | CLEAR Parser | 输入为 CRAFT Treebank 数据,输出未经人工校订 |
| 评测套件 | ucdenverccp/craft-eval Docker 镜像 |
官方发布,支持 concept annotation 任务与自评测流程 |
| 运行环境要求 | Docker 容器无法写入加密文件系统 | 官方评测文档明确提示,需把输出目录挂载到非加密路径 |
§3.10 深度溯源链
原始文献(出版商 / PMC)
↓ PMC Open Access Subset 收录,许可允许再分发
↓ 选取采样框:MGI 曾用作 ≥1 条 GO 或 MPO 注释证据的论文
↓ 下载 PMC NXML 原生文档(仅作溯源)→ 派生纯文本 articles/txt/<PMID>.txt(UTF-8)
↓ 人工语义标注(Knowtator v1.7.4 + 统一指南,约每周校准)
↓ 人工句法标注(Penn Treebank 成分树)+ 人工共指标注(OntoNotes 适配版,v4 起并入)
↓ CLEAR Parser 自动派生依存句法树(未人工校订)
↓ 官方 file-conversion 套件导出多格式(BioNLP / CoNLL-U / GENIA XML / RDF / UIMA XMI)
↓ 按官方 67/30 划分打包(v3.1.3);v4.0.0 起整合 97 篇
↓ 以 CC BY 3.0 许可发布(GitHub Releases + Zenodo 归档 + SourceForge 历史版本)
溯源链的关键断点:从 NXML 到纯文本的派生步骤是标注偏移量的定义基准。下游使用者若从 NXML 出发解析文本,其偏移量将与标注文件不匹配——这是 CRAFT 使用中最常见的失败来源之一(详见 §6.5 坑点 1)。
§4 数据结构
§4.0 目录树
以下为 CRAFT v4/v5 发布包的目录结构预览。目录名与文件名组织方式依据官方仓库与发布说明整理;文件数量随版本略有差异。
CRAFT-v5.0.0/
├── articles/
│ ├── txt/ # 纯文本(一切偏移量的基准),97 个 <PMID>.txt
│ └── nxml/ # PMC 原生 XML,仅作溯源,偏移量不匹配
├── concept-annotation/ # 概念(语义)标注,按本体分目录
│ ├── CHEBI/
│ │ ├── CHEBI.bionlp # proper 标注集(仅 OBO 正式类)
│ │ └── CHEBI+extensions/ # extended 标注集(含 stub OBO 文件)
│ ├── CL/ ├── GO_BP/ ├── GO_CC/
│ ├── GO_MF/ # proper 类仅使用 5 个
│ ├── MOP/ # 分子过程本体(v3 起)
│ ├── MONDO/ # 疾病本体(v5 起,无扩展类版本)
│ ├── NCBITaxon/ ├── PR/ # PR 为标注量最大的本体
│ ├── SO/ └── UBERON/ # 解剖实体(v2.1 起)
├── coreference-annotation/ # 共指(IDENTITY 链 + 应用同位语),<PMID>.knowtator.xml
├── structural-annotation/
│ ├── dependency/ # CLEAR Parser 派生依存树:conllu/ 与 conllx/
│ ├── treebank/ # Penn Treebank 风格成分句法树
│ ├── pos/ └── sentence/ # 词性标注 / 句界与分词
├── schema/CCPTypeSystem.xml # UIMA 类型系统定义
├── build.boot # boot 构建脚本(驱动格式转换)
├── CHANGES.md ├── LICENSE.txt └── README.md
目录结构使用的三个要点:第一,articles/txt/ 是唯一正确的偏移量基准,articles/nxml/ 不可用于对齐;第二,每个本体目录下的 +extensions 子目录是独立标注集,评测时需按本体分别报告;第三,原生格式仅保留一种,其余格式需通过 build.boot 驱动的转换套件按需生成,官方已不再随包提供全部格式。
§4.1 DAIMS 字段字典
下表以概念标注记录(*.bionlp / Knowtator XML 的逻辑视图)为核心表给出八列字段字典。CRAFT 是标注语料而非关系型数据库,因此「字段」对应标注记录的逻辑属性与标注文件的目录组织维度。
| 字段名 | 类型 | 说明 | 示例值 | AI 用途 | 观测误差 | 信息性缺失编码 | 取值范围 |
|---|---|---|---|---|---|---|---|
annotation_id |
Text | 文档内唯一的 stand-off 标注标识符,类型槽位直接承载本体类 ID | T3 |
作为标注主键,用于跨格式比对与结果去重 | 无;由标注工具顺序分配 | 不存在缺失语义 | T + 正整数 |
class_id |
Text (Label) | 该提及归一化到的本体类标识符,PREFIX:NNNNNNN 命名空间形式 |
CL:0000604、GO:0030849 |
归一化(NEN)任务的目标标签 | 扩展类由 CRAFT 自建,与上游 OBO 版本可能不一致 | 未标注的 span 表示「不落于任何目标本体」,属闭世界设计而非数据缺失 | 八个本体前缀 + 数字 ID |
spans |
Text | 一个或多个字符偏移区间;多区间以分号分隔,构成不连续标注 | 30862 30865;30875 30889 |
边界检测(NER)的监督信号;多 span 需专门解码 | 偏移量对文本版本与编码极度敏感,错位即整条失效 | 单区间标注无分号,非缺失 | Unicode code point 偏移对 |
covered_text |
Text | 标注区间覆盖的原文子串,即表面形式 | rod ... photoreceptors |
作为 mention 表面形式输入模型 | 由偏移量机械派生,无独立误差;偏移错则文本错 | 不适用 | 任意英文子串 |
ontology |
Text | 所属本体或实体类型,决定标注集归属 | CHEBI、GO_BP、PR_EXT |
多任务学习的任务划分依据 | 同一文本可同时被多个本体的标注覆盖,非互斥 | 不适用 | 10 类实体 × proper/EXT(MONDO 无 EXT) |
annotation_set |
Text (Label) | proper(仅正式类)或 extended(含 CRAFT 扩展类) | proper、extended |
决定标签空间大小与本体可复用性 | 扩展类不可直接映射回上游本体 | 不适用 | proper / extended |
document_id |
Text | 文档标识,即 PMID,同时是文件名主干 | 11532192 |
划分与交叉验证的分组键 | 无 | 不适用 | PMC 数字 ID,共 97 个 |
is_discontinuous |
Boolean | 该标注是否由两个及以上不相连区间组成 | true |
用于筛选困难样本与评估架构对多 span 的支持 | 部分格式(GENIA XML、BRAT、序列标注)无法表达,会静默丢弃 | 单区间记录为 false |
true / false |
§4.2 标签分布结构
CRAFT 的标签分布呈现三层结构,理解这三层是设计损失函数与采样策略的基础。
第一层:本体间极不均衡。 训练集内 PR_EXT 标注量最多(19,862 条,1,075 个唯一类 ID),MOP 最少(240 条,16 个唯一类 ID),两者相差约 83 倍。GO 三个子本体合计构成语料中最大的标注群体,这与「CRAFT 是 MGI 证据文献语料」的采样设计直接相关——小鼠遗传学论文天然密集讨论基因功能。
第二层:本体内长尾严重。 以 PR 为例,19,862 条标注只对应 1,075 个唯一类 ID,但实际分布高度倾斜:少数基因名(Grid2ip、TPP1、Suox、Ntf3、Ces1e 等)反复出现,大量类只出现一两次。模型在 PR 上的表现因此主要由高频类驱动,低频类召回率通常很低。
第三层:本体规模与标注量反向。 本体可用类数差异极大,从 GO_MF 的 5 个 proper 类到 NCBITaxon EXT 的 1,167,358 个类。类空间越大、文本表述越多样,任务越难——这正是 PR 成为全语料最难本体的原因之一。
§4.3 关键统计量汇总
| 统计量 | 数值 | 来源 |
|---|---|---|
| 文档总数 | 97 | Bada et al. 2012 |
| 训练文档 | 67 | CRAFT-ST 2019 |
| 测试文档 | 30 | CRAFT-ST 2019 |
| 全语料 token | 790,000+ | Bada et al. 2012 |
| 训练集 token | 575,296 | 共享任务统计 |
| 测试集 token | 239,409 | 共享任务统计 |
| 全语料概念标注 | 140,000+ | Bada et al. 2012 |
| 训练集概念标注 | 近 100,000 | Bada et al. 2012 |
| 概念标注集数量 | 20(10 类实体 × 2 版本) | Furrer et al. 2021 |
| 覆盖本体数 | 8(proper 概念链接的本体) | Furrer et al. 2021 |
| 不连续标注 | 1,264 条(占 1.46%) | 共享任务统计 |
| 同类部分重叠标注 | 788 条 | 共享任务统计 |
| 跨类重叠标注 | 3,362 条 | 共享任务统计 |
| 共指标注新增 | 近 30,000 条 | Cohen et al. 2017 |
| 共指链传播可增实体 | 106,263 个(+76%) | Cohen et al. 2017 |
| 人工句法分析句数(公开部分) | 20,000+ | Verspoor et al. 2012 |
| 本体规模极值 | GO_MF 5 类 ↔ NCBITaxon EXT 1,167,358 类 | 共享任务统计 |
§4.4 数据层级
CRAFT 的数据组织为四层嵌套结构,划分应始终在最外层进行。
语料库(Corpus)
└── 文档(Document,键 = PMID,共 97 篇)
└── 句子(Sentence,人工句界,CoNLL-U 中以空行分隔)
└── 词元(Token,含词性与依存关系)
└── 标注提及(Mention,stand-off 记录,可跨句甚至跨段)
├── 单连续 span:单区间偏移
├── 不连续 span:多区间偏移,如 "region on the .. chromosome"
└── 重叠:与同类或他类 span 部分共享 token
三条推论:① 划分单位是文档,不是句子或 mention——同一文档内的句子共享指代链与话题,跨集合拆分会造成严重泄漏,官方划分严格按文档执行。② mention 可以跨句,不连续标注的多个区间可能跨越句界,任何基于句内切分的预处理都可能切断标注。③ 层级间是多对多关系,一个 token 可被多个 mention 覆盖,一个 mention 可跨多个 token,不能把标注简化为「每 token 一标签」而不丢失信息。
§4.5 缺失值与信息性编码
CRAFT 作为人工标注语料,其「缺失」绝大多数是信息性的,而非数据质量问题。误将信息性缺失当作缺失值处理,是本语料最危险的预处理错误。
| 现象 | 是否缺失值 | 编码语义 | 正确处理 | 错误处理及其后果 |
|---|---|---|---|---|
| 某 span 未被任何本体标注 | 否,信息性 | 该表述不落于八个目标本体中任何一类,属闭世界设计;不代表「无生物意义」 | 在 NER 中作为负样本(O 标签)使用,但不可表述为「该概念不存在」 | 解读为「语料未标注即无实体」,会把本体覆盖边界误报为模型缺陷 |
| proper 集中缺失某表述 | 否,信息性 | 该表述仅在本体扩展类中有对应类 | 切换到 EXT 标注集获取答案 | 在 proper 集上强求召回,会人为压低上限 |
| MONDO 无扩展类版本 | 否,设计如此 | MONDO 只有 WITH/WITHOUT_GENOTYPE_ANNOTATIONS 两种可选 |
依任务选择带或不带基因型标注的版本 | 按其他本体的 _EXT 规则构造目录名会导致评测失败 |
| GENIA XML 中缺失部分标注 | 是,格式损失 | 多 span 标注无法在该格式中表达,被记录于 .excluded_annotations |
改用 BioNLP stand-off 或 Knowtator XML | 用 GENIA XML 统计数据量会低估真实标注数 |
| BRAT 中不连续标注显示为整段高亮 | 是,渲染损失 | BRAT 以最短覆盖 span 显示,鼠标悬停才显示真实区间 | 仅将 BRAT 用作浏览工具,不作数据源 | 从 BRAT 界面抄录 span 会得到错误边界 |
| 依赖树未经人工校订 | 否,质量标注 | 官方明确说明该层为自动派生结果 | 在论文中标注「自动派生」,关键实验与人工 treebank 交叉核对 | 将依存层当作金标准会造成对结果可靠性的高估 |
| 未单独报告测试集逐本体标注数 | 是,未公开 | 官方共享任务文档未给出 30 篇测试集的逐本体计数 | 以官方评测脚本输出的分母为准 | 自行估算并对外发布会造成数字不一致 |
| 实践建议:在数据卡中显式区分「本体覆盖边界」(信息性)与「格式表示损失」(技术性),两者对下游指标的影响方向完全相反——前者是任务定义的组成部分,后者是应当避免的数据损耗。 |
§5 数据划分与使用建议
§5.1 官方划分
CRAFT 提供的是生物医学 NLP 领域少见的、真正意义上的官方划分:
| 集合 | 文档数 | Token 数 | 来源与说明 |
|---|---|---|---|
| 训练 / 开发集 | 67 | 575,296 | 自 v0.9/v1.0 起公开发布,构成首版语料 |
| 测试集 | 30 | 239,409 | 保留至 2019 年 CRAFT 共享任务评测期后整合发布(v4.0.0) |
| 合计 | 97 | 790,000+ | 全语料 |
| 划分按文档整体进行,无跨集合的句子或 mention 拆分。重要限制:2019 年共享任务实际使用的版本是 v3.1.3,其概念标注与 v4/v5 存在差异(v3 引入了扩展类,v4 主要为文档整合与少量修正,v5 加入 MONDO)。因此在 v5 上运行的结果与共享任务排行榜数字不可直接比较。 |
§5.2 社区惯例划分
在官方测试集释放之前(v4.0.0 之前),社区实践高度分散,这会直接影响结果可比性:
| 惯例做法 | 出现场景 | 问题 |
|---|---|---|
| 自行随机划分训练 / 测试 | 早期概念识别研究 | 划分随机种子不同,结果不可复现、不可横向比较 |
| 在全语料(67 篇)上评测 | 部分工具评测工作 | 训练集即测试集,指标严重乐观 |
| 按本体各取子集调优 | 单本体研究(如仅 GO) | 不同研究的本体选择不同,无法合并比较 |
| 使用 v1/v2 概念标注 | 2019 年前多数工作 | 与 v3 起的概念标注存在重大差异,官方明确提示不宜直接比较 |
| 使用旧测试集 | 早期工作 | 测试对象与 v4 官方测试集不同 |
采用 HuggingFace bigbio/craft 封装划分 |
2022 年后快速实验 | 共指标注未包含;划分细节需核对是否与官方一致 |
| 建议:无论采用何种划分,在论文中必须明确版本号、标注集(proper / EXT)、本体范围、划分脚本与随机种子,并标注「不可与 CRAFT-ST 2019 数字直接比较」这一说明。 |
§5.3 划分策略建议与泄漏风险
本语料特有的泄漏风险主要有四类,其中前两类是 CRAFT 独有的高发问题。
风险一:文档级泄漏(最主要风险)。 CRAFT 的 97 篇文档中,部分文章来自同一研究组、同一课题或存在引用关系,讨论同一批基因与蛋白质。若按句子或段落随机划分,同一基因名、同一实验背景会同时出现在训练与测试侧,模型可能靠记忆基因名与本体类的对应关系而非学习上下文语义来「作弊」。规避方法:① 严格以 PMID 为分组键划分,任何情况下不得跨文档拆分;② 交叉验证使用 GroupKFold 并设 groups=pmid;③ 对高风险本体(PR、NCBITaxon)额外检查训练/测试侧的高频基因名重叠比例。
风险二:跨本体标签泄漏。 同一文本 span 常被多个本体同时标注(语料含 3,362 条跨类重叠标注,最常见的组合是 CL+UBERON 571 条、GO_BP+UBERON 500 条、CL+GO_BP 349 条)。若研究者把「多个本体的标注合并为一个大标签空间」训练单一模型,而划分时按本体分别划分,就会出现同一 span 在训练侧与测试侧分属不同本体的情形。
规避方法:若做多本体联合建模,必须按文档划分而非按标注集划分,确保一篇文档的所有本体标注都在同一侧。
风险三:扩展类泄漏。 extended 类由 CRAFT 团队基于 OBO 正式类创建,部分扩展类是「跨本体合并类」(如 CL+GO 融合的 cell)。当同时使用 proper 与 EXT 标注集时,一个 mention 可能同时出现在两套标签体系中,形成标签层面的重复。
规避方法:同一次实验只使用一套(proper 或 EXT),不要混合;若需对比,必须用同一划分做两组独立实验。
风险四:共指标注与语义标注的信息耦合。 共指链可以把同一实体的不同表述连接起来。若只在语义层做划分,而共指链跨越了训练/测试边界,就可能间接传递标签信息。
规避方法:共指任务与语义任务分别按文档划分;若两个任务联合建模,检查指代链是否存在跨集合成员。
推荐划分脚本逻辑(要点,非完整代码):
from sklearn.model_selection import GroupKFold
# 以文档为最小不可分单位:groups 必须是 PMID
# 这样可确保同一篇文档的所有标注(含全部本体与共指链)落在同一侧
folds = list(GroupKFold(n_splits=5).split(doc_ids, groups=doc_ids))
# 若必须复现官方划分,则直接读取官方 67/30 的文档清单,不要自行随机
# 官方划分的 30 篇测试文档清单绑定在 v3.1.3 与 CRAFT-ST 2019 赛道数据中
§5.4 交叉验证建议
| 场景 | 建议方案 | 理由 |
|---|---|---|
| 单本体概念识别(如 GO_BP) | 5 折 GroupKFold,groups = PMID | 语料仅 97 篇,单折测试集过小,方差大 |
| 全本体 20 个标注集 | 先按文档 5 折;每折内对 20 个集分别训练评测 | 保持划分一致,使 per-ontology 结果可横向对比 |
| 与共享任务对比 | 不使用交叉验证,直接使用官方 67/30 划分 | 只有固定划分才能与排行榜数字比较 |
| 超参搜索 | 从训练集内再切出 10 篇作为开发集(不碰测试集) | 官方未单独提供开发集,需自行切分,且切分也须按文档 |
| 低资源本体(MOP、GO_MF) | 报告置信区间或多随机种子重复 | 标注量仅数百条,单次结果波动大 |
§5.5 外部验证建议
CRAFT 本身的「外部验证」应理解为跨语料、跨本体版本的迁移检验。建议方向:
- 跨语料迁移:在 CRAFT 上训练概念识别模型,直接零样本评测到其他生物医学语料(如以摘要为主的 BC5CDR、GENIA 系列),量化全文到摘要的迁移损失。
- 跨本体版本迁移:在 v3.1.3 的扩展类体系上训练,评测到 v5 的 MONDO 或更新版 OBO 类空间,考察标注体系演进带来的性能衰减。
- 跨物种迁移:CRAFT 以小鼠文献为主,可将模型应用于人类遗传学文献,检验物种相关术语分布差异带来的影响。
- 与人工策展对照:把模型预测结果与 MGI 等数据库的人工策展记录比对,评估其在真实策展工作流中的可用性。
- 工具链互验:用 CRAFT 的句法层评测第三方分词与依存分析工具,并将结果与各工具在原论文报告的指标对照,量化「已发表结果」与「在新语料上的实际表现」之间的差距——这正是 CRAFT 最初被设计出来要回答的问题。
§6 AI 就绪指南
§6.0 云端快速启动
在本地环境就绪前,可用官方 Docker 评测镜像完成一次「零配置」有效性验证。以下命令假设你已经下载并解压了语料包。
# 步骤 1:获取语料(约 175 MB,纯开放下载,无需注册)
wget https://github.com/UCDenver-ccp/CRAFT/archive/refs/tags/v5.0.0.zip
unzip v5.0.0.zip -d /data/craft && export CRAFT_ROOT=/data/craft/CRAFT-5.0.0
# 步骤 2:确认关键目录存在(以下两行是后续一切工作的前提)
ls $CRAFT_ROOT/articles/txt | head -3 # 应输出形如 11532192.txt 的文件名
ls $CRAFT_ROOT/concept-annotation/ | head # 应输出 CHEBI CL GO_BP GO_CC GO_MF MOP ...
# 步骤 3:用官方评测镜像做自评测(金标准评金标准,F-score 应为 1.0)
mkdir -p /tmp/craft-out/go_bp
cp $CRAFT_ROOT/concept-annotation/GO_BP/*.bionlp /tmp/craft-out/go_bp/
docker run --rm -v /tmp/craft-out:/files-to-evaluate -v $CRAFT_ROOT:/corpus-distribution \
ucdenverccp/craft-eval:latest sh -c '(cd /home/craft/evaluation && boot javac eval-concept-annotations \
-c /corpus-distribution -i /files-to-evaluate -g /files-to-evaluate)'
# 注意:容器无法写入加密文件系统,挂载目录必须位于非加密路径
§6.1 快速上手
目录结构预期与最小可用子集。 下面的脚本只用 articles/txt/ 与某一个本体目录即可跑通,最小可用子集 = 1 篇文档 + 1 个本体的标注(例如 articles/txt/11532192.txt 配合 concept-annotation/GO_BP/)。
# 最小可用示例:把 CRAFT 的 stand-off 标注转成 span 列表
# $CRAFT_ROOT/articles/txt/<PMID>.txt ← 正文(偏移量基准)
# $CRAFT_ROOT/concept-annotation/<ONT>/<ONT>.bionlp ← BioNLP stand-off 标注
import os
import re
from pathlib import Path
data_root = Path(os.environ.get("CRAFT_ROOT", "/data/craft/CRAFT-5.0.0"))
BIONLP_ANN = re.compile(r"^(T\d+)\t([^\t]+)\t(.+?)\t(.*)$")
def load_text(pmid: str) -> str:
"""读取纯文本正文。必须使用 UTF-8,否则偏移量会整体错位。"""
return (data_root / "articles" / "txt" / f"{pmid}.txt").read_text(encoding="utf-8")
def parse_bionlp(path: Path):
"""
解析 BioNLP stand-off 概念标注。
关键格式约定:概念 ID 直接写在标注类型槽位,不使用 Normalization(N) 行。
偏移量格式:单 span 为 'start end';多 span 为 's1 e1;s2 e2'(不连续标注)。
"""
records = []
for line in path.read_text(encoding="utf-8").splitlines():
m = BIONLP_ANN.match(line)
if not m:
continue
ann_id, cls, offsets, text = m.groups()
spans = [(int(p[0]), int(p[1])) for p in
(c.split() for c in offsets.strip().split(";")) if len(p) == 2]
records.append((ann_id, cls, spans, text))
return records
if __name__ == "__main__":
pmid = "11532192"
text = load_text(pmid)
anns = parse_bionlp(data_root / "concept-annotation" / "GO_BP" / "GO_BP.bionlp")
print(f"文档 {pmid} 共 {len(text)} 字符,GO_BP 标注 {len(anns)} 条")
for ann_id, cls, spans, covered in anns[:3]:
# 交叉验证:偏移量切出的子串应与 covered_text 一致
sliced = " ... ".join(text[s:e] for s, e in spans)
print(f" {ann_id} {cls} {spans} -> {sliced!r} "
f"[{'OK' if sliced == covered else 'MISMATCH'}]")
首次运行最重要的检查是最后输出的 [OK]/[MISMATCH] 标记。如果出现 MISMATCH,问题几乎必然出在编码或文本版本上,请立即参照 §6.5 坑点 1 与坑点 2 排查,不要继续往下走。
§6.2 数据获取
| 获取途径 | 地址 | 大小 | 备注 |
|---|---|---|---|
| GitHub Release(推荐) | https://github.com/UCDenver-ccp/CRAFT/archive/refs/tags/v5.0.0.zip | 175.0 MB | 最新稳定版 v5.0.2 亦可在 Releases 页下载 |
| GitHub 仓库主页 | https://github.com/UCDenver-ccp/CRAFT | — | 支持 git clone,含完整提交历史 |
| Zenodo 归档 | https://zenodo.org/records/6114204 | 175.0 MB | v5.0.0 长期归档,含 MD5 校验值 |
| SourceForge 历史版本 | https://sourceforge.net/projects/bionlp-corpora/files/CRAFT/ | 视版本 | 保存 v0.9、v2.0 等早期版本,用于复现老论文 |
| HuggingFace 封装 | https://huggingface.co/datasets/bigbio/craft | 视缓存 | 已转为 NER / NED 任务格式,不含共指标注 |
| 官方文档主页 | https://sourceforge.net/projects/bionlp-corpora/ | — | 项目门户,含其他 BioNLP 语料 |
| 申请流程:无。 CRAFT 以 CC BY 3.0 许可发布,无需注册、无需签署数据使用协议、无需伦理审批,下载即用。这是它在同类生物医学语料中相对罕见的优势——多数临床语料(如 MIMIC 系列)需要凭证化申请与培训证明。 | |||
| 下载后校验: |
unzip -t v5.0.0.zip # 1) 校验 ZIP 完整性
md5sum CRAFT-v5.0.0.zip # 2) 比对 Zenodo 公布的 MD5
ls $CRAFT_ROOT/articles/txt/*.txt | wc -l # 3) 确认文档数为 97
file -i $CRAFT_ROOT/articles/txt/11532192.txt # 4) 确认编码为 UTF-8
§6.3 预处理全流程
CRAFT 的预处理核心任务不是「清洗」,而是「把 stand-off 标注正确地对齐回文本,并转成模型可用的序列标注格式」。
# 四个阶段:对齐校验 → 读官方分词 → 处理重叠/不连续 → 按本体导出
import os
from pathlib import Path
from typing import List, Tuple
data_root = Path(os.environ.get("CRAFT_ROOT", "/data/craft/CRAFT-5.0.0"))
def load_and_verify(pmid: str, ont: str):
"""阶段 1:加载文本与标注,并做严格对齐校验。"""
text = (data_root / "articles" / "txt" / f"{pmid}.txt").read_text(encoding="utf-8")
anns = []
for line in (data_root / "concept-annotation" / ont / f"{ont}.bionlp").read_text(
encoding="utf-8").splitlines():
parts = line.split("\t")
if len(parts) != 4 or not parts[0].startswith("T"):
continue
ann_id, cls, offsets, covered = parts
spans = [tuple(map(int, c.split())) for c in offsets.strip().split(";")
if len(c.split()) == 2]
# 切出的子串必须与 covered_text 完全一致,否则文本版本或编码有问题
actual = " ... ".join(text[s:e] for s, e in spans)
if actual != covered:
raise ValueError(f"偏移量校验失败 {pmid} {ann_id}: {actual!r} != {covered!r}")
anns.append({"id": ann_id, "cls": cls, "spans": spans, "text": covered})
return text, anns
def load_conllu_tokens(pmid: str) -> List[Tuple[str, int, int]]:
"""阶段 2:读官方 CoNLL-U 分词,返回 [(token, char_start, char_end), ...]。"""
path = data_root / "structural-annotation" / "dependency" / "conllu" / f"{pmid}.conllu"
if not path.exists():
return []
text = (data_root / "articles" / "txt" / f"{pmid}.txt").read_text(encoding="utf-8")
tokens, cursor = [], 0
for line in path.read_text(encoding="utf-8").splitlines():
cols = line.split("\t")
if len(cols) < 3 or not cols[0].isdigit():
continue
tok = cols[1]
idx = text.find(tok, cursor) # 用 find 回退,避免空格假设失效
if idx >= 0:
tokens.append((tok, idx, idx + len(tok)))
cursor = idx + len(tok)
return tokens
def build_labels(tokens, anns, scheme="IOB2"):
"""
阶段 3:生成 BIO 标签。信息损失必须显式统计:
同类重叠保留较长 span;跨类重叠需多任务;不连续 span 按首个区间近似。
"""
labels = ["O"] * len(tokens)
n_dropped = 0
for ann in sorted(anns, key=lambda a: -sum(e - s for s, e in a["spans"])):
tspan = []
for cs, ce in ann["spans"]:
idx = [i for i, (_, ts, te) in enumerate(tokens) if ts < ce and te > cs]
if idx:
tspan.append((idx[0], idx[-1]))
if not tspan:
continue
if len(tspan) > 1: # 不连续标注:BIO 无法表达
n_dropped += 1
tspan = tspan[:1]
s, e = tspan[0]
if any(labels[i] != "O" for i in range(s, e + 1)):
continue
if scheme == "IOB2":
labels[s] = f"B-{ann['cls']}"
for i in range(s + 1, e + 1):
labels[i] = f"I-{ann['cls']}"
return labels, n_dropped
def export(pmid: str, ont: str, out_path: Path):
"""阶段 4:按本体分别导出,避免标签空间膨胀。"""
text, anns = load_and_verify(pmid, ont)
tokens = load_conllu_tokens(pmid)
if not tokens:
return 0, 0
labels, dropped = build_labels(tokens, anns)
with out_path.open("w", encoding="utf-8") as f:
for (tok, _, _), lab in zip(tokens, labels):
f.write(f"{tok}\t{lab}\n")
return sum(1 for l in labels if l != "O"), dropped
阶段要点说明:
- 阶段 1 的严格校验不可省略。 一旦某条标注的
covered_text与偏移量切片不符,说明文本版本或编码有问题,继续预处理只会产出静默错误的训练数据。 - 阶段 2 优先使用官方 CoNLL-U 的分词结果,而不是用 spaCy 或正则重新分词。官方分词已与标注对齐,重新分词会引入边界错位。
- 阶段 3 是信息损失的主要来源。 BIO 序列标注无法表达重叠与不连续,必须明确记录损失条数并在论文中报告。
- 阶段 4 建议按本体分别导出,不同本体的标签空间相互独立,混在一个标签文件里会造成标签空间膨胀。
§6.4 PyTorch DataLoader 完整实现
以下是一个可直接运行的 Dataset 实现,读取 CRAFT 并产出 token 级分类样本。
# 目录结构预期与解析函数见 §6.1 / §6.3;此处只给出 Dataset 主体
from typing import List, Dict
import torch
from torch.utils.data import Dataset, DataLoader
from transformers import AutoTokenizer
class CRAFTDataset(Dataset):
"""CRAFT 概念识别数据集(token 级 BIO 标注),按文档滑窗切块。"""
def __init__(self, pmids: List[str], ontology: str = "GO_BP",
tokenizer_name: str = "dmis-lab/biobert-base-cased-v1.1",
max_length: int = 512, stride: int = 128,
label_map: Dict[str, int] = None):
self.ontology = ontology
self.tokenizer = AutoTokenizer.from_pretrained(tokenizer_name)
self.max_length, self.stride = max_length, stride
self.chunks = [] # (pmid, chunk, char_offset, local_anns)
for pmid in pmids:
text, anns = read_bionlp(pmid, ontology)
win, step = max_length * 4, max(1, max_length * 4 - stride * 4)
for start in range(0, max(len(text), 1), step):
chunk = text[start:start + win]
if not chunk.strip():
continue
local = [dict(a, spans=[(s - start, e - start) for s, e in a["spans"]
if start <= s < start + len(chunk)])
for a in anns
if any(start <= s < start + len(chunk) for s, _ in a["spans"])]
self.chunks.append((pmid, chunk, start, local))
if label_map is None:
self.label_map = {"O": 0}
for c in sorted({a["cls"] for _, _, _, la in self.chunks for a in la}):
self.label_map[f"B-{c}"] = len(self.label_map)
self.label_map[f"I-{c}"] = len(self.label_map)
else:
self.label_map = label_map
self.id2label = {v: k for k, v in self.label_map.items()}
def __len__(self):
return len(self.chunks)
def __getitem__(self, idx):
pmid, chunk, _, anns = self.chunks[idx]
enc = self.tokenizer(chunk, return_offsets_mapping=True,
truncation=True, max_length=self.max_length,
padding="max_length", return_tensors="pt")
offsets = enc["offset_mapping"][0].tolist()
labels = [0] * len(offsets)
# 字符级标注投射到 token 级;长 span 优先,避免覆盖冲突
for ann in sorted(anns, key=lambda a: -sum(e - s for s, e in a["spans"])):
if not ann["spans"]:
continue
s, e = ann["spans"][0] # 不连续标注取首个 span
hit = [i for i, (ts, te) in enumerate(offsets)
if te > ts and ts < e and te > s]
if not hit or any(labels[i] != 0 for i in hit):
continue
labels[hit[0]] = self.label_map[f"B-{ann['cls']}"]
for i in hit[1:]:
labels[i] = self.label_map[f"I-{ann['cls']}"]
return {"input_ids": enc["input_ids"][0],
"attention_mask": enc["attention_mask"][0],
"labels": torch.tensor(labels, dtype=torch.long),
"pmid": pmid}
def build_loaders(train_pmids, test_pmids, ontology="GO_BP", batch_size=8, num_workers=2):
"""测试集复用训练集标签空间,避免标签维度不一致。"""
tok = "dmis-lab/biobert-base-cased-v1.1"
train_ds = CRAFTDataset(train_pmids, ontology, tok)
test_ds = CRAFTDataset(test_pmids, ontology, tok, label_map=train_ds.label_map)
mk = lambda ds, sh: DataLoader(ds, batch_size=batch_size, shuffle=sh,
num_workers=num_workers, pin_memory=True)
return mk(train_ds, True), mk(test_ds, False), train_ds.label_map
§6.5 八大坑点
⚠️ 坑点 1:用 PMC XML(NXML)而不是纯文本对齐标注偏移(分类:预处理陷阱)
问题:CRAFT 的全部字符偏移量都相对于
articles/txt/<PMID>.txt定义。若直接从articles/nxml/解析正文再切偏移,得到的文本长度与内容都不同,所有标注会整体错位。
症状:text[start:end]切出的子串与标注的covered_text字段不一致;错位程度随文档推进逐渐累积;部分标注甚至越界报IndexError。模型正常训练但指标长期停在随机水平。
解决:
- 简单方法:永远从
articles/txt/读取正文,把articles/nxml/当作只读溯源资料。- 进阶方法:在预处理入口加入强制校验,任何一条标注的切片与
covered_text不符即抛异常(见 §6.3 阶段 1 代码),把错位阻断在数据加载阶段。- SOTA 方法:构建「偏移量指纹」——对每篇文档计算 (token 数, 字符数, 首末标注切片哈希) 三元组并固化到数据卡中,任何一次数据升级都跑指纹比对,确保偏移量语义未变。
参考:Bada et al. 2012, BMC Bioinformatics 13:161
⚠️ 坑点 2:Java 字符偏移与 Unicode code point 偏移混用(分类:工程陷阱)问题:Knowtator XML 与 UIMA XMI 两种格式的偏移量是按 Java 字符(UTF-16 code unit)计算的。当文本包含 BMP 之外的补充平面字符时,Java 会用代理对占用两个 char,导致偏移量与按 Unicode code point 计算的 Python 字符串索引不一致。
症状:同一篇文章在knowtator-xml/与xml/两个目录下的偏移量数值不同;用 Python 处理 Knowtator XML 时,部分文档后段标注全部错位,而前段正常。错误呈现「文档特定」而非「全局」的特征,极难定位。
解决:
- 简单方法:在非 Java 环境中统一使用
xml/目录下的 stand-off 文件,官方明确说明该目录的偏移量基于 Unicode code point。- 进阶方法:若必须处理 Knowtator XML,先检测文本是否含补充平面字符:
def has_supplementary(s: str) -> bool: """检测字符串是否含 BMP 之外的字符(Java 中占 2 个 char)。""" return any(ord(ch) > 0xFFFF for ch in s) text = open("articles/txt/11532192.txt", encoding="utf-8").read() if has_supplementary(text): print("该文档含补充平面字符,Java 与 Unicode 偏移量将不一致") # 处理策略:只使用 xml/ 目录,或自行实现 UTF-16 code unit 到 code point 的换算
- SOTA 方法:以 BioNLP stand-off 格式作为唯一内部表示,只在导出阶段按需转换;在 CI 中对每篇文档跑「两种偏移体系互转一致性」断言测试。
参考:CRAFT v2.0 发布说明「Annotation Offsets and Java」
⚠️ 坑点 3:在 GENIA XML 或序列标注格式上统计标注数导致严重低估(分类:标签理解)问题:GENIA 风格的嵌入式 XML 无法表示多 span 标注。CRAFT 官方在导出该格式时直接排除了所有不连续标注,并把被排除的记录写入
.excluded_annotations文件。研究者若用 GENIA XML 作为数据源统计语料规模,会得到远低于官方公布的数字。
症状:统计出的 GO_BP 标注数比论文报告值少数百条;.excluded_annotations文件被忽略;论文中被审稿人指出标注数与其他文献不一致。
解决:
- 简单方法:统计标注数时使用 Knowtator XML 或 BioNLP stand-off,绝不用 GENIA XML;若必须使用,把
.excluded_annotations中的条数加回。- 进阶方法:在数据加载时显式记录被丢弃的不连续标注数,并在实验结果表中报告:
# 正确做法:显式统计信息损失 total = len(all_annotations) discontinuous = [a for a in all_annotations if len(a["spans"]) > 1] print(f"总标注 {total},不连续 {len(discontinuous)} " f"({len(discontinuous)/total:.2%}),BIO 格式将丢弃这些") # 官方统计:不连续标注占全部标注的 1.46%
- SOTA 方法:改用 span-based 或 span-set 预测架构(不做 BIO 展平),从架构层面保留不连续与重叠标注,使信息损失为零。
参考:Bada et al. 2012 关于 GPML 格式限制的说明
⚠️ 坑点 4:把不连续标注当作连续 span 处理(分类:标签理解)问题:语料含 1,264 条不连续标注(占 1.46%),例如「region on the … chromosome」中真实提及是两个分离区间。若简单取最短覆盖 span 或首个 span,会同时引入假正例(把中间不相关的词纳入实体)与假负例(丢失其余区间)。
症状:模型输出的实体边界包含大量中间修饰语;在 GO_BP 上尤为明显(493 条不连续标注,居全语料之首);边界匹配的 F1 出现无法解释的上限。
解决:
- 简单方法:在训练与评测中统一排除不连续标注,并在论文中明确声明排除比例,与官方「参赛系统均未识别不连续 span」的结果保持可比。
- 进阶方法:采用允许「一个实体多个 span」的比对方式,评测改用 span 集合相似度而非简单边界匹配:
def span_set_f1(pred_sets, gold_sets, threshold=0.5): """按 span 集合的 Jaccard 相似度判定命中,支持不连续标注。""" tp = sum(1 for p, g in zip(pred_sets, gold_sets) if len(p & g) / max(len(p | g), 1) >= threshold) precision = tp / max(len(pred_sets), 1) recall = tp / max(len(gold_sets), 1) return 2 * precision * recall / max(precision + recall, 1e-9)
- SOTA 方法:使用基于 token-pair 或 span-enumeration 的解码架构(把 NER 建模为 span 分类或序列到集合生成),直接输出 span 集合,从根本上支持不连续与重叠。
参考:CRAFT-ST 2019 概览:所有提交系统均未识别不连续标注
⚠️ 坑点 5:跨本体重叠标注被当作标签冲突清洗掉(分类:标签理解)问题:语料含 3,362 条跨类重叠标注,最常见组合为 CL+UBERON(571 条)、GO_BP+UBERON(500 条)、CL+GO_BP(349 条)。典型例子是「Mcm4/6/7」被跨类标注 107 次。若把所有本体的标注合并到单一标签空间并做「一 token 一标签」清洗,这些重叠会被当作噪声删除或随机保留其一。
症状:合并标签空间后总标注数明显少于「20 个标注集之和」;模型在 UBERON 与 CL 上表现异常;复现他人多本体联合结果时数字对不上。
解决:
- 简单方法:不合并标签空间,按本体分别训练与评测 20 个独立任务(这也是官方共享任务的做法,每个标注集视为一个独立数据集)。
- 进阶方法:多任务学习,共享编码器、每本体一个分类头,让跨类重叠成为自监督信号而非冲突:
import torch.nn as nn class MultiOntologyHead(nn.Module): """共享编码器 + 每本体一个分类头;避免把重叠标注当作标签冲突。""" def __init__(self, hidden_size, num_labels_per_onto: dict): super().__init__() self.heads = nn.ModuleDict({ ont: nn.Linear(hidden_size, n) for ont, n in num_labels_per_onto.items() }) def forward(self, hidden_states, ontology: str): return self.heads[ontology](hidden_states)
- SOTA 方法:显式建模本体间关系(如 CL 与 UBERON 的包含关系、CL 与 GO_BP 的参与关系),把跨类重叠当作结构化监督,用图神经网络或对比学习利用这一信号而非丢弃它。
参考:Rinaldi et al. CRAFT-ST 分析(跨类重叠统计)
⚠️ 坑点 6:混淆 proper 与 extended 标注集,导致结果无法与文献对比(分类:评估误用)问题:v3 起每个本体的概念标注有两个版本:proper(仅 OBO 正式类)与 extended(含 CRAFT 自建扩展类)。两者的标签空间、标注数量与难度都不同。研究者常只取一个目录却不说明用的是哪一版。
症状:论文报告的 CHEBI F1 高于共享任务排行榜的 0.77/0.81 数值却无法解释;审稿人无法复现;发现的「性能提升」实际来自把较易的 extended 标签混入 proper 评测。
解决:
- 简单方法:在实验配置中固定使用 proper 集,并在论文方法节明确写出「proper OBO classes only, excluding CRAFT extension classes」。
- 进阶方法:同一次实验跑两套,按官方方式分别报告,并解释差异来源。官方共享任务观察到的规律可作为预期基线:
expected = { "CHEBI": {"proper": 0.77, "extended": 0.81}, # 加扩展类后提升 "GO_CC": {"proper": 0.76, "extended": 0.87}, # 加扩展类后明显提升 "GO_MF": {"proper": 0.98, "extended": None}, # proper 类仅 5 个,EXT 反而下降 "NCBITaxon": {"proper": 0.97, "extended": None}, "PR": {"proper": 0.55, "extended": 0.55}, # 上限受限于任务本身 }
- SOTA 方法:把扩展类视为「本体适配层」单独研究,例如考察扩展类如何提高系统在模糊表述上的覆盖率,以及扩展类与上游 OBO 版本演进之间的映射维护策略。
参考:Furrer et al. 2021, BMC Bioinformatics 22(Suppl 1):623
⚠️ 坑点 7:用任意随机划分的测试集与 CRAFT-ST 2019 排行榜数字比较(分类:评估误用)问题:CRAFT-ST 2019 的官方测试集是 v3.1.3 的 30 篇预留文档。若研究者自行随机划分(如从 97 篇中取 20% 作测试),评测集内容、标注版本、评测脚本都可能不同,得到的 F1 与其排行榜数字不具备可比性。
症状:论文中写的「超越 SOTA」经不起复现;同一模型在不同论文中报告的数字差异巨大;跨论文对比表出现 PR F1 从 0.3 到 0.8 的荒谬跨度。
解决:
- 简单方法:不要跨划分对比。要么完全复现官方设置(v3.1.3 + 官方 30 篇测试集 + 官方 Docker 评测器),要么在论文中明确标注「results are not directly comparable to CRAFT-ST 2019」。
- 进阶方法:用官方评测镜像做自评测校验,确保管线正确后再跑正式实验:
# 自评测:用金标准评测金标准,F-score 必须为 1.0 docker run --rm \ -v /path/to/corpus/distribution:/corpus-distribution \ -v /path/to/system/output:/files-to-evaluate \ ucdenverccp/craft-eval:latest \ sh -c '(cd /home/craft/evaluation && boot javac eval-concept-annotations \ -c /corpus-distribution -i /files-to-evaluate -g /files-to-evaluate)'
- SOTA 方法:建立内部评测基线表,同时维护「官方划分结果」与「自建划分结果」两套数字,任何跨论文引用都注明所依据的划分与版本,并在附录中提供完整划分清单。
参考:CRAFT 共享任务概念标注评测说明
⚠️ 坑点 8:把语料当作生物医学文献的均衡样本,导致模型与结论的系统性偏倚(分类:偏倚陷阱)问题:CRAFT 的采样框是「MGI 曾用作 GO 或 MPO 注释证据的论文」,这使语料高度偏向实验小鼠遗传学,且在物种、学科、出版模式(仅开放获取)上都有系统性倾斜。研究者若默认它代表「生物医学文献」,会把采样偏倚传导到模型与结论中。
症状:模型在小鼠基因名上表现优异但迁移到人类临床文献时大幅掉分;NCBITaxon 标注以小鼠标本为主导致物种识别能力失衡;在人类疾病实体上召回率低却被解释为「模型能力不足」。
解决:
- 简单方法:在数据卡与论文限制节中明确写出偏倚来源(MGI 证据采样框、小鼠主导、仅开放获取、2012 年前文献),不要含糊表述为「生物医学文献」。
- 进阶方法:分物种分层评测,量化偏倚的实际影响:
from collections import defaultdict def stratified_eval(preds, golds, species_of): """species_of: dict[文档] -> 物种标签(如 mouse / human / rat)。""" buckets = defaultdict(lambda: {"tp": 0, "fp": 0, "fn": 0}) for p, g in zip(preds, golds): sp = species_of[p.doc_id] buckets[sp]["tp"] += len(p.spans & g.spans) buckets[sp]["fp"] += len(p.spans - g.spans) buckets[sp]["fn"] += len(g.spans - p.spans) for sp, c in buckets.items(): prec = c["tp"] / max(c["tp"] + c["fp"], 1) rec = c["tp"] / max(c["tp"] + c["fn"], 1) f1 = 2 * prec * rec / max(prec + rec, 1e-9) print(f"{sp:8s} P={prec:.3f} R={rec:.3f} F1={f1:.3f}")
- SOTA 方法:将 CRAFT 用作领域预训练或域内微调资源,再配合人类临床语料做多域联合训练与域对抗适配,使模型的物种与领域偏差被显式建模而非隐式继承。
参考:Cohen et al. 2017, Handbook of Linguistic Annotation(采样框说明)
§6.6 数据增强策略
CRAFT 是全文语料且标注量有限(97 篇),增强策略应服务于「提升语言多样性而保持标注有效性」。
| 增强手段 | 安全性 | 说明与限制 |
|---|---|---|
| 同义本体名称替换 | ✅ 安全 | 用本体中的同义标签替换文中出现的类名,可增加表面形式多样性;须重新计算偏移量 |
| 句子顺序打乱 / 跨文档句子拼接 | ❌ 危险 | 破坏共指链与话题连贯性,制造物理上不存在的共指与话题关系 |
| 随机 token 删除 / 替换 | ❌ 危险 | 破坏实体边界与 span 偏移量;科学术语被替换后语义可能完全改变 |
| 回译(英→他语→英) | ⚠️ 谨慎 | 增加句法多样性,但改变术语表述与偏移量,需重新对齐标注并抽检 |
| 大小写与连字符扰动 | ⚠️ 谨慎 | 生物医学文本中大小写与连字符携带语义(基因名与蛋白质名),扰动须限定范围 |
| 从本体文档生成伪标注样本 | ⚠️ 谨慎 | 扩充类名覆盖,但分布与真实论文差异大,只宜作辅助 |
| 实体遮蔽(Entity Masking)预训练 | ✅ 安全 | 用 [MASK] 遮蔽实体 span,训练领域语言模型,不改变标注集 |
| 上下文窗口滑窗(stride) | ✅ 安全 | 长文切块的必要手段,重叠窗口避免实体被切断;需正确处理跨窗口实体 |
| 核心原则:任何改变字符位置的操作都必须同步重算标注偏移量;任何破坏句子连贯性的操作都会损害共指与关系任务,因为 CRAFT 的价值恰恰在于它提供的是「真实的完整文档」而非孤立的句子。 |
§6.7 模型推荐
| 场景 | 推荐模型 | 理由 | 预期 F1 量级(proper 概念) |
|---|---|---|---|
| 基线复现与快速验证 | CRF + 词典查找(官方基线思路:CRF 做 span 检测、Bi-LSTM 做归一化) | 官方基线,结果可对标,训练成本低 | 视本体而定,多数接近参赛系统 |
| 通用最佳实践 | BioBERT 微调(序列标注头) | 共享任务中表现最强的基础模型,在 CHEBI、GO_BP、SO 上提升明显 | 高分本体可达 0.97-0.98;PR 上限约 0.55 |
| 应对未见概念 | BioBERT + 本体预训练 + 字典回退(backoff) | 官方优胜队伍策略:字典回退缓解「模型只预测训练集见过的 ID」的根本限制 | 同上,稀有类召回显著改善 |
| 长文本与多 span 结构 | span-based / span-set 预测架构 | 序列标注无法表达不连续与重叠,此类架构从设计上支持 | 有提升空间,尤其 PR 与 GO_BP |
| 多本体联合 | 多任务学习(共享编码器 + 多分类头) | 避免跨类重叠被当作标签冲突(见坑点 5) | 每本体独立报告 |
| 零样本 / 少样本 | 生成式概念识别(序列到序列) | 归一化建模为翻译问题时无需固定标签集,可泛化到未见类 ID | 依本体差异大 |
| 工具链评测(非训练) | 现成标注器(词典/规则/神经混合) | CRAFT 的经典用法是检验现成工具在全文上的真实表现 | 工具间差异显著,正是 CRAFT 的核心发现 |
§6.8 硬件需求
| 任务规模 | GPU | 显存 | 训练时长量级 | 备注 |
|---|---|---|---|---|
| 单本体微调(如 GO_BP,BioBERT base) | 1 × 消费级 GPU | 8-12 GB | 小时级 | 语料仅 97 篇,单卡足够 |
| 全 20 个标注集逐一微调 / 多任务联合训练 | 1 × 消费级或中端 GPU | 12-24 GB | 天级(累计) | 可串行执行;建议脚本化批处理 |
| 大模型微调(如 BioBERT large / 更大模型) | 1 × A100 或同级 | 24-40 GB | 天级 | 语料规模不足以支撑从零训练,只宜微调 |
| 推理与评测(全语料 97 篇) | CPU 或任意 GPU | 4 GB+ | 分钟级 | 语料体积极小,推理开销可忽略 |
| 磁盘 | — | — | — | 建议预留 5 GB(原包 + 解压 + 缓存 + 输出) |
| 结论:CRAFT 是「算力友好、工程不友好」型语料。瓶颈几乎从不在 GPU,而在 stand-off 偏移量的正确对齐、格式转换与不连续标注的处理。 |
§6.9 评估指标实现
# CRAFT 概念识别评测:边界 F1 + 概念归一化 F1 + 按本体报告
# 官方评测器区分「边界正确但概念错误」与「完全正确」,两套指标须同时报告
from typing import Set, Tuple
Span = Tuple[int, int]
Pair = Tuple[Span, str]
def _prf(tp: int, n_pred: int, n_gold: int) -> Tuple[float, float, float]:
prec = tp / n_pred if n_pred else 0.0
rec = tp / n_gold if n_gold else 0.0
f1 = 2 * prec * rec / (prec + rec) if (prec + rec) else 0.0
return prec, rec, f1
def span_prf(pred: Set[Span], gold: Set[Span]) -> Tuple[float, float, float]:
"""span 级(边界)评测:只考察实体边界是否命中,不考察概念 ID。"""
return _prf(len(pred & gold), len(pred), len(gold))
def concept_prf(pred: Set[Pair], gold: Set[Pair]) -> Tuple[float, float, float]:
"""概念级评测:span 与本体检 ID 同时命中才算正确,反映归一化真实能力。"""
return _prf(len(pred & gold), len(pred), len(gold))
def slot_error_rate(pred: Set[Pair], gold: Set[Pair]) -> float:
"""
Slot Error Rate(共享任务采用的合并度量):
SER = (S + D + I) / N,S=替换、D=删除、I=插入、N=金标准槽位数。
「边界正确但概念错误」计为替换,而非部分正确。
"""
if not gold:
return 0.0
pred_spans = {s for s, _ in pred}
gold_spans = {s for s, _ in gold}
substitutions = len(pred_spans & gold_spans) - len(pred & gold)
deletions = len(gold_spans - pred_spans)
insertions = len(pred_spans - gold_spans)
return (substitutions + deletions + insertions) / len(gold)
def per_ontology_report(pred_by_ont: dict, gold_by_ont: dict):
"""按本体分别报告:CRAFT 评测的强制要求(各本体难度差异极大)。"""
print(f"{'ontology':<14}{'P':>8}{'R':>8}{'F1':>8}{'SER':>8}")
for ont in sorted(gold_by_ont):
p, g = pred_by_ont.get(ont, set()), gold_by_ont[ont]
prec, rec, f1 = concept_prf(p, g)
print(f"{ont:<14}{prec:>8.3f}{rec:>8.3f}{f1:>8.3f}{slot_error_rate(p, g):>8.3f}")
评测注意事项:
- 必须按本体分别报告。 汇总平均会被标注量大的本体主导,掩盖 PR 等困难本体的真实表现。
- 区分 span 级与概念级指标。 两者的差距直接反映归一化模块的能力,是诊断系统瓶颈的关键信息。
- 不连续标注的评测需显式说明策略。 排除、部分匹配、按 span 集合比对,三种选择会显著影响数字。
- 优先使用官方 Docker 评测器。 自实现评测器在处理部分匹配与不连续 span 时极易与官方口径不一致。
§6.10 MLOps 与可复现性笔记
| 关注点 | CRAFT 场景的具体做法 |
|---|---|
| 版本锁定 | 在配置文件中固定 CRAFT 版本号(如 v5.0.2)与标签集类型(proper / EXT),并在论文中同时给出两者 |
| 划分固化 | 官方 67/30 划分的文档清单单独存为 JSON 并纳入版本控制;自建划分同样固化随机种子与文档清单 |
| 数据指纹 | 对每篇文档记录 (字符数, token 数, 标注条数, 首条标注切片哈希),数据升级后自动比对告警 |
| 偏移量回归测试 | CI 中加入「切片 == covered_text」断言,任何格式转换后自动运行 |
| 评测一致性 | 用官方 ucdenverccp/craft-eval 镜像跑一次自评测,确认 F-score 为 1.0 后再记录正式结果 |
| 实验追踪 | 每次实验记录:CRAFT 版本、本体、标注集类型、划分清单哈希、标签映射表哈希、随机种子 |
| 报告完整性 | 必须报告 per-ontology 结果、不连续标注处理策略、span 级与概念级两套指标 |
| 环境可移植 | 官方转换套件为 Clojure/boot 构建,若仅在 Python 环境工作,需在文档中说明所用的转换方式(预转换文件或自实现解析) |
| 许可合规 | CC BY 3.0 要求署名;衍生数据集与模型卡中须标注 CRAFT 出处、版本与原始论文引用 |
§7 质量评估与局限性
§7.1 已知偏倚
| 偏倚类型 | 描述 | 严重程度 | 缓解方式 |
|---|---|---|---|
| 采样框偏倚 | 文章选自「MGI 曾用作 GO 或 MPO 注释证据」的论文,使语料偏向小鼠遗传学与可策展的基因功能陈述 | 高 | 明确声明代表性限于语体而非主题分布;跨物种分层评测(见坑点 8) |
| 物种偏倚 | 以实验室小鼠(Mus musculus)为主,兼有爪蟾、大鼠、人类等 | 高 | 分物种报告指标;迁移到人类文献时做域适配 |
| 出版模式偏倚 | 仅包含 PubMed Central 开放获取子集文章 | 中 | 论文已论证开放获取文章在语言结构与语义内容上与一般文章无系统差异;但出版模式与学科分布的相关性仍可能引入偏倚 |
| 时间偏倚 | 文献发表于 2012 年以前,覆盖 1998-2012 | 中 | 用于历史方法对比合适;用于当前术语体系(如新版 OBO 类)需重新归一化 |
| 标注体系偏倚 | extended 类由 CRAFT 标注负责人自建,与上游 OBO 不完全一致 | 中 | 主实验使用 proper 集;使用 EXT 时明确说明不可直接映射回上游本体 |
| 语言偏倚 | 仅英文 | 中 | 非英文生物医学 NLP 需另寻语料 |
| 规模偏倚 | 97 篇文档,单本体训练样本可能仅数百条 | 中 | 多随机种子重复实验并报告置信区间;联合预训练弥补 |
| 覆盖完整性偏倚 | 术语覆盖受本体边界限制,未落于目标本体的表述不标注 | 中 | 明确闭世界假设;不把「未标注」解读为「无实体」 |
| 派生层与格式偏倚 | 依存句法由 CLEAR Parser 自动派生、未经人工校订;部分格式(GENIA XML、BIO 序列标注)无法完整表示多 span 标注 | 低-中 | 优先使用人工 treebank 层并在论文中声明依存层性质;统一以 BioNLP stand-off 为内部表示并报告信息损失量 |
§7.2 标注质量
质量保障机制:单一一套书面指南 + 约每周的标注者校准会议 + 专职标注团队 + Knowtator 工具链标准化。
已报告的质量证据:
| 证据类型 | 内容 | 可信度评价 |
|---|---|---|
| 标注者间一致性 | 以 F-score 衡量并达到稳定较高水平,趋势随校准会议次数逐步收敛 | 高:官方论文以图表公开趋势 |
| 覆盖完整性 | 对目标本体的概念「几乎所有提及」都被标注,而非抽样标注 | 高:召回率上限因此明确可见 |
| 外部系统验证 | 部分系统基于 CRAFT 训练后能构建高性能模型,被论文视为语料质量高的额外证据 | 中-高:间接证据,但独立于 IAA |
| 共指一致性与依存层 | 共指 IAA 依度量介于 0.480(entity-based CEAF)至 0.858(Class-B3);依存层官方明确为自动派生 | 中:共指结论受度量选择影响;依存层需在论文中声明 |
| 后续修订 | v4.0.1 修正少量错误标注,v5.0.1/v5.0.2 修复格式缺陷 | 高:体现持续维护 |
| 评价:CRAFT 的语义标注质量在同类公开语料中处于顶级水平,其「全提及覆盖 + 单一指南 + 定期校准 + 持续修订」的组合是它长期被当作金标准的根本原因。共指层与依存层的可靠性依次递减,使用者需按层区别对待。 |
§7.3 泛化性与失效风险
| 目标场景 | 失效风险 | 证据 |
|---|---|---|
| 从 CRAFT 迁移到 PubMed 摘要 | 中高:全文与摘要在句长、指代密度、术语分布上存在系统性差异 | Verspoor et al. 2012 发现多数系统在全文本上的表现与其已发表结果差异显著 |
| 迁移到人类临床文本 | 高:物种、文体、实体类别边界均不同 | CRAFT 采样框以小鼠文献为主;本体体系为 OBO 而非临床术语 |
| 迁移到当前版本 OBO 本体 | 中:部分本体术语在 2012 年后已演进;extended 类为 CRAFT 自建 | 扩展类不可直接映射回上游本体(官方说明) |
| 迁移到非英文文献 | 高:标注与指南均为英文 | 语料仅英文 |
| 迁移到关系抽取任务 | 中高:CRAFT 提供实体与共指标注,但不提供实体间关系标注 | 语料标注层次中无关系层;关系抽取需另寻语料(如 BioInfer、BC5CDR) |
| 迁移到临床编码(ICD/SNOMED CT) | 高:本体体系与粒度均不同,无官方映射表 | 见 §2.1b |
| 长距离指代与不连续结构建模 | 高:现有序列标注架构在这些现象上集体失效 | CRAFT-ST 2019:所有参赛系统均未识别不连续 span;共指 F1 仅 0.57 |
| 低资源本体的稳定评测 | 高:MOP 仅 240 条训练标注 | 标注量统计;单次结果波动大 |
§7.4 伦理与合规
隐私与个人信息:CRAFT 不含任何患者级数据或个人健康信息。全部文档为已发表的同行评审期刊文章,来自 PubMed Central 开放获取子集。文章中的作者姓名、机构与资助信息作为已发表记录的一部分原样保留,标注层不引入额外个人数据。
许可与再分发:全语料以 CC BY 3.0 发布,允许在署名条件下自由复制、分发与改编,包括商业用途。使用要求包括:保留原作者与 CRAFT 项目的署名、注明许可、说明是否作出修改;不得暗示原作者或机构为使用者的使用背书。
研究伦理:由于不涉及人类受试者数据,本语料的使用通常不需要伦理审查委员会批准。但使用者仍需遵守所在机构关于文本挖掘与出版物的规范,以及原始 PMC 文章的使用条款。
偏见与公平性考量:语料在物种、学科、出版模式与时间上存在系统性倾斜(见 §7.1)。在生物医学 AI 应用中,这种倾斜可能转化为对特定研究群落(小鼠遗传学)的能力优势和对其他群落(人类临床医学)的能力劣势。负责任的用法是在模型卡与数据卡中显式披露这一偏差,避免把模型在 CRAFT 上的指标直接等同于「生物医学概念识别能力」。
§7.5 公平性与代表性评估
| 评估维度 | 现状 | 影响与建议 |
|---|---|---|
| 物种代表性 | 以小鼠为主,人类与爪蟾、大鼠次之 | 建议分物种报告性能,避免把小鼠上的好成绩当作跨物种通用能力 |
| 学科代表性 | 覆盖遗传学、分子生物学、细胞生物学、发育生物学、神经科学等,但不含临床专科文献(如放射学报告、病理报告) | 用于临床专科任务前必须做域内评测 |
| 作者与机构代表性 | 依 PMC 开放获取子集构成,以欧美研究机构为主 | 术语与写作风格可能偏向英语母语学术共同体 |
| 出版模式代表性 | 仅开放获取 | 论文已论证开放获取与一般文章在语言层面无系统差异,但学科覆盖差异不可忽视 |
| 时间代表性 | 文献止于 2012 年前 | 新出现的术语(如近年新增基因、疾病分类)不在覆盖范围 |
| 语言代表性 | 仅英文 | 多语言生物医学 NLP 需补充其他语料 |
| 本体覆盖代表性 | 十个实体类型,但 MONDO 无扩展类、GO_MF proper 类仅 5 个 | 某些本体的评测结果统计效力有限,应报告置信区间 |
§7.6 数据漂移与版本演进
CRAFT 的「漂移」不是数据分布随时间变化的漂移,而是标注体系演进带来的版本漂移,这对可复现性的影响更为直接。
| 漂移类型 | 具体表现 | 对使用者的影响 |
|---|---|---|
| 本体版本漂移 | v3 起采用更新版本的本体;v5 引入 MONDO | 旧版训练的分类器无法直接预测新版类 ID,需重新归一化 |
| 标签空间漂移 | v3 引入 extended 类,标签空间显著扩大 | 与 v1/v2 结果不可直接比较(官方明确提示) |
| 语料规模漂移 | v4.0.0 从 67 篇扩展到 97 篇 | 用 67 篇训练与用 97 篇训练的模型无法直接对比 |
| 格式漂移 | 官方自某版本起精简为单一原生格式 + 转换脚本,不再是「随包提供全部格式」 | 依赖旧目录结构的脚本会在升级后失效 |
| 格式缺陷修复 | v5.0.1 修复 MONDO 与其他标注类型共用问题;v5.0.2 修复 CoNLL #end 标签 |
使用 v5.0.0 的 CoNLL 文件可能存在解析异常 |
| 术语年代漂移 | 文献止于 2012 年,其中的基因命名与疾病分类可能已更新 | 迁移到当前数据库时需做术语映射 |
| 应对建议:把版本号当作实验配置的一等公民;任何跨版本比较都在论文中显式说明;升级版本后重跑「偏移量校验 + 自评测 F-score = 1.0」健康检查。 |
§7.7 DAIMS 24 项数据就绪度检查
| # | 检查项 | 状态 | 说明 |
|---|---|---|---|
| 1 | 宽格式 | ✅ | 概念标注为 stand-off 长表结构,一标注一行,天然长格式,无宽表坍缩问题 |
| 2 | 唯一标识 | ✅ | 每篇文档以 PMID 唯一标识;每条标注有文档内唯一的 T<n> 编号;本体类使用全局唯一的 OBO 类 ID |
| 3 | 特殊字符 | ⚠️ | 科学文本含希腊字母、上下标、连字符复合词、斜杠(如 Mcm4/6/7);部分补充平面字符会导致 Java 与 Unicode 偏移量不一致(见坑点 2) |
| 4 | 重复行 | ⚠️ | 同一 span 可被多个本体重复标注(3,362 条跨类重叠);按本体拆分后不重复,合并标签空间时必须去重 |
| 5 | 缺失编码 | ✅ | 缺失语义明确:未标注即「不落于目标本体」。语料采用闭世界设计,官方对信息性缺失有清晰定义 |
| 6 | 标签标识 | ✅ | 标签即本体类 ID,PREFIX:NNNNNNN 形式全局唯一,可直接追溯至 OBO 本体 |
| 7 | 罕见类分组 | ⚠️ | 本体内长尾严重(PR 的 19,862 条标注对应 1,075 个类);建议对低频类做分组或分层报告,但需注意不要掩盖真实性能 |
| 8 | 偏倚评估 | ✅ | 官方论文阐明采样框;本页 §7.1 系统列出十类偏倚与缓解方式 |
| 9 | 数据字典 | ✅ | 本页 §4.1 提供八列 DAIMS 字段字典,覆盖标注记录全部关键属性 |
| 10 | 信息性缺失解释 | ✅ | §4.5 区分「本体覆盖边界」(信息性)与「格式表示损失」(技术性),并给出正确处理方式 |
| 11 | 设备记录 | ✅ | 标注工具链完整记录:Knowtator v1.7.4 + Protege、CLEAR Parser、file-conversion 套件、craft-eval 镜像,见 §3.9 |
| 12 | 共线性 | ⚠️ | 同一文档内标注存在结构性共线(共享跨度、共享本体、共享指代链);建模时需注意特征与标注的耦合 |
| 13 | 编码映射 | ⚠️ | 八个 OBO 本体与 MONDO 无官方映射到 ICD-11 / SNOMED CT;extended 类亦不可直接映射回上游本体 |
| 14 | 时间戳处理 | ✅ | 语料无患者时间戳;文献出版时间以 PMC 元数据保留在 NXML 中;标注不含时间字段 |
| 15 | 划分建议 | ✅ | §5 提供官方 67/30 划分、社区惯例对比与按文档分组的交叉验证建议 |
| 16 | 泄漏讨论 | ✅ | §5.3 系统讨论文档级泄漏、跨本体标签泄漏、扩展类泄漏与共指耦合四类风险及规避方法 |
| 17 | 标签分布 | ✅ | §4.2 与 §4.3 提供本体间、本体内与本体规模三层分布分析 |
| 18 | 测量偏倚 | ✅ | §3.6 报告 IAA 及其随校准会议的变化;共指 IAA 随度量方式从 0.480 到 0.858 不等 |
| 19 | 外部验证建议 | ✅ | §5.5 提供跨语料、跨本体版本、跨物种、与人工策展对照、工具链互验五个方向 |
| 20 | 版本记录 | ✅ | §1.4 版本时间轴完整覆盖 v0.9 至 v5.0.2 的发布日期与关键变化 |
| 21 | 预处理脚本 | ⚠️ | 官方的格式转换与评测脚本齐备(Clojure/boot 实现、Docker 镜像),但不提供 Python 预处理与 DataLoader;本页 §6.3/§6.4 补齐了这一缺口 |
| 22 | 合规要求 | ✅ | CC BY 3.0,署名即可自由使用;无申请流程、无伦理审批要求;§9 提供 BibTeX 引用格式 |
| 23 | 多模态对齐 | ✅ | 语料为纯文本,不存在图像或信号模态;文本与三类标注(语义/句法/共指)通过字符偏移量精确对齐,对齐机制完备 |
| 24 | 去标识化 | ✅ | 语料不含任何患者数据或受保护健康信息;全部文档为已发表的开放获取期刊文章,作者信息作为出版记录保留 |
| DAIMS 评分:20 / 24 | |||
| 评分解读:CRAFT 在 DAIMS 框架下表现优异,24 项中 20 项完全达标。四项 ⚠️ 中有三项(特殊字符、重复行/重叠、罕见类)源于科学文本与多本体标注的固有复杂性,而非数据质量缺陷——它们是任务难度的组成部分,而不是应当「修复」的问题。真正的工程缺口是第 21 项:官方只提供 Clojure 实现的格式转换与 Docker 评测器,不提供 Python 侧的预处理脚本与 PyTorch DataLoader。这与它作为 NLP 语料的定位形成反差:语料被广泛用于神经网络的训练,但训练侧的管道需要每个使用者自行搭建。 | |||
| 对你意味着什么: |
- 不要指望开箱即用的 Python 管道。 官方给的是标注质量与评测口径,不是训练脚手架。预算出 1-2 天时间用于写偏移量解析、标签投影与评测对齐代码——本页 §6.1 至 §6.4 与 §6.9 的代码可直接作为起点。
- 把「版本 + 标注集类型 + 本体」当作三元配置项固定下来。 这三者任一改变,结果都不可比较。用配置文件而非硬编码管理它们。
- 在 CI 中固化偏移量校验。 第 3 项特殊字符风险是静默失败型的:数据加载不会报错,只会产出错误的标签。一条「切片 == covered_text」断言能在几秒内挡住这类问题。
- 报告指标时按本体拆开,并对低资源本体给出置信区间。 第 7 项的稀疏性意味着 MOP、GO_MF 等本体的单次结果波动大,汇总平均则会被 PR 与 GO 系列主导。
- 明确写出你如何处理重叠与不连续标注。 第 4 项与第 23 项表明,这些现象不可能被「消除」,只能被「处理」。处理策略必须写进论文方法节,否则结果无法被正确解读。
- 合规零负担。 第 22 项与第 24 项意味着你可以在商业场景中使用 CRAFT,只需保留署名。这是它相对于多数临床语料的显著优势,值得在选型时计入。
§7.8 外部验证矩阵
| 外部数据集 / 场景 | 来源机构 | 评估任务 | 性能指标 | 相对内部变化 | 关键发现 |
|---|---|---|---|---|---|
| CRAFT 自身(67 篇公开语料) | UC Denver | 分词、分句、词性标注、句法分析、基因提及识别 | 各工具与其原论文报告值差异显著 | 普遍下降 | 多数生物医学 NLP 系统在全文本上无法复现其已发表指标;部分系统可基于 CRAFT 训练出高性能模型,构成语料质量的独立证据(Verspoor et al. 2012) |
| CRAFT v1/v2 概念标注(历史评测) | 多机构 | 大规模生物医学概念识别工具评测 | 各标注器差异明显 | — | 该评测使用 v1/v2 概念标注,与 v3 起的标注体系存在重大差异,官方明确不宜与后续结果直接比较(Funk et al. 2014) |
| CRAFT 全语料(无官方划分的任意切分) | 多篇后续研究 | 概念识别 / NER | P / R / F1 | 不可比 | v4 之前无官方测试集,多数实验使用任意划分或在全语料评测,导致跨研究结果无法比较(Furrer et al. 2021) |
| CRAFT v4.0.1(GO 标注子集) | 独立研究组 | 概念识别(BiLSTM + 本体预训练 + 字典查找) | F1 0.84(报告值) | — | 预训练与字典查找改善性能;但该系统明确无法处理不连续与重叠标注(Devkota et al. 2022) |
| CRAFT 共指层(通用域系统零样本) | 多机构 | 共指消解 | 通用域系统 F 0.14(B3);域适配规则系统 0.42;两者集成 0.46 | 大幅低于通用域常规表现 | 生物医学全文共指对通用域系统构成严重挑战;沿 IDENTITY 链传播可新增 106,263 个命名实体(+76%)(Cohen et al. 2017) |
§8 基准性能与生态
§8.1 CRAFT-ST 2019 概念标注任务排行榜
CRAFT-ST 2019 概念标注任务只有一个团队提交了三个 run,因此榜单规模很小。这一低参与度本身是重要事实:全文生物医学概念识别在当时仍是一个参与者稀少的赛道。
| 排名 | 系统 | 性能 | 年份 | 关键技术 | 完整引用 | 代码 |
|---|---|---|---|---|---|---|
| 1(综合最优) | UZH Run3:BioBERT + OGER NER 输入 | 在 proper OBO 概念归一化上整体最优;CHEBI / GO_BP / GO_MF / SO 相对历史评测明显提升 | 2019 | BioBERT 微调,词表以本体类 ID 为标签集,权重经 PubMed 预训练,输入融合 OGER 的 NER 结果 | Furrer L, Cornelius J, Rinaldi F. UZH@CRAFT-ST: a Sequence-labeling Approach to Concept Recognition. In: Proceedings of The 5th Workshop on BioNLP Open Shared Tasks, ACL, 2019, pp. 185-195. DOI: 10.18653/v1/D19-5726 | https://github.com/OntoGene/craft-st |
| 2(扩展类更优) | UZH Run2:BiLSTM + 本体预训练 | 在使用 extension classes 归一化时整体更好 | 2019 | 从零训练的 BiLSTM,双输出(NER / NEN),本体预训练 + 字典查找回退 | 同上 | 同上 |
| 3(无 OGER 输入) | UZH Run1:BioBERT(不含 OGER) | 略低于 Run3 | 2019 | 同 Run3 但输入不含 OGER 的 NER 结果 | 同上 | 同上 |
| 基线 | CRF(span 检测)+ Bi-LSTM(归一化) | 多数本体上接近或略低于最优参赛系统 | 2019 | 两阶段机器学习,官方基线 | Baumgartner WA, Bada M, Pyysalo S, et al. CRAFT Shared Tasks 2019 Overview — Integrated Structure, Semantics, and Coreference. In: Proceedings of The 5th Workshop on BioNLP Open Shared Tasks, ACL, 2019. DOI: 10.18653/v1/d19-5725 | https://github.com/lhunter-lab/craft-shared-tasks |
| 逐本体的量化结果(proper OBO 概念): | ||||||
| 本体 | 最优系统 F1 | 加入扩展类后 | 说明 | |||
| — | — | — | — | |||
| NCBITaxon | 0.97 | 未报告 | 类数量虽大但文本表述高度一致,任务相对容易 | |||
| GO_MF | 0.98 | 预期下降 | proper 类仅 5 个,扩展类引入反而稀释性能 | |||
| CHEBI | 0.77 | 0.81 | 扩展类提升 4 个百分点 | |||
| GO_CC | 0.76 | 0.87 | 扩展类提升 11 个百分点,为本体间最大改善之一 | |||
| PR | 未超过 0.55 | 未超过 0.55 | 全语料最难本体,两种标注集均无法突破 | |||
| SO | 相对历史评测明显提升 | — | 神经方法改善了长期存在的识别缺陷 | |||
| ⚠️ 数值不可直接比较的原因: |
- 仅一个团队参赛。 榜单不是竞争性排名,而是三条系统变体之间的对比,不具备「多方法横向比较」的统计意义。
- 标注版本差异。 本任务使用 v3 概念标注,而历史评测(Funk et al. 2014)使用 v1/v2。官方明确声明两版之间的差异使得直接比较「不安全」。
- 扩展类改变了任务定义。 proper 与 EXT 是两个不同的标签空间,同一数字在两套体系下含义不同。
- 不连续标注被系统性排除。 基线与所有参赛系统均未输出不连续 span,评测时这部分标注被排除在外,使指标偏向更容易的连续标注。
- 各本体的标注量与类空间差异巨大(MOP 240 条 vs PR_EXT 19,862 条;GO_MF 5 类 vs NCBITaxon EXT 1,167,358 类),per-ontology 数字之间的可比性远低于它们各自与自身历史的可比性。
§8.2 SOTA 总结与选型建议
当前状况总结:
- 容易的本体已经接近解决。 NCBITaxon 与 GO_MF 的 F1 达到 0.97-0.98,说明当类空间集中在少数高频类、文本表述高度一致时,基于 BioBERT 的方法已基本够用。
- 困难本体长期停滞在低位。 PR 即使加入扩展类也未突破 F1 0.55,且从 2014 年的工具评测到 2019 年的共享任务均无实质突破。其类数量多(训练集内 1,075 个唯一 ID)、命名变体巨大、基因与蛋白质名称在文本中高度歧义,是根本性难点。
- 神经方法与领域预训练是分水岭,而结构性问题无进展。 BioBERT 与 SciBERT 相对通用模型表现更优,领域预训练已成默认选择;但不连续 span 与重叠标注仍是所有系统的共同盲区,属于架构层面而非调优问题。
选型建议:
| 你的目标 | 建议方案 |
| — | — |
| 快速拿到可对标基线 | 复现官方基线(CRF + Bi-LSTM)在 v3.1.3 上的结果,确认管线正确 |
| 追求单本体最优 | BioBERT 微调 + 本体字典回退;对高频本体已接近天花板,收益主要来自稀有类召回 |
| 需要覆盖未见本体类 | 生成式(序列到序列)概念识别,或本体预训练 + 回退策略,避免固定标签集的限制 |
| 面向生产系统 | 不要依赖单一模型;用字典查找兜底 + 模型排序的组合,并接受 PR 类标注的较低召回 |
| 研究结构性问题 | 直接以不连续与重叠标注为研究对象,采用 span-set 或 token-pair 架构,CRAFT 是唯一可用的真实评测集 |
§8.3 评测协议
官方评测流程:
- 输入格式:BioNLP stand-off。概念 ID 直接作为标注类型写在
T行,不使用Normalization的N行。 - 不连续标注的写法:偏移区间以分号分隔,例如
T3 CL:0000604 30862 30865;30875 30889 rod ... photoreceptors。 - 目录组织:按本体分目录,目录名需为下列之一(大小写不敏感):
CHEBI、CHEBI_EXT、CL、CL_EXT、GO_BP、GO_BP_EXT、GO_CC、GO_CC_EXT、GO_MF、GO_MF_EXT、MONDO_WITHOUT_GENOTYPE_ANNOTATIONS、MONDO_WITH_GENOTYPE_ANNOTATIONS、MOP、MOP_EXT、NCBITAXON、NCBITAXON_EXT、PR、PR_EXT、SO、SO_EXT、UBERON、UBERON_EXT。 - 文件命名:必须与源文本文件同 ID,例如源自
11532192.txt的输出应命名为11532192.bionlp。 - 评测方式:把系统输出目录与语料目录挂载到
ucdenverccp/craft-eval镜像,运行eval-concept-annotations任务;结果写入各输出目录。容器无法写入加密文件系统,挂载路径必须位于非加密目录。 - 自评测校验(强制前置步骤):用金标准评测金标准(
-i与-g指向同一目录),F-score 必须为 1.0,否则管线存在问题。
报告建议:按本体分别报告 Precision / Recall / F1,并同时给出 span 级与概念级两套数字;明确说明不连续标注的处理策略。
§8.4 相关数据集
| 数据集 | 关系 | 规模 | 定位差异 |
|---|---|---|---|
| GENIA | 同为生物医学语义与句法语料 | 约 2,000 篇摘要 + 部分全文 | 以摘要为主、实体体系非 OBO 对齐;CRAFT 是全文本 + OBO 归一化 |
| BioInfer | 同为关系抽取与实体标注语料 | 1,100 句 | 句子级粒度、无本体归一化 |
| PennBioIE | 同为语义与句法标注语料 | 约 4,000 篇摘要 | 领域特化类别(肿瘤学、CYP 酶),非社区本体 |
| BC5CDR | 概念识别与关系抽取赛道语料 | 1,500 篇摘要 | 仅摘要、两个实体类型;CRAFT 可作其全文侧补充 |
| Cadec | 药物警戒 NER 语料 | 150 篇药品说明书 | 文体为说明书而非研究论文 |
| jNLPBA / GENETAG | 基因与蛋白质 NER 语料 | 数万句 | 任务单一、无归一化 |
| CALBC | 大规模银标准语料 | 极大 | 银标准(自动协调生成);CRAFT 为人工金标准 |
| BioCreative 系列赛道数据 | 生物医学文本挖掘评测 | 多子任务 | 多为摘要级、任务导向;CRAFT 提供全文金标准 |
§8.5 关键论文 Top 8
- Bada M, Eckert M, Evans D, Garcia K, Shipley K, Sitnikov D, Baumgartner WA, Cohen KB, Verspoor K, Blake JA, Hunter LE. Concept annotation in the CRAFT corpus. BMC Bioinformatics. 2012;13:161. DOI: 10.1186/1471-2105-13-161 — CRAFT 概念标注的主论文,定义了 97 篇全文语料、九个本体体系、67 篇首版发布与标注指南,报告 560,000+/790,000+ token 与近 100,000/140,000+ 条概念标注。
- Verspoor K, Cohen KB, Lanfranchi A, Warner C, Johnson HL, Roeder C, Choi JD, Funk C, Malenkiy Y, Eckert M, Xue N, Baumgartner WA, Bada M, Palmer M, Hunter LE. A corpus of full-text journal articles is a robust evaluation tool for revealing differences in performance of biomedical natural language processing tools. BMC Bioinformatics. 2012;13:207. DOI: 10.1186/1471-2105-13-207 — 引入 CRAFT 的语言学标注,并用它系统评测分句、分词、词性标注、句法分析与基因提及识别工具,发现多数系统在全文本上的表现与已发表结果差异显著。
- Cohen KB, Lanfranchi A, Choi MJ, Bada M, Baumgartner WA, Panteleyeva N, Verspoor K, Palmer M, Hunter LE. Coreference annotation and resolution in the Colorado Richly Annotated Full Text (CRAFT) corpus of biomedical journal articles. BMC Bioinformatics. 2017;18:372. DOI: 10.1186/s12859-021-04511-y — 报告共指标注(新增近 30,000 条标注)、IAA 范围(0.480-0.858)、工具基线表现,以及沿 IDENTITY 链传播可新增 106,263 个命名实体(+76%)的发现。
- Bada M, Vasilevsky N, Baumgartner WA, Haendel M, Hunter LE. Gold-standard ontology-based anatomical annotation in the CRAFT Corpus. Database (Oxford). 2017;2017:bax087. DOI: 10.1093/database/bax087 — 报告 v2.1 加入的 UBERON 解剖学标注,为当时最大规模公开金标准解剖标注集,并给出自动解剖学概念识别的性能基线。
- Baumgartner WA, Bada M, Pyysalo S, Ciosici MR, Hailu ND, Pielke-Lombardo H, Regan M, Hunter LE. CRAFT Shared Tasks 2019 Overview — Integrated Structure, Semantics, and Coreference. In: Proceedings of The 5th Workshop on BioNLP Open Shared Tasks. ACL; 2019. DOI: 10.18653/v1/d19-5725 — 共享任务总览,定义结构标注、共指消解与概念标注三个任务,发布 30 篇预留测试文档,报告依赖分析 LAS 89.7%(基线 56.7%)与概念标注逐本体结果。
- Furrer L, Cornelius J, Rinaldi F. UZH@CRAFT-ST: a Sequence-labeling Approach to Concept Recognition. In: Proceedings of The 5th Workshop on BioNLP Open Shared Tasks. ACL; 2019:185-195. DOI: 10.18653/v1/D19-5726 — 共享任务概念标注唯一参赛团队的方案,提出 BiLSTM 与 BioBERT 两条联合 NER+NEN 的序列标注路线,并使用本体预训练与字典回退处理未见概念。
- Furrer L, Cornelius J, Rinaldi F. Parallel sequence tagging for concept recognition. BMC Bioinformatics. 2021;22(Suppl 1):623. DOI: 10.1186/s12859-021-04511-y — 期刊版本论文,详述 CRAFT v4 的 20 个标注集结构、8 个本体清单,并系统讨论为何跨研究的 CRAFT 结果不可直接比较。
- Cohen KB, Verspoor K, Fort K, Funk C, Bada M, Palmer M, Hunter LE. The Colorado Richly Annotated Full Text (CRAFT) Corpus: Multi-Model Annotation in the Biomedical Domain. In: Handbook of Linguistic Annotation. Springer, Dordrecht; 2017:1379-1394. DOI: 10.1007/978-94-024-0881-2_53 — CRAFT 的方法论总述章节,说明「多模型标注」设计、采样框来自 MGI 证据文献,以及 Penn Treebank 格式的领域适配。
§8.6 社区活跃度
| 指标 | 数值 | 截至 |
|---|---|---|
| GitHub Star | 80 | 2022 年(仓库页面快照) |
| GitHub Fork | 19 | 2022 年(仓库页面快照) |
| GitHub Release 数 | 10(最新 v5.0.2) | 2022-07-26 |
| GitHub 提交数 | 204 | 2022 年(仓库页面快照) |
| 主要贡献者 | 5 | 2022 年(仓库页面快照) |
| 仓库语言构成 | Clojure 100% | 2022 年(仓库页面快照) |
| Google Scholar 引用 | 470+ | 2026-09 |
| HuggingFace 封装 | bigbio/craft(BigBio 项目维护) |
2025 |
| 活跃度评价:CRAFT 的代码仓库活跃度低(最后一次发布在 2022 年),但这符合它的定位——作为已经定型的金标准语料,其价值不依赖于持续更新。真正的社区活跃度体现在下游研究的引用与 HuggingFace 等平台的封装上,而非仓库的提交频率。语料本身以「冻结的快照」形式长期可用,这对可复现性是优点。 |
§8.7 生态快照
| 资源 | 类型 | 链接 | Star / 状态(截至 2026-09) | 推荐理由 |
|---|---|---|---|---|
| UCDenver-ccp/CRAFT | 官方仓库 | https://github.com/UCDenver-ccp/CRAFT | 80 stars / 19 forks | 权威来源,含全部标注、本体文件与格式转换脚本 |
| CRAFT Wiki | 官方文档 | https://github.com/lhunter-lab/CRAFT/wiki/ | 活跃维护 | 安装说明、目录结构解释、编码与偏移量注意事项的唯一权威出处 |
| craft-shared-tasks | 官方赛道仓库 | https://github.com/lhunter-lab/craft-shared-tasks | 稳定 | 含评测说明、目录命名规则与 Docker 评测流程 |
| ucdenverccp/craft-eval | 官方评测镜像 | Docker Hub | 稳定 | 官方口径的评测器;自评测必须用它确认 F-score = 1.0 |
| OntoGene/craft-st | 参赛系统代码 | https://github.com/OntoGene/craft-st | 存档 | UZH 队伍的实现,包含本体预训练与字典回退策略的参考代码 |
| Zenodo CRAFT v5.0.0 | 长期归档 | https://zenodo.org/records/6114204 | 含 MD5 | 提供可引用的 DOI 校验值与稳定的长期存储 |
| bigbio/craft | HuggingFace 封装 | https://huggingface.co/datasets/bigbio/craft | 由 BigBio 维护 | 已转为标准 NER / NED 格式,适合快速实验与小规模验证 |
| SourceForge BioNLP-Corpora | 历史版本归档 | https://sourceforge.net/projects/bionlp-corpora/files/CRAFT/ | 冻结 | v0.9、v2.0 等早期版本的唯一来源,复现 2019 年前工作需要它 |
§9 相关资源与引用
§9.1 官方文档与教程
| 资源 | 链接 | 用途 |
|---|---|---|
| 官方仓库 | https://github.com/UCDenver-ccp/CRAFT | 语料与标注文件本体 |
| 项目门户(SourceForge) | https://sourceforge.net/projects/bionlp-corpora/ | BioNLP-Corpora 项目总入口,含历史版本 |
| CRAFT Wiki | https://github.com/lhunter-lab/CRAFT/wiki/ | 安装、目录结构、编码与偏移量说明 |
| 主参考文献页 | https://github.com/UCDenver-ccp/CRAFT/wiki/Primary-references-for-the-CRAFT-corpus | 按标注类型组织的一站式引用索引 |
| 共享任务仓库 | https://github.com/lhunter-lab/craft-shared-tasks | 评测说明与提交格式 |
| 概念标注评测说明 | https://github.com/lhunter-lab/craft-shared-tasks/wiki/Concept-Annotation-Task-Evaluation | 输出格式、目录命名与 Docker 评测命令 |
| GitHub Issues | https://github.com/UCDenver-ccp/CRAFT/issues | 问题反馈与官方回复 |
| 联系邮箱 | mike.bada@ucdenver.edu | 语料维护者联系方式 |
| 历史联系邮箱 | ccpsupport@ucdenver.edu | 早期发布版本文档中列出的支持邮箱 |
§9.2 引用指南
CRAFT 存在多个可引用对象,引用时应根据使用内容选择恰当条目:
- 使用概念标注(最常见)→ 引用 Bada et al. 2012(BMC Bioinformatics 13:161)
- 使用句法 / 语言学标注 → 引用 Verspoor et al. 2012(BMC Bioinformatics 13:207)
- 使用共指标注 → 引用 Cohen et al. 2017(BMC Bioinformatics 18:372)
- 使用 UBERON 解剖学标注 → 引用 Bada et al. 2017(Database 2017:bax087)
- 使用 v3 及以后的概念标注或参与共享任务对比 → 额外引用 Baumgartner et al. 2019(CRAFT-ST 2019 概览)
- 引用语料整体或方法论 → 引用 Cohen et al. 2017(Handbook of Linguistic Annotation 章节)
除论文引用外,CC BY 3.0 许可要求在使用处保留署名,建议在数据卡、模型卡与论文的数据声明中明确写出所用 CRAFT 的版本号(如 v5.0.2)与本体子集。
§9.3 BibTeX 引用块
@article{bada2012concept,
title = {Concept annotation in the CRAFT corpus},
author = {Bada, Michael and Eckert, Miriam and Evans, Donald and Garcia, Kristin and Shipley, Krista and Sitnikov, Dmitry and Baumgartner, William A and Cohen, K. Bretonnel and Verspoor, Karin and Blake, Judith A and Hunter, Lawrence E.},
journal = {BMC Bioinformatics},
volume = {13},
number = {1},
pages = {161},
year = {2012},
doi = {10.1186/1471-2105-13-161}
}
@article{verspoor2012corpus,
title = {A corpus of full-text journal articles is a robust evaluation tool for revealing differences in performance of biomedical natural language processing tools},
author = {Verspoor, Karin and Cohen, K. Bretonnel and Lanfranchi, Arrick and Warner, Colin and Johnson, Helen L. and Roeder, Christophe and Choi, Jinho D. and Funk, Christopher and Malenkiy, Yuriy and Eckert, Miriam and Xue, Nianwen and Baumgartner, William A and Bada, Michael and Palmer, Martha and Hunter, Lawrence E.},
journal = {BMC Bioinformatics},
volume = {13},
number = {1},
pages = {207},
year = {2012},
doi = {10.1186/1471-2105-13-207}
}
@article{cohen2017coreference,
title = {Coreference annotation and resolution in the Colorado Richly Annotated Full Text (CRAFT) corpus of biomedical journal articles},
author = {Cohen, K. Bretonnel and Lanfranchi, Arrick and Choi, Miji Joo-Young and Bada, Michael and Baumgartner, William A and Panteleyeva, Natalya and Verspoor, Karin and Palmer, Martha and Hunter, Lawrence E.},
journal = {BMC Bioinformatics},
volume = {18},
number = {1},
pages = {372},
year = {2017},
doi = {10.1186/s12859-017-1775-9}
}
@article{bada2017anatomical,
title = {Gold-standard ontology-based anatomical annotation in the CRAFT Corpus},
author = {Bada, Michael and Vasilevsky, Nicole and Baumgartner, William A and Haendel, Melissa and Hunter, Lawrence E.},
journal = {Database},
volume = {2017},
pages = {bax087},
year = {2017},
doi = {10.1093/database/bax087}
}
@inproceedings{baumgartner2019craft,
title = {CRAFT Shared Tasks 2019 Overview --- Integrated Structure, Semantics, and Coreference},
author = {Baumgartner, William A and Bada, Michael and Pyysalo, Sampo and Ciosici, Manuel R. and Hailu, Negacy D. and Pielke-Lombardo, Harrison and Regan, Michael and Hunter, Lawrence E.},
booktitle = {Proceedings of The 5th Workshop on BioNLP Open Shared Tasks},
publisher = {Association for Computational Linguistics},
pages = {174--184},
year = {2019},
doi = {10.18653/v1/D19-5725}
}
@inproceedings{furrer2019uzh,
title = {UZH@CRAFT-ST: a Sequence-labeling Approach to Concept Recognition},
author = {Furrer, Lenz and Cornelius, Joseph and Rinaldi, Fabio},
booktitle = {Proceedings of The 5th Workshop on BioNLP Open Shared Tasks},
publisher = {Association for Computational Linguistics},
pages = {185--195},
year = {2019},
doi = {10.18653/v1/D19-5726}
}
@article{furrer2021parallel,
title = {Parallel sequence tagging for concept recognition},
author = {Furrer, Lenz and Cornelius, Joseph and Rinaldi, Fabio},
journal = {BMC Bioinformatics},
volume = {22},
number = {Suppl 1},
pages = {623},
year = {2021},
doi = {10.1186/s12859-021-04511-y}
}
@incollection{cohen2017handbook,
title = {The Colorado Richly Annotated Full Text (CRAFT) Corpus: Multi-Model Annotation in the Biomedical Domain},
author = {Cohen, K. Bretonnel and Verspoor, Karin and Fort, Kar{\"e}n
and Funk, Christopher and Bada, Michael and Palmer, Martha
and Hunter, Lawrence E.},
booktitle = {Handbook of Linguistic Annotation},
publisher = {Springer, Dordrecht},
pages = {1379--1394},
year = {2017},
doi = {10.1007/978-94-024-0881-2_53}
}
§10 AI 使用声明卡
§10.1 AI 参与范围
| 环节 | 参与方式 | 人工审核状态 |
|---|---|---|
| 网络检索与事实收集 | AI 执行 WebSearch,抓取官方仓库、论文摘要与项目文档 | ✅ 已通过 |
| FACTS.md 事实清单编制 | AI 汇总检索结果,逐条附来源 URL | ✅ 已通过 |
| 正文初稿撰写 | AI 依据宪法与简报撰写全部章节 | ✅ 已通过 |
| 代码示例撰写 | AI 编写解析、预处理、DataLoader 与评测代码 | ✅ 已通过 |
| 医学背景与本体映射章节 | AI 起草,标注来源与非官方推断部分 | ✅ 已通过 |
| 数字与规模事实核验 | 人工逐项对照来源链接核验 | ✅ 已验证 |
| 结构与格式合规检查 | AI 运行校验脚本并修复问题 | ✅ 已通过 |
§10.2 使用的 AI 模型
| 用途 | 模型类型 | 说明 |
|---|---|---|
| 检索与信息提取 | 通用大语言模型(带联网检索工具) | 执行 WebSearch 并汇总来源 |
| 正文撰写 | 通用大语言模型 | 依据写作宪法与简报生成结构化条目 |
| 代码生成 | 通用大语言模型 | 生成 Python / Bash 示例代码 |
| 结构校验 | 规则脚本(check_md.py) |
非 AI 组件,用于格式与合规硬校验 |
§10.3 输入来源列表
- Bada M, Eckert M, Evans D, et al. Concept annotation in the CRAFT corpus. BMC Bioinformatics. 2012;13:161. https://bmcbioinformatics.biomedcentral.com/track/pdf/10.1186/1471-2105-13-161
- Verspoor K, Cohen KB, Lanfranchi A, et al. A corpus of full-text journal articles is a robust evaluation tool for revealing differences in performance of biomedical natural language processing tools. BMC Bioinformatics. 2012;13:207. https://doi.org/gb8t7v
- Cohen KB, Lanfranchi A, Choi MJ, et al. Coreference annotation and resolution in the Colorado Richly Annotated Full Text (CRAFT) corpus of biomedical journal articles. BMC Bioinformatics. 2017;18:372. https://pesquisa.bvsalud.org/ses/resource/pt/mdl-28818042
- Bada M, Vasilevsky N, Baumgartner WA, et al. Gold-standard ontology-based anatomical annotation in the CRAFT Corpus. Database. 2017;2017:bax087. https://bio.tools/CRAFT
- Baumgartner WA, Bada M, Pyysalo S, et al. CRAFT Shared Tasks 2019 Overview — Integrated Structure, Semantics, and Coreference. BioNLP-OST 2019. https://www.utupub.fi/bitstream/handle/10024/161666/D19-5725.pdf?sequence=1
- Furrer L, Cornelius J, Rinaldi F. UZH@CRAFT-ST: a Sequence-labeling Approach to Concept Recognition. BioNLP-OST 2019:185-195. https://www.zora.uzh.ch/id/eprint/176855/1/Furrer_Cornelius_Rinaldi_BioNLP-OST2019.pdf
- Furrer L, Cornelius J, Rinaldi F. Parallel sequence tagging for concept recognition. BMC Bioinformatics. 2021;22(Suppl 1):623. https://bmcbioinformatics.biomedcentral.com/articles/10.1186/s12859-021-04511-y
- Rinaldi F, et al. CRAFT shared task 分析(不连续与重叠标注统计). https://ipg.idsia.ch/preprints/rinaldi2019h.pdf
- Concept recognition as a machine translation problem(CRAFT 本体与标注集说明). https://pmc.ncbi.nlm.nih.gov/articles/PMC8678974/
- Devkota D, et al. A Gated Recurrent Unit based architecture for recognizing ontology concepts from biological literature. BioData Mining. 2022;15:22. https://link.springer.com/content/pdf/10.1186%2Fs13040-022-00310-0.pdf
- CRAFT 官方 GitHub 仓库与发布说明. https://github.com/UCDenver-ccp/CRAFT
- CRAFT 使用文档 Wiki(编码、偏移量与目录结构). https://github.com/lhunter-lab/CRAFT/wiki/
- CRAFT 概念标注任务评测说明(输出格式与目录命名). https://github.com/lhunter-lab/craft-shared-tasks/wiki/Concept-Annotation-Task-Evaluation
- CRAFT v2.0 发布说明(多格式清单与 Java 偏移量提示). https://sourceforge.net/projects/bionlp-corpora/files/CRAFT/v2.0/
- CRAFT v0.9 发布说明(BRAT 浏览与不连续标注渲染限制). https://sourceforge.net/projects/bionlp-corpora/files/CRAFT/v0.9/
- bio.tools CRAFT 条目(CC BY 3.0 许可与 v2.1 UBERON 说明). https://bio.tools/CRAFT
- Zenodo CRAFT v5.0.0 归档(175.0 MB 与 MD5). https://zenodo.org/records/6114204
- BigBio CRAFT 数据集加载脚本(v5.0.0 归档地址、标签类别与任务定义). https://github.com/bigscience-workshop/biomedical/blob/c6bfb36a5d693f4c2cf1a77f4ffff2ad55b79a00/bigbio/biodatasets/craft/craft.py
- CRAFT 主参考文献索引(各标注层的引用归属). https://github.com/UCDenver-ccp/CRAFT/wiki/Primary-references-for-the-CRAFT-corpus
- CRAFT-ST 2019 概念标注逐本体结果分析. https://liner.com/review/craft-shared-tasks-2019-overview-integrated-structure-semantics-and-coreference
- Handbook of Linguistic Annotation 章节(采样框与多模型标注说明). https://vufind.katalog.k.utb.cz/SummonRecord/FETCH-LOGICAL-p1353-57451ea48d6f56f98c6081165cef831c39d6cd9a0d595c8cbb79c4a96bc4b30f3/Description
- CRAFT 论文摘要与 Token / 标注规模数据(MEDLINE 记录). https://www.medscape.com/medline/abstract/22776079
§10.4 人工校验表
| 内容模块 | 审核方式 | 审核状态 |
|---|---|---|
| YAML frontmatter(9 字段与 schema_org 双节点) | 逐字段对照宪法规范核验 | ✅ 已通过 |
| INFOBOX 22 字段与格式(引用次数、AI 就绪度评分) | 对照来源链接逐项核验,评分按五级标准复算 | ✅ 已验证 |
| §1 概览(规模数字、版本时间轴) | 与官方论文、GitHub Releases 与 Zenodo 记录交叉核对 | ✅ 已验证 |
| §2 医学背景(本体层级、ICD-11 / SNOMED CT 映射) | 医学编辑复核本体术语;核对非官方导航性映射已明确标注 | ✅ 已通过 |
| §3 数据集规格(标注数量、格式清单、工具链) | 与官方发布说明及共享任务统计逐项核对 | ✅ 已验证 |
| §4 数据结构(目录树、DAIMS 字段字典、缺失编码) | 与官方仓库目录、发布说明与 Wiki 核对 | ✅ 已通过 |
| §5 划分与泄漏分析 | 与官方 67/30 划分及共享任务说明核对 | ✅ 已通过 |
| §6 AI 就绪指南与 §6.5 八大坑点 | 逐段审查代码逻辑;每条坑点回溯官方文档与论文来源 | ✅ 已验证 |
| §7 质量评估(偏倚、DAIMS 24 项、外部验证矩阵) | 逐项核对 DAIMS 判定依据与外部验证来源 | ✅ 已通过 |
| §8 基准与生态(排行榜数字与完整引用) | 与 CRAFT-ST 2019 论文及分析文章逐数字核对 | ✅ 已验证 |
| §9 资源与 BibTeX、§10 AI 声明卡与来源列表 | 核对链接可达性、引用字段完整性与来源 URL 一致性 | ✅ 已通过 |
§10.5 AI 生成章节标注
本条目由 AI 依据公开来源撰写,经千方病案医学编辑部人工审核。以下章节包含 AI 生成内容并已完成人工核验:
- §1 数据集概览、§2 医学背景、§3 数据集规格、§4 数据结构、§5 划分与使用建议:AI 起草,数字与结构经人工对照来源核验。
- §6 AI 就绪指南:代码示例由 AI 编写,逻辑与 API 用法经人工审查;坑点条目均回溯至官方文档或论文来源。
- §7 质量评估与局限性、§8 基准性能与生态:AI 起草,DAIMS 判定与排行榜数字经人工逐项复核。
- §9 资源与引用、§10 使用声明卡:AI 整理,链接与引用字段经人工核验。
§10.6 最后人工审核日期
最后人工审核日期:2026-09-05
审核机构:千方病案医学编辑部
页面状态:published(全部内容已完成审核并发布)
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- pubtator-central — 共享标签:医疗NLP / 生物医学文献 / 命名实体识别 / 知识图谱 / 评测基准
- medmentions — 共享标签:医疗NLP / 生物医学文献 / 命名实体识别 / 知识图谱
- biored — 共享标签:医疗NLP / 生物医学文献 / 命名实体识别 / 知识图谱
- genia — 共享标签:医疗NLP / 生物医学文献 / 命名实体识别 / 评测基准
- s2orc — 共享标签:医疗NLP / 生物医学文献 / 知识图谱
- cometa — 共享标签:医疗NLP / 命名实体识别 / 知识图谱
- ncbi-disease — 共享标签:医疗NLP / 生物医学文献 / 命名实体识别
- jnlpba — 共享标签:医疗NLP / 生物医学文献 / 命名实体识别
- biosses — 共享标签:医疗NLP / 生物医学文献 / 评测基准
- bc5cdr — 共享标签:医疗NLP / 生物医学文献 / 命名实体识别
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

