141 lines
13 KiB
Python
141 lines
13 KiB
Python
#!/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 одобрил русификацию; лучше латиницы A–D).",
|
||
"采花大盗 → рекомендация «похититель цветов» + СНОСКА при 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()
|