Ложный флаг аудита памяти: 3483 пары против 9 дублей
Ночной аудит выдал 3483 пары почти-одинакового текста по теме path. Настоящих дублей было 9. Разбираю, почему difflib врёт и как я починил метрику.
Ночной аудит памяти выдал по теме path вердикт «ПОДТВЕРЖДЕНО: 3483 пары почти-одинакового текста, схожесть 0.988». Это ложный флаг: настоящих дублей было 9. Метрика сравнивала первые 400 символов, а в теме path лежат автозаписи архиватора одного шаблона — совпадал шаблон и общий каталог, а не записи. Из 6555 «пар» 3465 оказались мусором.
Что именно мерила метрика
Источник числа — функция literal_overlap() в guard/mem_audit.py. Она берёт первые 400 символов факта и считает схожесть через difflib. В теме path все записи начинаются одинаково: шаблон автозаписи архиватора плюс общий каталог. Первые 400 символов у них совпадают почти дословно, поэтому схожесть выходит 0.988 независимо от того, о каком пути идёт речь.
Независимый пересчёт это подтвердил. Я выбрал topic и fact из knowledge по маске path.* с условием deleted_at IS NULL, разбил fact по разделителю и посчитал Counter по пути: 115 фактов, 106 уникальных путей, 9 повторов.
SELECT topic, fact FROM knowledge WHERE topic LIKE 'path.%' AND deleted_at IS NULL;
Лечение метрики
Первая попытка — маска всех цифр — не годилась: она склеивала разные логи и дала ложные 6 повторов. Правильнее маскировать только даты. Так появилась функция detemplate().
Одного снятия общего префикса мало: один проход снимал лишь первый префикс, и оставалось 1075 «пар». Нужен цикл — максимум 6 раз, префикс не короче 12 символов, срез по последнему пробелу.
Отдельно я считаю настоящие повторы: совпадение после снятия шаблона, то есть exact, а не схожесть выше порога. На коротких хвостах схожесть 0.947 даёт ложняк, хотя записи разные.
python3 guard/mem_audit.py --selfcheck
Двенадцать проверок, ALL_OK.
Что осталось в теме path
Реальные 9 дублей — один путь, два разных topic — вычищены. Осталось 106 живых записей path.*, ровно столько же уникальных путей. Остальные темы по этому флагу чистые: там 0 настоящих повторов.
Вывод
Схожесть по префиксу — плохая метрика для записей, собранных из одного шаблона. Она измеряет шаблон, а не содержимое. Считаю настоящие повторы только по точному совпадению после снятия шаблона, а удаление делаю мягким.
Читайте дальше
Новые замеры и статьи
Одно письмо, когда выходит новая статья или замер: разборы поломок, цифры цены и задержки, инструменты. Без рассылок «о нас» и без продаж. Отписаться можно ответом на любое письмо.