| name | dnv-chat-mining |
| description | Внутренний справочник по локальной обработке выгрузок Telegram-чатов DNV — merge → anonymize → filter → slice — в user/slices/ для верификации практики. Идемпотентно: дедуп по message-id, стабильные псевдонимы, монотонное покрытие. Всё остаётся в user/ (gitignored); наружу ничего не публикует. |
Локальная обработка выгрузок Telegram-чатов — внутренний справочник
Когда есть свежие выгрузки чатов, которые нужно переработать в практику,
прогоняешь их через локальную обработку (merge → anonymize → filter → slice)
в user/slices/, чтобы верификация могла считать практику по уникальным
псевдонимам. Всё остаётся в user/ (gitignored). Наружу (в дайджест)
ничего не идёт — это делает мейнтейнер отдельно (build_digest.py), не эта
обработка.
Когда применяется
- Нужны свежие экспорты Telegram (JSON, Telegram Desktop) в
user/. Нет
экспортов — скажи, как выгрузить (ниже), и не начинай.
- Это опциональный шаг. Без него верификация и синтез работают на
опубликованном дайджесте, помечая сниженную полноту.
Определи окно догрузки
- Прочитай
knowledge_base/practice/LAST_COVERED_DATE — там одна строка с
ISO-датой, докуда покрыт опубликованный дайджест. Дату бери из файла;
здесь она намеренно не продублирована — записанный в текст справочника пример
устарел бы при первой же пересборке и разошёлся бы с файлом.
- Скажи пользователю: выгрузи чат от этой даты до сегодня (Telegram Desktop →
Export chat history → JSON). Перекрытие диапазонов не страшно — дедуп это
снимет (ниже).
Прогон обработки (всё под user/, path-containment)
Пути ввода/вывода — аргументы; вывод контейнится --allowed-root user.
Один экспорт — можно пропустить merge и сразу anonymize.
python engine/scripts/chat/merge_chat_dumps.py user/dump_old.json user/dump_new.json user/merged.json --allowed-root user
python engine/scripts/chat/anonymize_chat.py user/merged.json user/anon.json --salt-file user/.anon_salt --allowed-root user
python engine/scripts/chat/filter_chat.py user/anon.json user/filtered.json --allowed-root user
python engine/scripts/chat/slice_by_topic.py user/filtered.json user/slices all --allowed-root user
НИКОГДА не подавай сырой (не-анонимизированный) экспорт в filter/slice —
скрипты fail-closed это отвергнут, но и ты не делай. Порядок: anonymize → потом всё.
Идемпотентность
- Дедуп по стабильному
message-id в merge → перекрывающийся ре-импорт даёт
ноль новых (см. dedup= в отчёте).
- Стабильный салт (тот же файл между прогонами) → один
from_id всегда даёт
тот же псевдоним → подсчёт разных людей при верификации устойчив между
прогонами. Путь салта по умолчанию — <каталог output>/.anon_salt, то есть
для команды выше это user/.anon_salt. Передавайте --salt-file явно: с
дефолтом достаточно поменять путь вывода, чтобы молча создался новый салт —
и все псевдонимы разъедутся с прошлым прогоном.
- Покрытие монотонно: заметь максимальную дату сообщения в
user/filtered.json
и считай её новой «покрыто до». Повторная догрузка старого диапазона не
откатывает покрытие и не плодит дублей.
Приватность
user/anon.json, user/filtered.json, user/slices/, user/.anon_salt,
сырые экспорты — всё gitignored, остаётся локально.
- В опубликованное дерево из этой обработки ничего не уходит. Псевдо-ключи и
сырой текст не покидают
user/.
Выход
user/slices/topic_*.json (обезличенные) для верификации практики.
«Telegram = мнение, не закон.»