data-use-annotate / build_gold_queue.py
rafmacalaba's picture
annotation review app (per-user queues, Hub-backed rulings, static-safe direct commit)
53ea208 verified
Raw
History Blame Contribute Delete
3.39 kB
#!/usr/bin/env python3
"""Build the gold-controls queue from local human-adjudicated spans.
Joins outputs/gliner_datause_v3_probe_human473.jsonl (key, set, surface)
to analysis/v24_sample_review/gliner2_review.jsonl
(spans[].key -> input passage, start/end, origin). Scores are the
singlepass infer-head H100 predictions
(outputs/gliner-datause-catchall-infer-probe/human473_predictions.jsonl);
truth labels are deliberately excluded (blind controls).
Splits: annotator190 (set=annotator) + jdc283 (set=jdc).
uv run python human_labeling/build_gold_queue.py [--out human_labeling/queue_human473.json]
"""
import argparse
import json
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parent))
from probe_labels import decide # noqa: E402
REPO = Path(__file__).resolve().parent.parent
HUMAN = REPO / "outputs" / "gliner_datause_v3_probe_human473.jsonl"
REVIEW = REPO / "analysis" / "v24_sample_review" / "gliner2_review.jsonl"
def main() -> None:
ap = argparse.ArgumentParser()
ap.add_argument("--out", default=str(REPO / "human_labeling" / "queue_human473.json"))
a = ap.parse_args()
# singlepass (infer-head) rescore, published H100 predictions; 23 of 473
# out-of-grid spans absent here -> head_score None, band "unscored"
SP = REPO / "outputs" / "gliner-datause-catchall-infer-probe" / "human473_predictions.jsonl"
sp = {}
if SP.exists():
for line in SP.read_text().splitlines():
if line.strip():
o = json.loads(line)
sp[o["key"]] = float(o.get("head_score"))
# review spans by key -> (passage, start, end, origin)
ctx: dict[str, tuple] = {}
for line in REVIEW.read_text().splitlines():
if not line.strip():
continue
row = json.loads(line)
for s in row.get("spans", []):
if s.get("key"):
ctx[s["key"]] = (row.get("input", ""), s.get("start"),
s.get("end"), row.get("origin"))
items: list[dict] = []
missing: list[str] = []
from collections import Counter
for line in HUMAN.read_text().splitlines():
if not line.strip():
continue
r = json.loads(line)
key = r["key"]
subset = "annotator190" if r.get("set") == "annotator" else "jdc283"
score = sp.get(key) # singlepass infer-head (H100); None = out-of-grid
if key in ctx:
passage, start, end, origin = ctx[key]
items.append({
"key": key, "surface": r.get("surface"), "ctx": passage,
"ctx_missing": False, "head_score": score,
"start": start, "end": end,
"band": decide(score, origin), "origin": origin,
"specificity": "", "split": "holdout",
"queue": "human473", "subset": subset,
"scored_by": "rafmacalaba/gliner-datause-catchall-infer-probe (H100)",
})
else:
missing.append(key)
Path(a.out).write_text("\n".join(json.dumps(i) for i in items) + "\n")
print(f"queued={len(items)} missing_ctx={len(missing)} "
f"scored={sum(1 for i in items if i['head_score'] is not None)} "
f"{Counter(i['subset'] for i in items)} -> {a.out}")
if missing:
print("missing:", missing[:5])
if __name__ == "__main__":
main()