runic-reader-2 / code /prior_baselines.py
kesha-humonen's picture
Add files using upload-large-folder tool
ed46c5d verified
Raw History Blame Contribute Delete
1.38 kB
"""Image-blind baselines: the single training transliteration (translation) that minimizes the
average error (maximizes chrF++) on a sample of training items, applied to every test item."""
import json
import random
import sys
from collections import Counter
import sacrebleu
from rapidfuzz.distance import Levenshtein
ROOT = "/Users/humonen/runic_access"
rng = random.Random(0)
train = [json.loads(l) for l in open(f"{ROOT}/splits_local/mt_train.jsonl")]
out = {}
# recognition: medoid transliteration under CER
cands = [s for s, _ in Counter(r["src"] for r in train if len(r["src"]) >= 5).most_common(300)]
sample = rng.sample([r["src"] for r in train], 1500)
best = min(cands, key=lambda c: sum(Levenshtein.distance(c, s) for s in sample) / sum(len(s) for s in sample))
out["ocr_constant"] = best
# translation: per-language medoid translation under chrF++
chrf = sacrebleu.CHRF(word_order=2)
for lang in ("en", "sv"):
tr = [r["tgt"] for r in train if r["lang"] == lang]
cands = [t for t, _ in Counter(tr).most_common(200)]
cands += rng.sample(tr, 100)
sample = rng.sample(tr, 400)
best = max(cands, key=lambda c: chrf.corpus_score([c] * len(sample), [sample]).score)
out[f"mt_constant_{lang}"] = best
json.dump(out, open(f"{ROOT}/results/prior_baselines.json", "w"), ensure_ascii=False, indent=1)
print(json.dumps(out, ensure_ascii=False, indent=1))