443. Coleridge Initiative - Show US the Data | coleridgeinitiative-show-us-the-data
感谢 Coleridge 和 Kaggle 组织这次比赛,也祝贺其他获奖者和奖牌获得者。与标准的 Kaggle NLP 分类/回归任务相比,这是一次极具挑战性的比赛,我希望 Coleridge 能考虑赞助未来类似的比赛。我猜未来的迭代版本会解决这些小问题 :)
交叉验证策略:很明显,无法进行干净的本地验证。我在意识到其缺陷的同时使用了公开排行榜(Public LB)。
我在比赛的第一个月里致力于一种端到端的 Transformer 解决方案,尽量减少文本处理。然而,很明显,调整后的 Transformer 方法是有问题的——它们 a) 不适合我们要处理的长文档序列,即使是为此类文本设计的专用变体也是如此;b) 最终需要大量的预处理/后处理才能表现良好。我的处理启发式规则实际上变成了一个与主 Transformer 模型并行的模型。我开始思考如何简化这一点——
任何试图将语义上下文注入我的模型的尝试似乎都会降低公开排行榜的准确率。我怀疑标注过程存在噪声,因此决定仅通过标题来识别数据集。
学术论文中的数据集通常具有规则的结构——混合大小写单词后跟一个缩写。例如“巴尔的摩老龄化纵向研究 (BLSA)”。我需要比 Transformer 更轻量的东西来高效搜索它们——答案就是 Schwartz-Hearst 算法。Schwartz-Hearst 是一种非学习的字符串搜索算法,用于从文本中提取“长格式 (缩写)”形式的字符串——它基本上是一种更复杂的正则表达式搜索。使用该算法的一个好处是,我还可以使用给定数据集的缩写形式来获得额外的分数。
第三个洞察(或者说是假设?)是抓取数据是不必要的。我没有使用任何外部获取的数据集列表或抓取数据——我的感觉是,1) 数据集的正例不如负例有用,2) 甚至不清楚这些列表是否符合标注者所使用的数据集定义。
Schwartz-Hearst 在识别命名实体方面效果很好,但会有许多被标记的候选词并不是数据集(例如,组织名称、科学器材),因此我需要一个二分类器来过滤候选字符串。我根据 Schwartz-Hearst 从训练数据中识别出的示例,手工标注(使用我自己对数据集的判断)了一个小型的正例和反例训练语料库,并微调了一个 roberta-base 二分类器,使用该语料库过滤这些命名实体。我要再次强调,这个语料库完全由训练数据构建,没有任何抓取数据。
最后的难题是处理并非所有论文都使用完整的“长名称 (缩写)”格式来引用数据集这一事实。许多论文只引用了长格式。一个简单的解决方案是生成一个动态数据集表,并在文档中搜索长格式。我注意到,对搜索设置最小文档频率阈值可以提高公开排行榜分数。直觉是,在任何给定的文档语料库中,一个数据集可能被多个文档引用,因此它们被引用的频率越高,就越可能是命中而非虚假发现。
这种“搜索 + 分类”的方法大大减少了推理时间,因为我不必将整个文档通过 Transformer 模型传递。测试集上的推理耗时约 10 分钟,而使用端到端的 Transformer QA/NER 模型则远超 1 小时。
在 64 个文档中发现了“新加坡糖尿病纵向研究 (SLSD)”的长格式 (缩写) 字符串
Transformer 二分类器将“新加坡糖尿病纵向研究”分类为数据集,概率为 0.99,高于预测阈值 0.9
文档频率 64 超过了搜索阈值频率 50 —— 在所有文档中搜索长名称,发现另外 200 个文档包含该标签
对于这总共 264 个文档,添加长格式作为预测。此外,如果这 264 个文档中有任何文档包含字符串 ' SLSD '(根据原始文档文本检查),则添加缩写作为额外预测
注意:这是模型逻辑的摘要,我省略了应用的其他规则。