63 lines
3.2 KiB
Python
63 lines
3.2 KiB
Python
#!/usr/bin/env python3
|
||
"""Пакеты для слепого суда РЕШАЮЩЕГО арма: один проход С МАНДАТОМ ПЕРЕВЁРСТКИ против связки.
|
||
|
||
⚠ Отличие от `judge_packets.py`, и оно принципиальное: здесь черновик в пакет НЕ кладётся.
|
||
В сравнении «full-regen против диффа» черновик был нужен как база отсчёта. Здесь он бы РАЗВАЛИЛ
|
||
СЛЕПОТУ: full-regen сохраняет 65% слов черновика, и судья опознал бы отредактированную версию
|
||
за секунду. Судья видит только исходник, глоссарий и две готовые версии.
|
||
|
||
Раскладка А/Б чередуется по чётности окна, ключ пишется отдельно и судьям не отдаётся.
|
||
"""
|
||
from __future__ import annotations
|
||
import json
|
||
import sys
|
||
from pathlib import Path
|
||
|
||
REPO = Path("/home/ubuntu/projects/textmachine")
|
||
RAW = Path.home() / "books" / "gu-zhenren" / "editor-harness"
|
||
OUT = RAW / "judge-reflow"
|
||
sys.path.insert(0, str(REPO / "eval" / "bank_arbitration"))
|
||
|
||
import editor_wire_probe as P # noqa: E402
|
||
from inject_probe import pick_windows # noqa: E402
|
||
|
||
|
||
OFFSET = {"dp": 0, "gl": 1, "lu": 0, "gr": 1}
|
||
|
||
|
||
def text_of(tag: str) -> str | None:
|
||
f = RAW / f"{tag}.json"
|
||
return json.loads(f.read_text(encoding="utf-8"))["content"] if f.exists() else None
|
||
|
||
|
||
def build(ms: str) -> int:
|
||
OUT.mkdir(parents=True, exist_ok=True)
|
||
key, n = {}, 0
|
||
for k, (_, src, terms) in enumerate(pick_windows()):
|
||
a_tag, b_tag = f"eh-{ms}-direct-reflow-w{k}", f"eh-{ms}-full-w{k}"
|
||
# ⚠ ФИКС 05.08: в прошлом раунде правило раскладки было ОДНО на все модели, из-за чего
|
||
# позиция и арм слиплись (арм в позиции А выиграл 12/12, в Б — 6/12). Здесь у каждой
|
||
# модели свой сдвиг, поэтому позиция не коррелирует с армом по набору.
|
||
if (k + OFFSET[ms]) % 2:
|
||
a_tag, b_tag = b_tag, a_tag
|
||
ta, tb = text_of(a_tag), text_of(b_tag)
|
||
if not ta or not tb:
|
||
print(f" w{k}: пропуск")
|
||
continue
|
||
gloss = "\n".join(f"- {t} → «{P.TERMS[t][0]}»" for t in terms)
|
||
(OUT / f"packet-{ms}-w{k}.md").write_text(
|
||
f"# Материалы для оценки перевода, окно {k}\n\n"
|
||
f"## Исходный текст (китайский)\n\n{src}\n\n"
|
||
f"## Утверждённый глоссарий (канонические формы обязательны)\n\n{gloss}\n\n"
|
||
f"## Версия А\n\n{ta}\n\n## Версия Б\n\n{tb}\n", encoding="utf-8")
|
||
key[f"w{k}"] = {"А": a_tag, "Б": b_tag}
|
||
n += 1
|
||
(OUT / f"KEY-{ms}.json").write_text(json.dumps(key, ensure_ascii=False, indent=1),
|
||
encoding="utf-8")
|
||
print(f"{ms}: пакетов {n}")
|
||
return n
|
||
|
||
|
||
if __name__ == "__main__":
|
||
for ms in (sys.argv[1:] or ["dp", "gl", "lu"]):
|
||
build(ms)
|