diff --git a/eval/dovodka/dreif.py b/eval/dovodka/dreif.py index 3319a952..df6f048c 100644 --- a/eval/dovodka/dreif.py +++ b/eval/dovodka/dreif.py @@ -122,19 +122,36 @@ def measure(arm): 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): """Две величины: разных передач на термин и сколько терминов меняют форму МЕЖДУ главами.""" multi = 0 # термин показал >1 передачи за отрезок switched = 0 # доминирующая передача сменилась от главы к главе measured = 0 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: continue measured += 1 if len(allv) > 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: switched += 1 return {"terms_fired": len([t for t in fired if fired[t]]), "measured": measured,