返回列表

10th place solution

386. Tweet Sentiment Extraction | tweet-sentiment-extraction

开始: 2020-03-23 结束: 2020-06-16 自然语言处理 数据算法赛
第10名解决方案

第10名解决方案

作者:Yauhen Babakhin (ybabakhin), Guanshuo Xu (wowfattie)
发布日期:2020-06-17

首先,感谢我的优秀队友 @wowfattie,这又是一段有趣的竞赛旅程。同时祝贺所有的获奖者!

在这篇文章中,我将简要描述我们在本次比赛中的历程,然后直接介绍我们最终的模型。

参赛动机

我加入这次比赛的时间比较晚(大约在截止日期前一个月)。考虑到这次比赛中存在的所有数据问题,这可能反而是一个优势。

我参加这次比赛的动机是让自己熟悉最近的NLP模型和方法。我上一次处理文本数据还是在Transformer时代之前。剧透预警:我并没有学到很多关于最新NLP趋势的知识

我阅读了Transformer和Bert类模型的基础理论。然后,通过 @abhishek 分享的代码和Youtube视频进行学习非常有帮助。再次感谢!基本上我所有的模型都是基于这段代码构建的。

数据特性(又名“魔法”)

在对初始的Roberta模型进行了一些调整后,我在公共排行榜上获得了0.714的分数。然后,我尝试删除了执行 " ".join(text.split()) 操作的预处理步骤,出乎意料的是,公共LB分数跃升至0.716。

这大约是在“魔法”帖子被分享的时候。因此,我决定深入研究空间分布中隐藏了什么。结果发现,大部分标签噪声都可以通过文本中的额外空格来解释。

首先,感谢 @maxjon 创建了原始数据集和Kaggle数据集之间的对应数据集。我仍然不确定这个数据特性遵循的确切规则,但以下是我们最常见的发现:

  • 额外的空格可能来自原始推文文本,或者来自原始数据集中被删除的 @提及
  • 实际标签的起始位置向左偏移了额外空格的数量
  • 实际标签的结束位置也向左偏移了额外空格的数量,但随后向右偏移了2个字符

似乎最初的标注是在经过 " ".join(text.split()) 预处理的情况下进行的,这导致了实际文本中标签的偏移。也许其他人可以对此有更深入的解释。例如,(空格被替换为 |):

# 原始数据集文本:
"@blueskiesxj||i|like|yours|too|||i|enjoy|your|photography.|=]"

# Kaggle数据集文本:
"||i|like|yours|too|||i|enjoy|your|photography.|=]"

所以,我们可以观察到推文开头有2个额外空格,中间有2个,总共4个。实际选中的文本可能是 "enjoy",而在数据集中它是一个偏移后的版本:"i enj"

最终模型

在发现这一点之后,问题从建模转变为如何正确利用这一数据特性。首先,我们构建了后处理方法,这使得单个5折Roberta模型在公共LB上达到了0.721。

然后,我们稍微改变了问题。首先,尝试在训练数据上逆转这种标签转换以获得更干净的标签。然后在干净的数据上拟合模型,并通过后处理将预测转换回有噪声的标签。这种方法使我们能够用5折Roberta模型获得0.723-0.724的公共LB分数。并且验证分数与排行榜紧密跟随。

我们解决方案的其他部分包括:

  • 使用交叉熵损失(起始和结束)和Lovasz损失的加权和进行跨度预测
  • 使用来自Sentiment140数据集的伪标签
  • 集成多个模型。我们最好的提交包括18个5折模型:8个Robertas;4个Electras;6个Berts Large

这使得我们获得了0.731的公共LB分数和0.728的私有LB分数。

总而言之,虽然我没有尝试很多新的NLP内容,但破解这个问题是一次不错的体验。

另外,我要感谢 hostkey 提供商给我提供了使用配备4x1080TIs机器的资助。这是一次流畅的体验,强烈推荐!

同比赛其他方案