| from __future__ import annotations |
|
|
| from dataclasses import dataclass |
| from typing import Dict, List, Optional |
|
|
| from datasets import ClassLabel, DatasetDict, load_dataset |
|
|
| LABEL_TO_BINARY: Dict[str, int] = { |
| "pants-fire": 0, |
| "false": 0, |
| "barely-true": 0, |
| "half-true": 1, |
| "mostly-true": 1, |
| "true": 1, |
| } |
|
|
| BINARY_ID2LABEL: Dict[int, str] = {0: "FAKE", 1: "REAL"} |
| BINARY_LABEL2ID: Dict[str, int] = {"FAKE": 0, "REAL": 1} |
|
|
|
|
| @dataclass(frozen=True) |
| class DatasetConfig: |
| dataset_name: str = "liar" |
| text_field: str = "statement" |
| label_field: str = "label" |
| trust_remote_code: bool = True |
|
|
|
|
| def get_label_mappings() -> Dict[str, Dict]: |
| return {"id2label": BINARY_ID2LABEL, "label2id": BINARY_LABEL2ID} |
|
|
|
|
| def _normalize_label(label_value: object, label_names: Optional[List[str]]) -> str: |
| if isinstance(label_value, int): |
| if not label_names: |
| raise ValueError("Label is int but label names are unavailable.") |
| return label_names[label_value] |
| if isinstance(label_value, str): |
| return label_value |
| raise ValueError(f"Unsupported label type: {type(label_value)}") |
|
|
|
|
| def _map_to_binary_labels( |
| example: Dict, |
| *, |
| label_field: str, |
| label_names: Optional[List[str]], |
| ) -> Dict[str, object]: |
| label_text = _normalize_label(example[label_field], label_names) |
| if label_text not in LABEL_TO_BINARY: |
| raise ValueError(f"Unexpected label: {label_text}") |
| return { |
| "labels": LABEL_TO_BINARY[label_text], |
| "label_text": label_text, |
| } |
|
|
|
|
| def load_liar_dataset( |
| config: DatasetConfig = DatasetConfig(), |
| data_files: Optional[Dict[str, str]] = None, |
| ) -> DatasetDict: |
| if data_files: |
| dataset = load_dataset("csv", data_files=data_files, delimiter="\t") |
| else: |
| dataset = load_dataset( |
| config.dataset_name, |
| trust_remote_code=config.trust_remote_code, |
| ) |
|
|
| label_names: Optional[List[str]] = None |
| label_feature = dataset["train"].features.get(config.label_field) |
| if isinstance(label_feature, ClassLabel): |
| label_names = label_feature.names |
|
|
| dataset = dataset.map( |
| _map_to_binary_labels, |
| fn_kwargs={ |
| "label_field": config.label_field, |
| "label_names": label_names, |
| }, |
| ) |
|
|
| dataset = dataset.filter( |
| lambda ex: ex[config.text_field] is not None |
| and str(ex[config.text_field]).strip() != "" |
| ) |
|
|
| return dataset |
|
|