textmachine/eval/exp12_glossary_v2.py

141 lines
13 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""exp12 — пере-генерация глоссария (v2) по консенсусу двух флагманов + мои каллы.
Владелец делегировал «перегенерируй без меня». Источник рекомендаций: разборы GPT+Claude
(diag/reading/ОЦЕНКА_ФЛАГМАНА.md + вставка владельца). Высокая уверенность — где ОБА флагмана
сошлись; контестные (gu-род, культивация/совершенствование, Первопредок/Жэнь-Цзу) ПОМЕЧЕНЫ ⚑
для ратификации владельцем/оркестратором — НЕ финал.
Вход: guzhenren-seed.yaml (v1, 49 терминов). Выход: guzhenren-seed-v2.yaml + changelog.
НИЧЕГО не идёт в прод без ратификации + resnapshot. Оба файла ВНЕ git.
"""
from __future__ import annotations
import yaml
from pathlib import Path
BOOK = Path("/home/ubuntu/books/gu-zhenren")
SRC = BOOK / "guzhenren-seed.yaml"
OUT = BOOK / "guzhenren-seed-v2.yaml"
LOG = BOOK / "diag" / "glossary_v2_changelog.md"
# --- изменения существующих терминов: src -> (new_dst, forms|None, status|None, rationale, conf) ---
CHANGES = {
"空窍": ("апертура", ["апертуры","апертуре","апертуру","апертурой","апертуре"], "approved",
"оба флагмана — топ-проблема: «врата» ломают грамматику («одни врата»); «апертура» = фан-вики жанра", "HIGH"),
"开窍": ("открытие апертуры", ["открытия апертуры","открытию апертуры","открытием апертуры","открытии апертуры"], None,
"согласовано с 空窍→апертура; 开窍大典 = Церемония пробуждения/обряд открытия апертуры", "HIGH"),
"真元": ("истинная ци", ["истинной ци","истинной ци","истинную ци","истинной ци","истинной ци"], None,
"оба: НЕ «истинная энергия» (физикализм); отделить от 元气 (изначальная ци)", "HIGH"),
"元海": ("море истинной ци", ["моря истинной ци","морю истинной ци","морем истинной ци","море истинной ци"], None,
"согласовано с 真元→истинная ци", "HIGH"),
"本命蛊": ("жизненный гу", ["жизненного гу","жизненному гу","жизненного гу","жизненным гу","жизненном гу"], "approved",
"оба: НЕ «гу Жизни» (читается как ВИД, как «гу Надежды»); это СТАТУС. ⚑ род «гу» — см. флаг", "HIGH"),
"花酒行者": ("Странник Цветов и Вина", ["Странника Цветов и Вина","Страннику Цветов и Вина","Странника Цветов и Вина","Странником Цветов и Вина","Страннике Цветов и Вина"], "approved",
"оба: сохранить 花 (=блуд; злодей — насильник 采花大盗); «Винный Странник» терял половину смысла", "HIGH"),
"蛊虫": ("гу-червь", ["гу-червя","гу-червю","гу-червя","гу-червём","гу-черве"], None,
"«гу-тварь» пейоративно; «гу-червь» или просто «гу». ⚑ род «гу»", "MED"),
"元石": ("изначальный камень", ["изначального камня","изначальному камню","изначальный камень","изначальным камнем","изначальном камне"], None,
"«первокамень» → «двадцать первокамень» читается как «двадцать первый»; «изначальный» согласован с рядом 元", "MED"),
"古月山寨": ("селение Гуюэ", ["селения Гуюэ","селению Гуюэ","селением Гуюэ","селении Гуюэ"], None,
"«стан» = воинский лагерь; 山寨 здесь — укреплённое селение/деревня", "MED"),
"白家寨": ("селение Бай", ["селения Бай","селению Бай","селением Бай","селении Бай"], None, "согласовано", "MED"),
"熊家寨": ("селение Сюн", ["селения Сюн","селению Сюн","селением Сюн","селении Сюн"], None, "согласовано", "MED"),
}
# --- новые термины (были GAP → модель угадывала) ---
ADDITIONS = [
dict(src="长生", dst="бессмертие", type="term", forms=["бессмертия","бессмертию","бессмертие","бессмертием","бессмертии"],
note="chángshēng; вечная жизнь/бессмертие — СКВОЗНАЯ тема книги; НЕ «долголетие» (провалили 5/8 вариантов)", conf="HIGH"),
dict(src="修炼", dst="культивация", type="term", forms=["культивации","культивации","культивацию","культивацией","культивации"],
note="xiūliàn; культивация/культивировать. ⚑ лит.альтернатива «совершенствование» (флагманы для издания) — владельцу", conf="MED⚑"),
dict(src="修行", dst="культивация", type="term", forms=["культивации","культивации","культивацию","культивацией","культивации"],
note="xiūxíng; практика культивации; согласовано с 修炼. ⚑ см. флаг", conf="MED⚑"),
dict(src="人祖", dst="Первопредок", type="name", forms=["Первопредка","Первопредку","Первопредка","Первопредком","Первопредке"],
note="Rénzǔ; говорящее имя (Праотец человечества). НЕ «Рен Зу» (англ.релей-ошибка романизации). ⚑ альт-имя «Жэнь Цзу» (Палладица) — владельцу", conf="MED⚑"),
dict(src="族长", dst="глава клана", type="title", forms=["главы клана","главе клана","главу клана","главой клана","главе клана"],
note="zúzhǎng; глава клана — НАД старейшинами; частая ошибка черновика «старейшина» рушит иерархию сцены", conf="HIGH"),
dict(src="家老", dst="старейшина", type="title", forms=["старейшины","старейшине","старейшину","старейшиной","старейшине"],
note="jiālǎo; старейшина клана; 学堂家老 = старейшина академии. Развести с 族长", conf="HIGH"),
dict(src="困境", dst="Беды", type="term", forms=["Бед","Бедам","Беды","Бедами","Бедах"],
note="kùnjìng; стая зверей в легенде о Первопредке; «Беды»/«Невзгоды» живее абстрактных «Трудностей» как имя стаи", conf="MED"),
dict(src="炼化", dst="очистить и подчинить", type="term", invariant=True,
note="liànhuà; очистить-и-подчинить живого гу; НЕ «переплавить» (слишком металлично). Кратко «очистить»", conf="MED"),
]
# ⚑ ТОП-ФЛАГ (не применяю молча): род «гу».
GU_GENDER_FLAG = ("⚑ РОД «гу»: сид держит НЕСКЛОНЯЕМЫЙ СРЕДНИЙ; оба флагмана рекомендуют МУЖСКОЙ "
"(«этот гу», как «жук»; согласуется с «винный червь — он»). Это меняет согласование во ВСЕХ "
"гу-именах — НЕ флипаю молча. В v2 «жизненный гу»/«гу-червь» даны в МУЖСКОМ как рекомендация; "
"решение по проекту — за владельцем/оркестратором.")
KEEP_FLAGS = [
"蛊师 → «гу-мастер» ОСТАВЛЕН (владелец хотел «Мастер Гу», но это конфликтует с титулом 蛊真人/«Мастер Гу»/«Преподобный Гу») — флаг владельцу.",
"甲乙丙丁 → «разряд А/Б/В/Г» ОСТАВЛЕН (Claude одобрил русификацию; лучше латиницы AD).",
"采花大盗 → рекомендация «похититель цветов» + СНОСКА при 1-м употреблении (эвфемизм изнасилования) — но сноски = отдельная задача бэкенда, не в сиде.",
]
def main():
data = yaml.safe_load(SRC.read_text(encoding="utf-8"))
terms = data["terms"]
changed, added = [], []
for t in terms:
s = t.get("src")
if s in CHANGES:
new_dst, forms, status, rat, conf = CHANGES[s]
old = t.get("dst")
t["dst"] = new_dst
if forms is not None:
t["decl"] = {"invariant": False, "forms": forms}
if status:
t["status"] = status
t["note"] = f"[v2:{conf}] {rat}. (было: «{old}»). " + t.get("note", "")
changed.append((s, old, new_dst, rat, conf))
for a in ADDITIONS:
entry = {"src": a["src"], "dst": a["dst"], "type": a["type"],
"decl": {"invariant": a.get("invariant", False), "forms": a.get("forms", [])},
"since_ch": 0, "status": "approved",
"note": f"[v2-NEW:{a['conf']}] {a['note']}"}
terms.append(entry)
added.append((a["src"], a["dst"], a["note"], a["conf"]))
OUT.write_text(yaml.dump(data, allow_unicode=True, sort_keys=False, width=200), encoding="utf-8")
# changelog
lg = ["# Глоссарий 蛊真人 — v2 (пере-курация по флагманам, exp12)", "",
f"Изменено: {len(changed)} · Добавлено: {len(added)} · Всего терминов: {len(terms)}",
"Источник: консенсус GPT+Claude (diag/reading/ОЦЕНКА_ФЛАГМАНА.md). ⚑ = контестно, за владельцем.",
"**НЕ финал, НЕ в прод без ратификации + resnapshot.**", "",
"## Изменённые термины", "",
"| src | было | стало | conf | почему |", "|---|---|---|---|---|"]
for s, old, new, rat, conf in changed:
lg.append(f"| {s} | {old} | **{new}** | {conf} | {rat} |")
lg += ["", "## Новые термины (были GAP — модель угадывала)", "",
"| src | dst | conf | note |", "|---|---|---|---|"]
for s, dst, note, conf in added:
lg.append(f"| {s} | **{dst}** | {conf} | {note} |")
lg += ["", "## Оставлено намеренно / флаги", ""]
lg.append(f"- {GU_GENDER_FLAG}")
for k in KEEP_FLAGS:
lg.append(f"- {k}")
lg += ["", "## Контестные каллы (⚑ — за владельцем)",
"- 修炼/修行 → **культивация** (твоё предпочтение) vs «совершенствование» (флагманы для издания).",
"- 人祖 → **Первопредок** (смысл, оба флагмана как минимум допускают) vs имя «Жэнь Цзу» (НЕ «Рен Зу»).",
"- род «гу»: **мужской** (рекоменд. флагманов) vs средний (текущий сид).",
"- 蛊师 «гу-мастер» vs «Мастер Гу» (конфликт с титулом книги)."]
LOG.write_text("\n".join(lg), encoding="utf-8")
print(f"v2 seed → {OUT}")
print(f"changelog → {LOG}")
print(f"изменено {len(changed)}, добавлено {len(added)}, всего {len(terms)}")
print("\nИзменения:")
for s, old, new, rat, conf in changed:
print(f" {s}: «{old}» → «{new}» [{conf}]")
print("Новые:")
for s, dst, note, conf in added:
print(f" {s} → «{dst}» [{conf}]")
if __name__ == "__main__":
main()