返回列表

2nd Place Solution [Updated]

666. Make Data Count - Finding Data References | make-data-count-finding-data-references

开始: 2025-06-11 结束: 2025-09-09 文献与知识发现 数据算法赛
第二名解决方案 [更新] - 寻找数据源

第二名解决方案 [更新]

副标题: 寻找数据源 :)

作者: Mohsin hasan (tezdhar) | 协作: NikhilMishra

发布时间: 2025-09-10 | 竞赛排名: 第 2 名

我们的竞赛解决方案可以分为 2 个阶段。

  • 第一阶段: 在论文中找到数据集(要么是数据集 DOI,要么是特定生物存储库的登录号 ID
  • 第二阶段: 分类给定数据源是 Primary(主要)还是 Secondary(次要)。

此外,对于每个阶段,我们分别为 DOI 和登录号 ID 开发了解决方案。(对于分类,单一模型方法对我来说不起作用)

对提供的真实标签中的数据集引用的分析暗示了某种自动获取数据集的过程。例如,在许多情况下,同一表格和存储库中的一些登录号被选中,而另一些则没有。这里的推测是正在使用某种 NER 模型,对其进行阈值处理会遗漏一些相关的登录号。同样,Dryad 数据集的 DOI 版本被包含在内,但未出现在论文中。
于是,寻找数据源/代码的 hunt 开始了。

第一阶段 - DOI

这里有 2 个相关数据源:

  1. 数据引用语料库数据文件 (https://doi.org/10.5281/zenodo.13376773) - v2 版本给了我们最好的验证分数。
  2. DataCite 公共数据文件 2024 (https://datafiles.datacite.org/)

正如数据引用语料库描述中提到的,它使用来自 datacite 的事件数据来构建语料库。因此,datacite 公共数据文件可以被视为数据引用语料库的超集。将数据引用文件与训练 article_ids 连接,可获得 DOI 的 100% 召回率。
为了提高精确率,基于对训练数据的观察,应用了以下预处理。

  1. 过滤掉来自这些存储库的数据集 -> figshare, cambridge crystallographic data centre, hepdata,因为它们在训练数据中被标记为 Missing
  2. 删除未出现在 PDF 或 XML 测试中的数据集 ID
    • 正则表达式 - re.compile("".join([ch + r"[\s]*" for ch in base_dataset_id.replace("https://doi.org/", "")]).strip(), re.IGNORECASE)
    • 去掉 Dryad 存储库数据集的版本标签 (.v1, .v2 .v3 等)

仅通过这些步骤,我们在训练数据上获得了 0.964 的验证分数(不考虑 type)。
第一阶段 DOI 分数

第一阶段 - 登录号 ID (Accession IDs)

登录号来自:https://europepmc.org/pub/databases/pmc/TextMinedTerms 如分支所示:https://github.com/Make-Data-Count-Community/corpus-data-file/tree/ks-data-dump-v4-eumpc。我认为有一个 PR 可以合并到主分支。

再次,将从这里下载的数据连接到训练数据可获得 100% 召回率。基于对训练数据的观察,似乎某些存储库被排除在训练标签之外 -> hgnc, gca, go, rrid。由于 hgnc, gca, go 的标识符中都有 :,其余带有 : 的存储库也被删除 ("chebi", "orpha", "rhea", "efo")。此外根据 PR,("ebisc", "hipsci", "omim", "eudract") 也被删除。我考虑根据 PR 删除 NCT,但没有这样做,因为它不是公共集的一部分。这会在私有集上带来 +0.003 的提升。

LB 探测实验表明它们对公共测试分数没有影响,但删除它们会使私有集提高 0.001。
当然,来自 eupmc 数据的 DOI 也被删除了。

最后,我们删除了存在 DOI 候选项的所有文章中的登录号,正如训练数据中所表明的那样。

这给我们带来了 29 个假阳性,其中 25 个是来自 10.1038_s41597-019-0101-ySAMN**。仔细查看 XML 似乎它们是在线表格的一部分。因此,我为此添加了一条规则(这在公共测试中提升了 0.003,在私有集上也提升了 0.004)
仅在线 SAMN

这为第一阶段的登录号提供了 0.98 F1(不考虑 type
登录号第一阶段分数

第二阶段启发式规则

在第一阶段规则之上,如果我们添加以下规则,我们在公共集上获得 0.869,在私有集上获得 0.739 (不需要模型即可获得金牌!)

  1. 登录号:SAMN 和 EMDB -> 主要 (Primary)
  2. DOI:如果根据 datacite 语料库在多篇论文中找到数据集,则按 publicationDate 排序后将第一篇标记为主要,其余为次要
  3. DOI:如果 article_id isSupplementTo dataset_id 根据 datacite 公共数据文件 -> 主要
  4. DOI:如果同一存储库(前 4 个字母)出现超过 4 次,或文章中数据集周围提到超过 4 个 DOI -> 次要

第二阶段 - DOI

Mohsin - DOI 分类

大部分时间花在创建分类上下文上 (<2048 tokens)。我从 datacite 公共数据文件映射了数据集作者和摘要。然后我通过提取论文的以下部分来整理上下文:

  1. 数据集 ID 正则表达式第一次匹配周围的上下文
  2. 整篇论文被分成 1024 字符的重叠块,然后我使用 BM25 相似度分数相对于数据集摘要获取前 3 个块。

模型 -> MedGemma-4B lora

添加此模型并删除除 isSupplementTo 之外的其他 DOI 规则,得到 0.880/0.784

Mohsin - 登录号分类

上下文工程:如果在表格 tag 中匹配 -> 获取表格行和标题 -> 使用表格 ID 在论文中找到第一次引用并获取额外上下文 -> 添加数据可用性部分 -> 回退到搜索 PDF 文本。

虽然 OOF 分数为 0.91,但 LB 分数明显较低。这表明存在一些错误或严重的过拟合。无法进一步研究。

一般评论 (Mohsin):

  1. 最初我花了太多时间在 NER 模型上,结果发现并不需要。
  2. 数据太少,无法训练稳定的分类模型。我开始从 Pubmed 下载开放获取语料库以收集更多数据,但致力于这个想法。

第二阶段分类模型 - Nikhil

问题陈述

主要挑战是数据集大小限制导致严重的模型不稳定:

  • 阈值不稳定 跨训练运行
  • 交叉验证中收敛不一致
    • 折 1:在第 2 个 epoch 收敛
    • 折 2:10 个 epoch 后未能收敛
    • 其余折显示类似的不一致性

数据源

训练标签:

  • 竞赛数据
  • RDMPage 数据(包括 Zenodo DataCite 语料库中缺失的标签)

模型架构

双模型方法

开发了两个专用模型:

  1. 登录号 ID 模型 - 用于识别登录号标识符
  2. DOI 模型 - 用于识别数字对象标识符

基础模型

microsoft/BiomedNLP-BiomedBERT-base-uncased-abstract-fulltext

稳定技术

1. Token 替换策略

  • 将所有非目标数据集 ID 替换为:"other dataset id"
  • 将目标数据集 ID 转换为:"Prediction {DATASET_ID}"
  • 目的: 集中模型注意力于正在分类的特定 ID

2. 超参数配置

  • Batch Size: 256 (异常大)
  • 影响: 显著提高了训练稳定性

3. 阈值优化

  • 使用多个随机种子运行模型
  • 平均折外 (OOF) 预测
  • 从平均结果中选择最佳阈值

上下文窗口配置

登录号 ID

  • 主要上下文: 300 个字符(ID 左右)
  • 附加特征:
    • 摘要文本
    • 补充信息
    • 参考文献部分

DOI

  • 主要上下文: 150 个字符(ID 左右)
  • 理由: DOI 在较大上下文中容易过拟合
  • 结果: 通过减少窗口提高了泛化能力

DOI 特定增强

1. 提及频率特征

  • 观察: 多次 DOI 提及与“主要”分类相关
  • 实现: 将提及计数添加为特殊 token
  • 示例: "More than 3 mentions"

2. 存储库信号

  • 见解: 存储库源提供分类信号
  • 存储库: Zenodo, Dryad 等
  • 实现: 将存储库名称 prepend 到上下文

3. 上下文构建示例

DOI Context = [Mention Token] + [Repository Token] + [Original Context]

示例:
"More than 3 mentions" + "Zenodo Repository" + [150 chars context]

关键成功因素

  1. 模型分离: 将登录号 ID 和 DOI 视为不同的问题
  2. 上下文优化: 不同类型的 ID 使用不同的窗口大小
  3. 特征工程: 利用元数据(提及、存储库)
  4. 稳定性 focus: 大批量大小和多种子平均
  5. Token 策略: 替换无关 ID 以减少噪声

结果

  • 稳定了跨折的模型性能
  • 一致的收敛行为
  • 通过平均提高了阈值可靠性
  • 通过减少上下文更好地泛化 DOI 分类

感谢竞赛主持人、组织者和所有 Kaggle 社区!一如既往,参加竞赛真是太棒了。

同比赛其他方案