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:
parent
2a63c3775c
commit
9181a3aa8f
1 changed files with 19 additions and 2 deletions
|
|
@ -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,
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue