cole / src /dataset /datasets_data.py
davebulaval's picture
v1
8fa3acc
from src.dataset.dataset import Dataset
from src.dataset.prompt_builder import PromptBuilder
from src.task import COLE_REPOSITORY_NAME
from src.task.task_names import Tasks
datasets = {
Tasks.ALLOCINE.value: Dataset(
name=Tasks.ALLOCINE.value,
description="Binary classification on sentiment analysis"
" of movie reviews, with reviews being either positive (1) or negative (0).",
possible_ground_truths=["0", "1"],
hugging_face_repo=COLE_REPOSITORY_NAME,
line_to_truth_fn=lambda line: line["label"],
line_to_prompt_fn=lambda line: PromptBuilder()
.add_premise("Cette phrase possède-t-elle un sentiment positif ou négatif ?")
.add_data(line["review"])
.add_end(
(
"Réponds "
"uniquement par 1 si la phrase est positive, réponds par 0 sinon. La réponse est :"
)
)
.build(),
line_to_data_fn=lambda line: line["review"],
),
Tasks.QFRCOLA.value: Dataset(
name=Tasks.QFRCOLA.value,
description="Binary grammatical judgement : "
"Predicts whether a sentence is grammatically correct (1) or not. (0).",
possible_ground_truths=["0", "1"],
hugging_face_repo=COLE_REPOSITORY_NAME,
line_to_truth_fn=lambda line: line["label"],
line_to_prompt_fn=lambda line: PromptBuilder()
.add_premise("Juge si cette phrase est grammaticalement correcte :")
.add_data(line["sentence"])
.add_end(
(
"Réponds avec seulement 1 si la phrase est grammaticalement correcte, 0 sinon. La réponse est :"
)
)
.build(),
line_to_data_fn=lambda line: line["sentence"],
),
Tasks.QFRBLIMP.value: Dataset(
name=Tasks.QFRBLIMP.value,
description="Choice task between two sentences : Choose the one which is grammatically correct.",
possible_ground_truths=["0", "1"],
hugging_face_repo=COLE_REPOSITORY_NAME,
line_to_truth_fn=lambda line: str(
line["label"]
), # The label is return as a string.
line_to_prompt_fn=lambda line: (
PromptBuilder()
.add_premise("Laquelle de ces phrases est grammaticalement correcte ?")
.add_data(f"Phrase 0:{line['sentence_a']}")
.add_data(f"Phrase 1:{line['sentence_b']}")
.add_end(
"Réponds avec seulement 0 si la phrase 0 "
"est grammaticalement correcte, et uniquement 1 si la phrase 1 est grammaticalement "
"correcte. La réponse est :"
)
.build()
),
line_to_data_fn=lambda line: {line["sentence_a"], line["sentence_b"]},
),
Tasks.GQNLI.value: Dataset(
name=Tasks.GQNLI.value,
description="Natural language inference task : "
"predict the relation between two sentences (implication, neutral, contradiction).",
possible_ground_truths=["0", "1", "2"],
hugging_face_repo=COLE_REPOSITORY_NAME,
line_to_truth_fn=lambda line: line["label"],
line_to_prompt_fn=lambda line: PromptBuilder()
.add_premise(
"Quelle est la relation de la deuxième phrase par rapport à la première ?"
)
.add_data(line["premise"])
.add_data(line["hypothesis"])
.add_end(
(
"Réponds uniquement par :\n"
"0 - si la deuxième phrase implique la première,\n"
"1 - si la relation est neutre,\n"
"2 - s'il y a contradiction.\n"
"Réponds uniquement par 0, 1 ou 2. La réponse est :"
)
)
.build(),
line_to_data_fn=lambda line: {
"premise": line["premise"],
"hypothesis": line["hypothesis"],
},
),
Tasks.SICKFR.value: Dataset(
name=Tasks.SICKFR.value,
description="Natural language inference task : "
"predict the relation between two sentences (implication, neutral, contradiction).",
possible_ground_truths=["0", "1", "2"],
hugging_face_repo=COLE_REPOSITORY_NAME,
line_to_truth_fn=lambda line: str(line["label"]),
line_to_prompt_fn=lambda line: PromptBuilder()
.add_premise("Détermine la relation entre les deux phrases suivantes :")
.add_data(f"Phrase A : {line['sentence_A']}\nPhrase B : {line['sentence_B']}")
.add_end(
"Réponds uniquement par 0, 1 ou 2 :\n"
"0 - si la deuxième phrase découle logiquement de la première,\n"
"1 - si leur relation est neutre,\n"
"2 - si les phrases se contredisent.\n"
"La réponse est :"
)
.build(),
line_to_data_fn=lambda line: {
"sentence_A": line["sentence_A"],
"sentence_B": line["sentence_B"],
},
),
Tasks.STS22.value: Dataset(
name=Tasks.STS22.value,
description="Semantic textual similarity task : "
"Predict how similar two sentences are to each other (1 to 4).",
possible_ground_truths=["1", "2", "3", "4"],
hugging_face_repo=COLE_REPOSITORY_NAME,
line_to_truth_fn=lambda line: str(line["score"]),
line_to_prompt_fn=lambda line: PromptBuilder()
.add_premise(
"À quel point les deux phrases suivantes sont-elles similaires ? Donne une note entière de 1 à 4."
)
.add_data(f"Phrase 1 : {line['sentence1']}\nPhrase 2 : {line['sentence2']}")
.add_end(
"Réponds uniquement avec un nombre entier entre 1 (aucune similarité) et 4 (équivalence parfaite). "
"La réponse est :"
)
.build(),
line_to_data_fn=lambda line: {
"sentence1": line["sentence1"],
"sentence2": line["sentence2"],
},
),
Tasks.PAWS_X.value: Dataset(
name=Tasks.PAWS_X.value,
description="Binary classification task : "
"Predict if two sentences have the same meaning (1) or not (0).",
possible_ground_truths=["0", "1"],
hugging_face_repo=COLE_REPOSITORY_NAME,
line_to_truth_fn=lambda line: line["label"],
line_to_prompt_fn=lambda line: PromptBuilder()
.add_premise(
"Les deux phrases suivantes veulent-elles dire la même chose, ou ont-elles des significations différentes ?"
)
.add_data(line["sentence1"])
.add_data(line["sentence2"])
.add_end(
(
"Réponds seulement 1 si les deux phrases ont la même signification, 0 sinon. La réponse est :"
)
)
.build(),
line_to_data_fn=lambda line: {
"sentence1": line["sentence1"],
"sentence2": line["sentence2"],
},
),
Tasks.PIAF.value: Dataset(
name=Tasks.PIAF.value,
description="Extractive question answering task : Extract a question's answer from a given context.",
possible_ground_truths=[],
hugging_face_repo=COLE_REPOSITORY_NAME,
line_to_truth_fn=lambda line: line["answers"],
line_to_prompt_fn=lambda line: PromptBuilder()
.add_premise(
"Tu vas recevoir un contexte suivi d'une question.\n"
"Ta tâche est d'extraire **mot pour mot** le passage du contexte qui répond le mieux à la question.\n"
"N'invente rien. Ne reformule pas.\n"
"Réponds **en copiant uniquement** un extrait exact du texte ci-dessus."
)
.add_data(f"Contexte : {line['context']}")
.add_data(f"Question : {line['question']}")
.add_end(
"Réponds uniquement par un passage extrait du contexte. La réponse est :"
)
.build(),
line_to_data_fn=lambda line: {
"context": line["context"],
"question": line["question"],
},
),
Tasks.FQUAD.value: Dataset(
name=Tasks.FQUAD.value,
description="Extractive question answering task : Extract a question's answer from a given context.",
possible_ground_truths=[],
hugging_face_repo=COLE_REPOSITORY_NAME,
line_to_truth_fn=lambda line: line["answers"],
line_to_prompt_fn=lambda line: PromptBuilder()
.add_premise(
"Tu vas recevoir un contexte suivi d'une question.\n"
"Ta tâche est d'extraire **mot pour mot** le passage du contexte qui répond le mieux à la question.\n"
"N'invente rien. Ne reformule pas.\n"
"Réponds **en copiant uniquement** un extrait exact du texte ci-dessus."
)
.add_data(f"Contexte : {line['context']}")
.add_data(f"Question : {line['question']}")
.add_end(
"Réponds uniquement par un passage extrait du contexte. La réponse est :"
)
.build(),
line_to_data_fn=lambda line: {
"context": line["context"],
"question": line["question"],
},
),
Tasks.XNLI.value: Dataset(
name=Tasks.XNLI.value,
description="Natural language inference task : "
"predict the relation between two sentences (implication, neutral, contradiction).",
possible_ground_truths=["0", "1", "2"],
hugging_face_repo=COLE_REPOSITORY_NAME,
line_to_truth_fn=lambda line: str(line["label"]),
line_to_prompt_fn=lambda line: PromptBuilder()
.add_premise(
"Quelle est la relation de la deuxième phrase par rapport à la première ?"
)
.add_data(rf"premise : {line['premise']}\n" f"sentence 2: {line['hypothesis']}")
.add_end(
(
"Réponds uniquement par :\n"
"0 - si la deuxième phrase implique la première,\n"
"1 - si la relation est neutre,\n"
"2 - s'il y a contradiction.\n"
"Réponds uniquement par 0, 1 ou 2. La réponse est :"
)
)
.build(),
line_to_data_fn=lambda line: {
"premise": line["premise"],
"hypothesis": line["hypothesis"],
},
),
Tasks.QFRCORE.value: Dataset(
name=Tasks.QFRCORE.value,
description="Definition matching task : "
"Match the Quebec expression with its definition from a list.",
possible_ground_truths=[str(i) for i in range(10)],
hugging_face_repo=COLE_REPOSITORY_NAME,
line_to_truth_fn=lambda line: str(line["correct_index"]),
line_to_prompt_fn=lambda line: PromptBuilder()
.add_premise(
f"Que veut dire cette expression québécoise « {line['expression']} » ?"
)
.add_data(
"\n".join(
f"{idx} - {definition}"
for idx, definition in enumerate(line["choices"])
)
)
.add_end(
(
"Réponds uniquement par l'index, débutant à zéro, "
"de la bonne définition parmi la liste ci-dessus. Par exemple, si la "
"troisième phrase correspond à l'expression, la réponse sera 2. La réponse est :"
)
)
.build(),
line_to_data_fn=lambda line: {
"expression": line["expression"],
"choices": line["choices"],
},
),
Tasks.QFRCORT.value: Dataset(
name=Tasks.QFRCORT.value,
description="Definition matching task : "
"Match the Quebec term with its definition from a list.",
possible_ground_truths=[str(i) for i in range(10)],
hugging_face_repo=COLE_REPOSITORY_NAME,
line_to_truth_fn=lambda line: str(line["correct_index"]),
line_to_prompt_fn=lambda line: PromptBuilder()
.add_premise(
f"Qu'est-ce que ça veut dire ce terme québécois « {line['terme']} » ?"
)
.add_data(
"\n".join(
f"{idx} - {definition}"
for idx, definition in enumerate(line["choices"])
)
)
.add_end(
(
"Réponds uniquement par l'index, débutant à zéro, "
"de la bonne définition parmi la liste ci-dessus. La réponse est :"
)
)
.build(),
line_to_data_fn=lambda line: {
"terme": line["terme"],
"choices": line["choices"],
},
),
Tasks.DACCORD.value: Dataset(
name=Tasks.DACCORD.value,
description="Paraphrase detection task :"
"Predict whether the two sentences are compatible (0) "
"or contradict each other (1).",
possible_ground_truths=["0", "1"],
hugging_face_repo=COLE_REPOSITORY_NAME,
line_to_truth_fn=lambda line: str(line["label"]),
line_to_prompt_fn=lambda line: (
PromptBuilder()
.add_premise("Détermine la relation entre les deux phrases suivantes :")
.add_data(f"Première phrase : {line['premise']}")
.add_data(f"Deuxième phrase : {line['hypothesis']}")
.add_end(
"Réponds uniquement par :\n"
"0 - si les deux phrases sont compatibles (elles expriment la même information ou sont cohérentes),\n"
"1 - s'il y a contradiction entre les deux phrases.\n"
"Réponds uniquement par 0 ou 1. La réponse est :"
)
.build()
),
line_to_data_fn=lambda line: {
"premise": line["premise"],
"hypothesis": line["hypothesis"],
},
),
Tasks.FRENCH_BOOLQ.value: Dataset(
name=Tasks.FRENCH_BOOLQ.value,
description="Binary question answering task : "
"Answer whether the context allows answering 'yes' to the question (1)"
"or, if the context only allows answering 'no' "
"to the question or does not answer the question. (0).",
possible_ground_truths=["0", "1"],
hugging_face_repo=COLE_REPOSITORY_NAME,
line_to_truth_fn=lambda line: str(line["label"]),
line_to_prompt_fn=lambda line: (
PromptBuilder()
.add_premise(
"Lis le passage suivant et réponds à la question en te basant uniquement sur le texte :\n"
"- Si le passage permet d'affirmer que la réponse à la question est oui, réponds 1.\n"
"- Sinon, si la réponse est non ou que le passage ne permet pas de répondre à la question, réponds 0."
)
.add_data(f"Passage : {line['passage']}")
.add_data(f"Question : {line['question']}")
.add_end("La réponse est :")
.build()
),
line_to_data_fn=lambda line: {
"question": line["question"],
"passage": line["passage"],
},
),
Tasks.MNLI_NINEELEVEN_FR_MT.value: Dataset(
name=Tasks.MNLI_NINEELEVEN_FR_MT.value,
description="Natural language inference task : "
"predict the relation between two sentences (implication, neutral, contradiction).",
possible_ground_truths=["0", "1", "2"],
hugging_face_repo=COLE_REPOSITORY_NAME,
line_to_truth_fn=lambda line: line["label"],
line_to_prompt_fn=lambda line: PromptBuilder()
.add_premise(
"Quelle est la relation de la deuxième phrase par rapport à la première ?"
)
.add_data(line["premise"])
.add_data(line["hypothesis"])
.add_end(
(
"Réponds uniquement par :\n"
"0 - si la deuxième phrase implique la première,\n"
"1 - si la relation est neutre,\n"
"2 - s'il y a contradiction.\n"
"Réponds uniquement par 0, 1 ou 2. La réponse est :"
)
)
.build(),
line_to_data_fn=lambda line: {
"premise": line["premise"],
"hypothesis": line["hypothesis"],
},
),
Tasks.RTE3_FRENCH.value: Dataset(
name=Tasks.RTE3_FRENCH.value,
description="Natural language inference task : "
"predict the relation between two sentences (entailment, neutral, contradiction)",
possible_ground_truths=["0", "1", "2"],
hugging_face_repo=COLE_REPOSITORY_NAME,
line_to_truth_fn=lambda line: str(line["label"]),
line_to_prompt_fn=lambda line: (
PromptBuilder()
.add_premise(
"Lis le texte suivant et détermine la relation de l'énoncé par rapport au texte."
)
.add_data(f"Texte : {line['premise']}")
.add_data(f"Énoncé : {line['hypothesis']}")
.add_end(
"Réponds uniquement par 0, 1 ou 2 :\n"
"0 - si l'énoncé découle logiquement du texte (entailment),\n"
"1 - si la relation est neutre,\n"
"2 - s'il y a contradiction.\n"
"La réponse est :"
)
.build()
),
line_to_data_fn=lambda line: {
"premise": line["premise"],
"hypothesis": line["hypothesis"],
},
),
Tasks.WINO_X_LM.value: Dataset(
name=Tasks.WINO_X_LM.value,
description=(
"Pronoun resolution task : predict the correct referent (1 or 2) "
"of a pronoun in a sentence by choosing between two candidates."
),
possible_ground_truths=["1", "2"],
hugging_face_repo=COLE_REPOSITORY_NAME,
line_to_truth_fn=lambda line: str(line["answer"]),
line_to_prompt_fn=lambda line: PromptBuilder()
.add_premise(
'Voici une phrase en anglais contenant le pronom "it" dans un sens ambigu et sa traduction en français.'
)
.add_data(f"Phrase (originale en anglais) : {line['sentence']}")
.add_data(
f"Traduction en français (le pronom est caché par '_' ) : {line['context_fr']}"
)
.add_data("À quoi renvoie ce pronom ? Voici les choix: ")
.add_data(f"1 : {line['option1_fr']}")
.add_data(f"2 : {line['option2_fr']}")
.add_end("Réponds uniquement par 1 ou 2. La réponse est :")
.build(),
line_to_data_fn=lambda line: {
"sentence": line["sentence"],
"translation": line["context_fr"],
"referent1": line["option1_fr"],
"referent2": line["option2_fr"],
},
),
Tasks.WINO_X_MT.value: Dataset(
name="wino_x_mt",
description=(
"Pronoun resolution based on translations: choose between two French translations of an English "
"sentence with an ambiguous pronoun. The goal is to identify which of the two translations uses "
"the correct pronoun (he or she) based on the correct referent."
),
possible_ground_truths=["1", "2"],
hugging_face_repo=COLE_REPOSITORY_NAME,
line_to_truth_fn=lambda line: str(line["answer"]),
line_to_prompt_fn=lambda line: PromptBuilder()
.add_premise(
"Voici deux traductions d’une phrase anglaise contenant un pronom ambigu :"
)
.add_data(f"Phrase originale : {line['sentence']}")
.add_data(f"Traduction 1 (avec '{line['pronoun1']}') : {line['translation1']}")
.add_data(f"Traduction 2 (avec '{line['pronoun2']}') : {line['translation2']}")
.add_end(
"Quelle traduction utilise le bon pronom en fonction du référent visé dans la phrase originale ?\n"
"Réponds uniquement par 1 si la traduction 1 est correcte, ou 2 si la traduction 2 est correcte.\n"
"La réponse est :"
)
.build(),
line_to_data_fn=lambda line: {
"sentence": line["sentence"],
"translation1": line["translation1"],
"translation2": line["translation2"],
"pronoun1": line["pronoun1"],
"pronoun2": line["pronoun2"],
},
),
Tasks.MULTIBLIMP.value: Dataset(
name=Tasks.MULTIBLIMP.value,
description="Choice task between two sentences : Choose the one which is grammatically correct.",
possible_ground_truths=["0", "1"],
hugging_face_repo=COLE_REPOSITORY_NAME,
line_to_truth_fn=lambda line: str(
line["label"]
), # The label is return as a string.
line_to_prompt_fn=lambda line: (
PromptBuilder()
.add_premise("Laquelle de ces phrases est grammaticalement correcte ?")
.add_data(f"Phrase 0:{line['sentence_a']}")
.add_data(f"Phrase 1:{line['sentence_b']}")
.add_end(
"Réponds avec seulement 0 si la phrase 0 "
"est grammaticalement correcte, et uniquement 1 si la phrase 1 est grammaticalement "
"correcte. La réponse est :"
)
.build()
),
line_to_data_fn=lambda line: {line["sentence_a"], line["sentence_b"]},
),
Tasks.FRACAS.value: Dataset(
name=Tasks.FRACAS.value,
description="Natural language inference task : "
"predict the relation between two sentences (implication, neutral, contradiction).",
possible_ground_truths=["0", "1", "2"],
hugging_face_repo=COLE_REPOSITORY_NAME,
line_to_truth_fn=lambda line: line["label"],
line_to_prompt_fn=lambda line: PromptBuilder()
.add_premise(
"Quelle est la relation de la deuxième phrase par rapport à la première ?"
)
.add_data(line["premise"])
.add_data(line["hypothesis"])
.add_end(
(
"Réponds uniquement par :\n"
"0 - si la deuxième phrase implique la première,\n"
"1 - si la relation est neutre,\n"
"2 - s'il y a contradiction.\n"
"Réponds uniquement par 0, 1 ou 2. La réponse est :"
)
)
.build(),
line_to_data_fn=lambda line: {
"premise": line["premise"],
"hypothesis": line["hypothesis"],
},
),
Tasks.MMS.value: Dataset(
name=Tasks.MMS.value,
description="A sentiment analysis task for classifying text as positive (2), negative (0), or neutral (1).",
possible_ground_truths=["0", "1", "2"],
hugging_face_repo=COLE_REPOSITORY_NAME,
line_to_truth_fn=lambda line: line["label"],
line_to_prompt_fn=lambda line: PromptBuilder()
.add_premise("Quel est le sentiment de cette phrase?")
.add_data(line["text"])
.add_end(
(
"Réponds uniquement par :\n"
"0 - si la phrase est négative,\n"
"1 - si la phrase est neutre,\n"
"2 - si la phrase est positive.\n"
"Réponds uniquement par 0, 1 ou 2. La réponse est :"
)
)
.build(),
line_to_data_fn=lambda line: {
"text": line["text"],
},
),
Tasks.WSD.value: Dataset(
name=Tasks.WSD.value,
description="Extractive word sense disambiguation : Extract an ambiguous word in a sentence.",
possible_ground_truths=[],
hugging_face_repo=COLE_REPOSITORY_NAME,
line_to_truth_fn=lambda line: line["label"],
line_to_prompt_fn=lambda line: PromptBuilder()
.add_premise(
"Tu vas recevoir une phrase contenant un mot ambigu ainsi que les étiquettes du 'part-of-speech tagging "
"(PoS)' pour chaque mot de la phrase. Le mot ambigu peut être un verbe ou un adjectif.\n"
"Ta tâche est d’indiquer **exactement** ce mot ambigu dans la phrase, sans rien ajouter ni reformuler.\n"
"Réponds uniquement avec le mot ambigu identifié."
)
.add_data(f"Phrase : {line['sentence']}")
.add_data(f"Part-of-speech tagging: {line['pos_tag_labels']}")
.add_end("La réponse est :")
.build(),
line_to_data_fn=lambda line: {
"sentence": line["sentence"],
"pos_tag_labels": line["pos_tag_labels"],
},
),
Tasks.LINGNLI.value: Dataset(
name=Tasks.LINGNLI.value,
description="Natural language inference task : "
"predict the relation between two sentences (implication, neutral, contradiction).",
possible_ground_truths=["0", "1", "2"],
hugging_face_repo=COLE_REPOSITORY_NAME,
line_to_truth_fn=lambda line: line["label"],
line_to_prompt_fn=lambda line: PromptBuilder()
.add_premise(
"Quelle est la relation de la deuxième phrase par rapport à la première ?"
)
.add_data(line["premise"])
.add_data(line["hypothesis"])
.add_end(
(
"Réponds uniquement par :\n"
"0 - si la deuxième phrase implique la première,\n"
"1 - si la relation est neutre,\n"
"2 - s'il y a contradiction.\n"
"Réponds uniquement par 0, 1 ou 2. La réponse est :"
)
)
.build(),
line_to_data_fn=lambda line: {
"premise": line["premise"],
"hypothesis": line["hypothesis"],
},
),
}
def preload_all_datasets():
"""Loads all datasets into cache for later usage"""
for dataset in datasets.values():
dataset.load_data()
def generate_metadata_dict():
"""Generates a dictionary with all the datasets metadata information"""
metadata_dict = {}
for dataset in datasets.values():
metadata_dict[dataset.name] = dataset.metadata
return metadata_dict