anli.py 2.42 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
"""
Adversarial NLI: A New Benchmark for Natural Language Understanding
https://arxiv.org/pdf/1910.14599.pdf

Adversarial NLI (ANLI) is a dataset collected via an iterative, adversarial
human-and-model-in-the-loop procedure. It consists of three rounds that progressively
increase in difficulty and complexity, and each question-answer includes annotator-
provided explanations.

Homepage: "https://github.com/facebookresearch/anli"
11
12
"""
import numpy as np
jon-tow's avatar
jon-tow committed
13
from lm_eval.base import rf, PromptSourceTask
Jonathan Tow's avatar
Jonathan Tow committed
14
from lm_eval.metrics import mean
15

16
17

_CITATION = """
18
19
20
21
22
23
24
25
26
27
28
29
30
@inproceedings{nie-etal-2020-adversarial,
    title = "Adversarial {NLI}: A New Benchmark for Natural Language Understanding",
    author = "Nie, Yixin  and
      Williams, Adina  and
      Dinan, Emily  and
      Bansal, Mohit  and
      Weston, Jason  and
      Kiela, Douwe",
    booktitle = "Proceedings of the 58th Annual Meeting of the Association for Computational Linguistics",
    year = "2020",
    publisher = "Association for Computational Linguistics",
}
"""
Leo Gao's avatar
Leo Gao committed
31

32

jon-tow's avatar
jon-tow committed
33
class ANLIBase(PromptSourceTask):
Leo Gao's avatar
Leo Gao committed
34
    VERSION = 0
Leo Gao's avatar
Leo Gao committed
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
    DATASET_PATH = "anli"
    DATASET_NAME = None
    SPLIT = None

    def has_training_docs(self):
        return True

    def has_validation_docs(self):
        return True

    def has_test_docs(self):
        return True

    def training_docs(self):
        if self.has_training_docs():
            if self._training_docs is None:
Jonathan Tow's avatar
Jonathan Tow committed
51
                self._training_docs = list(self.dataset["train_r" + str(self.SPLIT)])
Leo Gao's avatar
Leo Gao committed
52
53
54
55
            return self._training_docs

    def validation_docs(self):
        if self.has_validation_docs():
Jonathan Tow's avatar
Jonathan Tow committed
56
            return self.dataset["dev_r" + str(self.SPLIT)]
Leo Gao's avatar
Leo Gao committed
57
58
59

    def test_docs(self):
        if self.has_test_docs():
Jonathan Tow's avatar
Jonathan Tow committed
60
            return self.dataset["test_r" + str(self.SPLIT)]
Leo Gao's avatar
Leo Gao committed
61

Leo Gao's avatar
Leo Gao committed
62
63
64
65
66
67
    def aggregation(self):
        """
        :returns: {str: [float] -> float}
            A dictionary where keys are the names of submetrics and values are 
            functions that aggregate a list of metrics
        """
Jonathan Tow's avatar
Jonathan Tow committed
68
69
70
        return {
            "acc": mean
        }
Leo Gao's avatar
Leo Gao committed
71
72
73
74
75
76
77

    def higher_is_better(self):
        """
        :returns: {str: bool}
            A dictionary where keys are the names of submetrics and values are 
            whether a higher value of the submetric is better
        """
Jonathan Tow's avatar
Jonathan Tow committed
78
79
80
        return {
            "acc": True
        }
Leo Gao's avatar
Leo Gao committed
81

Jonathan Tow's avatar
Jonathan Tow committed
82

Leo Gao's avatar
Leo Gao committed
83
84
85
class ANLIRound1(ANLIBase):
    SPLIT = 1

Jonathan Tow's avatar
Jonathan Tow committed
86

Leo Gao's avatar
Leo Gao committed
87
88
89
class ANLIRound2(ANLIBase):
    SPLIT = 2

Jonathan Tow's avatar
Jonathan Tow committed
90

Leo Gao's avatar
Leo Gao committed
91
class ANLIRound3(ANLIBase):
Jonathan Tow's avatar
Jonathan Tow committed
92
    SPLIT = 3