返回列表

11th place solution

386. Tweet Sentiment Extraction | tweet-sentiment-extraction

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

第11名解决方案

作者: Psi
排名: 11 / 1812
发布时间: 2020-06-17

非常感谢 Kaggle 举办这次比赛!这是一段非常有趣但也非常累人的旅程,我很高兴实现了我获得单人金牌的目标!

数据

正如我们所见,数据中存在相当多的噪声。许多人发现了处理它的预处理或后处理技术。其他人则对模型进行了非常巧妙的改进来解决它。我个人认为数据中实际上存在两种类型的问题。让我们讨论以下示例:

That's awesome!!! --> s awesome!

  1. 让我们首先关注第二个选中的词 awesome!。在这里,我们可以看到单词结尾(特殊)字符的选中方式存在巨大差异。我认为这是由于人类标注者有不同的偏好,属于数据中真实的噪声。我个人不太确定是选中所有的感叹号、只选一个,还是不选。因此,数据中存在差异对我来说是很自然的。

  2. 不幸的是,数据中似乎还存在一种形式的泄漏(见第一个词)。当数据第一次被修复时,我们得知标注服务只提供了索引,但他们自己做了一些预处理。我们得知转义 HTML 标签导致了索引的偏移。不幸的是,这并不是他们做的唯一事情,他们显然还将多个空格替换为单个空格,这再次导致 Kaggle 使用了错误的索引。

我个人认为第一种情况很有建模价值,而第二种情况是基于前期数据处理错误造成的。我很早就发现了第二个问题,但就是找不到可靠的方法来找到有效的预处理手段。我不认为这是一个一致的错误,因为它并不总是发生,例如从中性数据中可以看出,如果你选择全文,你会得到一个很好的基线。很多时候如果开头有空格,选中的文本仍然是全文。所以可能也有两种或更多的标注过程在起作用,有些是正确的,有些则不是。但我就是没能完全弄清楚。

分词

我决定专注于分词来解决其中一些问题。使用默认的 Roberta 分词,你总是只能预测 !!!,因为这些标记被合并成了一个。这严重限制了你的模型学习这里的噪声和差异的能力,如果大多数人选择单个感叹号,你将无法预测它,除非你做一些后处理。不过,我所做的是修改分词的 merges.txt 文件。例如,这个文件中有一行 !! !,这意味着那些后续的字符跨度总是被合并为一个标记。我开始删除所有带有句点和感叹号的行,并在 CV 上获得了很大的提升。最后,我删除了所有特殊字符的合并:

f = open("merges12.txt", 'w')
for line in open("merges.txt"):
    cols = line.strip().split()
    if cols[0] == "Ġ":
        if cols[1].isalpha() or len(cols[1]) == 1:
            f.write(line)
    elif cols[0].isalpha() and cols[1].isalpha():
        f.write(line)

我在一个单独的帖子中写了更多相关内容:https://www.kaggle.com/c/tweet-sentiment-extraction/discussion/159364,欢迎尝试:https://www.kaggle.com/philippsinger/roberta-base-squad2

通过这样做,我试图提高我在给定分词下对原始选中文本获得的 Jaccard 分数,开箱即用的效果并不完美。你可以删除任意多的合并,甚至可以得到 1.0 的 Jaccard 分数,例如进一步删除像 Ġg onna 这样的合并,但这并没有提高我的分数,所以我坚持只处理特殊字符。

我相信我的方法非常擅长处理数据中的真实噪声(上面的第 1 点),但在处理人工噪声(上面的第 2 点)方面表现不佳。对人工噪声有帮助的是保持所有空格完整,这样模型可以稍微学习一下。但顶级解决方案通过额外的头部或后处理更好地处理了这个问题。

模型

我尝试了很多模型,但正如我们大多数人一样,Roberta base 效果就足够好了。我通过使用在 Squad2 上预训练的版本获得了一点提升。我的头部非常标准,除了我添加了一个我在 TF 竞赛 中读到的技巧:我将起始

同比赛其他方案