94 lines
6.2 KiB
Python
94 lines
6.2 KiB
Python
#!/usr/bin/env python3
|
||
"""АУДИТ ТИПОВ 36а — grader 0 (author). Rubric-based adjudication of the branch-relevant rows.
|
||
name/place = proper noun -> transliterate; title = office/rank/honorific -> translate;
|
||
term = common noun/concept/realia -> translate (or established realia translit); nickname = epithet.
|
||
BRANCH-HARM (36а) = realia/common-noun mis-typed name/place AND dst came out transliterated."""
|
||
from parse_common import parse_bankstop
|
||
bs=parse_bankstop()
|
||
|
||
# adjudicated true class for rows where I judge type WRONG (high confidence). Others assumed OK.
|
||
# format: src -> (adjudicated_class, note)
|
||
ADJ = {
|
||
# ---- 36а BRANCH-HARM: realia typed name -> transliterated ("too Sinicized") ----
|
||
"元石": ("term","realia: mined mineral (灵泉产出大量元石); name->юаньши = 36а harm"),
|
||
"元海": ("term","realia: internal energy-sea (元海未开); name->Юаньхай = 36а harm; inconsistent w/ 真元海=term"),
|
||
# ---- name mis-typed, but branch benign (terminologist translated anyway) ----
|
||
"古月山寨": ("place","山寨=settlement; name->place; dst translated поселение"),
|
||
"古月族长": ("title","族长=clan chief=title; name->title; dst translated глава клана"),
|
||
# ---- place mis-typed onto common nouns/concepts (benign: translated) ----
|
||
"地下溶洞": ("term","common noun 'underground cave'"),
|
||
"宗祖祠堂": ("term","common noun 'ancestral hall'"),
|
||
"山寨": ("term","common noun 'mountain stronghold'"),
|
||
"池塘": ("term","common noun 'pond'"),
|
||
"灵泉": ("term","common-noun realia 'spirit spring'"),
|
||
"竹楼": ("term","common noun 'bamboo house'"),
|
||
"蛊室": ("term","common noun 'gu chamber'"),
|
||
"酒肆": ("term","common noun 'tavern'"),
|
||
"光阴之河": ("term","poetic concept 'River of Time', not a geographic place"),
|
||
"赤脉": ("term","clan sub-lineage 'Red lineage', not a place"),
|
||
"赤之一脉": ("term","clan sub-lineage, not a place"),
|
||
# ---- title mis-typed onto idiom/kinship ----
|
||
"物是人非": ("term","chengyu/idiom, not a title"),
|
||
"舅母": ("term","kinship term 'maternal aunt', not a title"),
|
||
"舅父": ("term","kinship term 'maternal uncle', not a title"),
|
||
}
|
||
# BORDERLINE (grader-disagreement plausible; EXCLUDED from mis-type numerator, reported separately)
|
||
BORDER = {
|
||
"人祖": "myth 'Human Ancestor' — name vs title/term; TL waffled Прародитель<->Жэньцзу (near-harm)",
|
||
"古月一族":"clan collective — name vs term",
|
||
"古月师": "古月 clan + 师 — person-name vs role",
|
||
"沈嬷嬷": "嬷嬷=matron title + surname — name vs title",
|
||
"家主阁": "'clan-head pavilion' — place vs term",
|
||
"花海": "'sea of flowers' — descriptive place vs term",
|
||
"熊家寨": "named settlement — place ok-ish",
|
||
"白家寨": "named settlement — place ok-ish",
|
||
"咏梅": "poem title (work-title subtype of title)",
|
||
"江城子": "cí tune-name; work-title; TL transliterated Цзянчэнцзы (near-harm)",
|
||
"将敬酒": "poem title (work-title)",
|
||
"管家": "steward — title vs term",
|
||
"魔道巨擘":"'titan of demonic path' — title vs nickname",
|
||
"花酒行者":"villain epithet — nickname; TL transliterated (near-harm)",
|
||
"采花大盗":"euphemism epithet — nickname vs term",
|
||
}
|
||
|
||
def is_translit(dst):
|
||
core=dst.replace("«","").replace("»","").replace('"',"").strip().lower()
|
||
RU=set("камень море река гора гу мастер уровень ранг класс клан вождь глава поселение храм точка город "
|
||
"бронзовый бронзовое зелёный красный чёрный белый винный червь дом талант культивация океан истинной "
|
||
"сущности серийный насильник великий титан демонического пути жизни воспеваю сливу призыв матушка "
|
||
"камера зал апертура очистка сокровище клад чудесных редчайших десять ветвь странствующего сущность "
|
||
"энергия дух душа первый второй третий четвёртый пятый шестой седьмой восьмой девятый старейшина "
|
||
"наставник управляющий наложница ученик мешок церемония открытие прародитель дядя тётя брат отец мать "
|
||
"сын дочь господин госпожа поколения разряда способности качество отверстий пустотных изначального "
|
||
"подземная пещера крепость пруд духовный источник бамбуковый терем таверна павильон обитель пурпурная "
|
||
"все лица изменилось непредсказуемы ветер облака".split())
|
||
import re
|
||
toks=re.findall(r"[а-яё]+",core)
|
||
return bool(toks) and not any(t in RU for t in toks)
|
||
|
||
rows=list(bs.items())
|
||
N=len(rows)
|
||
mistyped=[(s,bs[s]["type"],ADJ[s][0],ADJ[s][1]) for s in ADJ]
|
||
harm=[]
|
||
for s,(cls,note) in ADJ.items():
|
||
r=bs[s]
|
||
if r["type"] in ("name","place") and cls in ("term","title") and is_translit(r["dst"]):
|
||
harm.append((s,r["type"],cls,r["dst"]))
|
||
|
||
print(f"=== TYPE AUDIT (grader 0 / author) over N={N} ===")
|
||
print(f" clear mis-types: {len(mistyped)} ({len(mistyped)/N*100:.1f}%)")
|
||
print(f" borderline (excluded from numerator): {len(BORDER)}")
|
||
print(f"\n === 36а BRANCH-HARM (realia/title typed name/place AND transliterated) : {len(harm)} ===")
|
||
for s,t,c,d in harm:
|
||
print(f" {s} type={t} -> true={c} dst='{d}'")
|
||
print(f"\n === all clear mis-types by recorded->true ===")
|
||
from collections import Counter
|
||
dirs=Counter((bs[s]['type'],ADJ[s][0]) for s in ADJ)
|
||
for (a,b),n in sorted(dirs.items(),key=lambda x:-x[1]):
|
||
print(f" {a:6s} -> {b:6s}: {n}")
|
||
print(f"\n mis-type rate by class (recorded):")
|
||
for cls in ("name","place","title","term","nickname"):
|
||
tot=sum(1 for s,r in rows if r['type']==cls)
|
||
mis=sum(1 for s in ADJ if bs[s]['type']==cls)
|
||
bor=sum(1 for s in BORDER if bs[s]['type']==cls)
|
||
print(f" {cls:8s}: {mis}/{tot} clear-mis ({mis/tot*100:.0f}%) +{bor} borderline")
|