感谢 Kaggle、MDC 以及所有参与者让这次竞赛变得如此激动人心。我们在一起开发解决方案的过程中度过了愉快的时光,方案如下!
本次竞赛主要有两个子任务:(a) 在科学论文中查找数据集引用(候选提取)和 (b) 将引用分类为主要或次要类型(类型分类)。
候选提取
- DOI 引用:检索自 Data Citation Corpus v3.0 (DCC)。我们移除了来自
czi源的记录以及一些 DOI 存储库,如HEPData、Cambridge Crystallographic Data Centre和figshare。检索到的 DOI id 仅在出现在 PDF/XML 文章文本中时才保留用于类型分类。 - 登录号引用 (Accession Mentions):检索自 PMC TextMinedTerms corpus (PMC),过滤掉了如
gca、go、hgnc、rrid和nct等存储库,根据竞赛数据,这些大多是误报。与 DOI 类似,检索到的候选项仅在出现在 PDF/XML 文章文本中时才被保留。 - 正则表达式 fallback:当 DCC/PMC 语料库不包含任何候选项时,我们使用正则表达式来源可能的候选项,随后使用基于 LLM 的过滤来移除潜在的误报。我们使用 LLM 处理了由于 PDF 到文本的伪影导致 DOI 引用分散在多行的边缘情况。这是我们在意识到 DCC 和 PMC 语料库可以提供近乎完美的召回率和高精度之前的原始方法。
类型分类
我们训练了 LLM 分类器,无需为每个子集分别训练模型即可处理 DOI 和登录号子集。由于竞赛数据集较小且 noisy,训练鲁棒的模型非常棘手。我们采用了一些策略来应对这些挑战:
- 实现了一个工具调用代理,使用来自 Europe PMC open access subset 的文章生成合成标签。该代理结合关键词和语义搜索工具,从文章中收集足够的上下文/证据,然后再进行引用类型分类。我们使用合成数据集预热了公共 LLM(Qwen 2.5 系列),然后再用竞赛示例进行微调。我们在这里分享了一个演示 notebook,展示了代理设置和分类轨迹。代理生成的合成数据集可以在这里找到。
- 为了集成中的模型多样性,我们还通过将伪标签示例(由 Qwen-2.5-72B 生成)添加到竞赛数据集中来训练了一些模型。
- 少数文章包含大量登录号 id(32+),对模型训练产生了过大的影响。因此,我们在微调数据混合中将每篇文章的数据集引用限制为最多 24 个。对于数据增强,我们将数据集 id 掩蔽为
<mask_i>令牌,其中 i 代表给定上下文中的不同数据集引用。 - 使用指数移动平均 (EMA) 平均化检查点。
分类上下文
我们试图最大化 LLM 上下文中的相关信息覆盖范围,以便进行知情的分类。具体来说,上下文包括:
- 文章文本的前
n(= 1400) 个字符,作为结构化元数据(如标题、作者、出版年份和摘要)的代理 - 包含数据集 id 引用的片段
- 数据可用性或类似部分
- 包含其他检测到的 DOI 引用的文本片段
- 对于包含许多登录号 id 的长表,包括表头和表尾。
推理
- 为了加速推理,我们假设某些登录号 id 为次要类型,如
cath、alphafold、cellosaurus、chembl、dbgap、igsr、pfam、reactome和refseq。这是根据合成标签的统计信息得知的,其中它们主要为次要类型。 - 当给定文章在数据可用性(或类似)部分含有 DOI 引用,或者主要 DOI 概率之和大于 0.8 时,我们移除了登录号 ID。
- 我们使用了级联推理方法:最初使用微调后的 Qwen-2.5-14B 模型进行类型分类,然后将不确定的示例(50% 的 DOI 案例 + 20% 的登录号案例)路由到微调后的 Qwen-2.5-32B 模型。最后,前 10% 最困难的预测由微调后的 Qwen-2.5-72B 处理。
链接:
推理 notebook https://www.kaggle.com/code/conjuring92/mdc-a12-mdc-pipeline 训练脚本 https://github.com/rbiswasfc/mdc-4th-place-solution特别感谢 @mccocoful 在竞赛期间分享宝贵的见解,以及 @rdmpage 为改进数据集标签所做的出色工作!