"""Load the Norma macronization/scansion benchmark. Two sources: hf (default) -- the canonical, actively-maintained release at https://huggingface.co/datasets/anonymous-stoicheia/norma. This now supersedes the old git-based copy: at time of writing it has 1378 macronize rows (614 test + 764 dev) vs the git copy's 932 (both dev and test folded into one file, disambiguated by split_manifest.json), plus the same 614 syllabify test rows. git -- a local checkout of an existing macronization project ($MACRONIZER_SRC), kept for exact reproducibility of numbers reported before the HF migration. Either way, load_norma() returns the same shape: {"test": [...], "dev": [...]}, each item a {"text": ..., "source": ..., "task": "macronize"|"syllabify"} dict, so callers don't need to know which source produced them. """ from __future__ import annotations import argparse import json import os from pathlib import Path HF_REPO = "anonymous-stoicheia/norma" def _load_git(src: Path) -> dict: lines = [json.loads(l) for l in open(src / "data/norma/test.jsonl", encoding="utf-8")] manifest = json.loads((src / "data/norma/split_manifest.json").read_text()) dev_idx = set(manifest["dev_line_indices"]) test = [d for i, d in enumerate(lines) if i not in dev_idx] dev = [d for i, d in enumerate(lines) if i in dev_idx] return {"test": test, "dev": dev} def _load_hf() -> dict: from huggingface_hub import hf_hub_download test_path = hf_hub_download(HF_REPO, "data/test.jsonl", repo_type="dataset") dev_path = hf_hub_download(HF_REPO, "data/validation.jsonl", repo_type="dataset") test = [json.loads(l) for l in open(test_path, encoding="utf-8")] dev = [json.loads(l) for l in open(dev_path, encoding="utf-8")] return {"test": test, "dev": dev} def load_norma(source: str = "hf", src: Path | None = None) -> dict: """source="hf" (default): pull the canonical release from the Hub, no local clone needed. source="git": read src/data/norma/{test.jsonl,split_manifest.json} from a local macron-data checkout (src defaults to $MACRONIZER_SRC).""" if source == "hf": return _load_hf() if source == "git": src = src or Path(os.path.expandvars(os.environ.get( "MACRONIZER_SRC", "$MACRONIZER_SRC"))) return _load_git(src) raise ValueError(f"unknown Norma source: {source!r} (expected 'hf' or 'git')") def add_norma_source_arg(ap: argparse.ArgumentParser) -> None: """Shared CLI flag so every Norma-consuming entry point takes the same option.""" ap.add_argument("--norma-source", choices=["hf", "git"], default="hf", help="where to load the Norma benchmark from (default: hf)")