返回列表

bronze + magic = gold ~ 8th solution

386. Tweet Sentiment Extraction | tweet-sentiment-extraction

开始: 2020-03-23 结束: 2020-06-16 自然语言处理 数据算法赛
铜牌 + 魔法 = 金牌 ~ 第8名解决方案

铜牌 + 魔法 = 金牌 ~ 第8名解决方案

作者: iamcalculating
发布时间: 2020-06-17
比赛排名: 第8名

首先,感谢 Kaggle 举办这次比赛,并祝贺所有的获奖者!

其实我在比赛刚开始时就注意到了它,但直到最后一个月才开始真正着手工作。但这一个月对我来说其实太长了,因为我在10天内就很快耗尽了思路。更糟糕和令人沮丧的是,排行榜(LB)非常不稳定。我真的差点就要放弃了,直到有人在论坛上发帖说有一种“后处理魔法”。幸运的是,经过一天的努力钻研,我发现了这个魔法,并在2天内完善了它。

然而,在最后的两周里,我还是有点放弃了,转而去玩电脑和视频游戏。因为我预计到比赛结束时,金牌区会被0.73分的成绩淹没。而且会有严重的震动,我没有任何出色且稳健的思路。要真正确保金牌席位,基本上需要达到公开分0.74,我认为这对我来说是不可能的。

好吧,最终的结果对我来说还不错。这是我第一次获得单人金牌。如果我太努力并过度拟合排行榜,谁知道会发生什么呢。:)

魔法

我将用以下样本来解释这个魔法:

  • 's awesome' = 原始答案 = answer_
  • ' He`s awesome... Have you worked with him before? He`s a good friend.' = 原始文本 = text_
  • 'He`s awesome... Have you worked with him before? He`s a good friend.' = 无额外空格 = text
  • 'awesome' = 真实答案 = answer

其实理论非常简单,当原始文本中答案结束位置之前存在额外的空格时,就会发生偏移(噪声)。

假设 answer = text[s:e],那么 answer_ = text_[s:e+2]

代码其实也非常简单:

def post_processing(answer, text, text_):
    if len(text_) > 0:
        answer = answer.strip().lower()
        text = text.lower()
        p = find_(text_, "  ")
        q = find_(text, answer)
        if text_[0] == " " or 0 <= p <= q + len(answer) - 2:
            answer = text_[q:q + len(answer) + 2]
    return answer

我认为这至少有99%是正确的。当然也有一些例外,因为它们原本就是错的。

模型

我基本上只是融合了几个在架构和清洗方面有细微差别的模型。抱歉让你失望了。:)

  • 模型 1: 与那些高分的公开内核类似。唯一的区别是我移除了答案中所有的噪声和错误。公开 LB:0.716
  • 模型 2: 与模型 1 相同,除了我移除了 CNN 头部。公开 LB:0.714
  • 模型 3: 与模型 2 相同,除了我补全了噪声。例如,在上面的样本中,我会把答案改为 'He`s awesome'。公开 LB:0.714
  • 模型 4: 通过反转后处理魔法进行预处理,然后遵循与模型 1 相同的过程:公开 LB:0.719
  • 融合: 模型1 + 模型2 + 模型3 + 4.5*模型4:公开 LB:0.723
  • + 后处理:公开 LB:0.731 私有 LB:0.729

但是,如果我们去掉所有与魔法相关的东西,也就是说,移除预处理和模型4,我能得到多少分?

嗯,我可以告诉你,模型1 + 模型2 + 模型3:公开 LB:0.718。而且别忘了还有0.002的震动下调。(我认为这很幸运!)所以,认真地说,铜牌确实是一个乐观的估计。

我必须把预处理代码放在

同比赛其他方案