386. Tweet Sentiment Extraction | tweet-sentiment-extraction
首先,感谢我的优秀队友 @wowfattie,这又是一段有趣的竞赛旅程。同时祝贺所有的获奖者!
在这篇文章中,我将简要描述我们在本次比赛中的历程,然后直接介绍我们最终的模型。
我加入这次比赛的时间比较晚(大约在截止日期前一个月)。考虑到这次比赛中存在的所有数据问题,这可能反而是一个优势。
我参加这次比赛的动机是让自己熟悉最近的NLP模型和方法。我上一次处理文本数据还是在Transformer时代之前。剧透预警:我并没有学到很多关于最新NLP趋势的知识。
我阅读了Transformer和Bert类模型的基础理论。然后,通过 @abhishek 分享的代码和Youtube视频进行学习非常有帮助。再次感谢!基本上我所有的模型都是基于这段代码构建的。
在对初始的Roberta模型进行了一些调整后,我在公共排行榜上获得了0.714的分数。然后,我尝试删除了执行 " ".join(text.split()) 操作的预处理步骤,出乎意料的是,公共LB分数跃升至0.716。
这大约是在“魔法”帖子被分享的时候。因此,我决定深入研究空间分布中隐藏了什么。结果发现,大部分标签噪声都可以通过文本中的额外空格来解释。
首先,感谢 @maxjon 创建了原始数据集和Kaggle数据集之间的对应数据集。我仍然不确定这个数据特性遵循的确切规则,但以下是我们最常见的发现:
似乎最初的标注是在经过 " ".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分数。并且验证分数与排行榜紧密跟随。
我们解决方案的其他部分包括:
这使得我们获得了0.731的公共LB分数和0.728的私有LB分数。
总而言之,虽然我没有尝试很多新的NLP内容,但破解这个问题是一次不错的体验。