veil-pgd / src /veil_pgd /util /labels.py
Klaus Clawd
Initial public release: VEIL-PGD v0.1
c793f45
Raw
History Blame Contribute Delete
1.1 kB
"""Label normalization shared by parsing + scoring."""
from __future__ import annotations
import json
import re
_ARTICLES = {"a", "an", "the"}
def normalize_label(text: str) -> str:
"""Lowercase, strip punctuation/articles, collapse whitespace."""
text = text.strip().lower()
text = re.sub(r"[^a-z0-9\s\-]", " ", text)
tokens = [t for t in text.split() if t and t not in _ARTICLES]
return " ".join(tokens)
def parse_label_json(raw: str) -> str | None:
"""Best-effort extraction of {"label": ...} from a model response."""
raw = raw.strip()
# Direct JSON.
try:
obj = json.loads(raw)
if isinstance(obj, dict) and "label" in obj:
return normalize_label(str(obj["label"]))
except json.JSONDecodeError:
pass
# Embedded JSON object.
m = re.search(r"\{.*?\"label\".*?\}", raw, re.DOTALL)
if m:
try:
obj = json.loads(m.group(0))
if "label" in obj:
return normalize_label(str(obj["label"]))
except json.JSONDecodeError:
pass
return None