Collapse variants that are merely shortened forms of one another: the stem match counted Gao Van and Gao Vany as two renderings where the text has one

This commit is contained in:
heaven 2026-09-03 00:19:08 +03:00
parent 2a63c3775c
commit 9181a3aa8f

View file

@ -122,19 +122,36 @@ def measure(arm):
return per_term, fired, bk return per_term, fired, bk
def collapse(variants):
"""Схлопнуть варианты, где один — лишь укороченная форма другого.
ЗАМЕРЕННАЯ ЛОЖНАЯ ТРЕВОГА, а не предосторожность. Сопоставление идёт по НАЧАЛУ слова
(падеж меняет хвост), и потому основа короткого варианта находится ВНУТРИ длинного:
· «Гао Ван» (основа «Гао В») находится в «Гао Вань» в тексте 82 вхождения ТОЛЬКО
«Гао Вань/Ваня/Ванем», «Гао Ван» отдельно не встречается ни разу;
· «женщина-гу蛊师» (основа «женщина-гу») находится в «женщина-гу-мастер».
Обе пары прибор объявлял дрейфом: 2 ложные тревоги из 12 (17%) на руке `p9-low`.
"""
out = []
for v in sorted(variants, key=len, reverse=True):
if not any(longer.lower().startswith(v.lower()[: max(4, len(v) - 2)]) for longer in out):
out.append(v)
return set(out)
def stats(per_term, fired): def stats(per_term, fired):
"""Две величины: разных передач на термин и сколько терминов меняют форму МЕЖДУ главами.""" """Две величины: разных передач на термин и сколько терминов меняют форму МЕЖДУ главами."""
multi = 0 # термин показал >1 передачи за отрезок multi = 0 # термин показал >1 передачи за отрезок
switched = 0 # доминирующая передача сменилась от главы к главе switched = 0 # доминирующая передача сменилась от главы к главе
measured = 0 measured = 0
for term, bych in per_term.items(): for term, bych in per_term.items():
allv = set().union(*bych.values()) if bych else set() allv = collapse(set().union(*bych.values())) if bych else set()
if not allv: if not allv:
continue continue
measured += 1 measured += 1
if len(allv) > 1: if len(allv) > 1:
multi += 1 multi += 1
doms = [sorted(v)[0] for ch, v in sorted(bych.items()) if v] doms = [sorted(collapse(v))[0] for ch, v in sorted(bych.items()) if v]
if len(set(doms)) > 1: if len(set(doms)) > 1:
switched += 1 switched += 1
return {"terms_fired": len([t for t in fired if fired[t]]), "measured": measured, return {"terms_fired": len([t for t in fired if fired[t]]), "measured": measured,