Кухня: как это всё собрано

Здесь без прикрас: откуда данные, что делают скрипты и по каким формулам считаются метрики. Весь код открыт на GitHub.

6701
пакетов вопросов
436,454
вопросов
9,425
авторов
21,6 млн
кириллических слов

Откуда данные

Источник — публичный дамп базы вопросов ЧГК с gotquestions.online (наследник db.chgk.info). Один JSON на турнир/пакет, внутри — туры и вопросы:

pack
 ├─ tours[]
 │   └─ questions[]
 │        ├─ text        // текст вопроса
 │        ├─ comment     // авторский комментарий
 │        ├─ answer / source / zachet ...
 │        └─ authors[] { id, name, gender }   // id == профиль gotquestions.online/person/<id>

Ключевой факт: id автора в дампе совпадает с id его профиля на сайте, поэтому каждое имя на страницах кликабельно.

Как строится корпус автора

Три шага пайплайна

1

build_report.py → report.json

Два прохода по всем пакетам: сперва считаем объём корпуса на автора и отбираем тех, у кого ≥ 10 000 слов (357 авторов). Затем собираем их слова в хронологии и считаем главную метрику — число уникальных лемм в первых 25 000 словах (окно как у Иноземцева). У кого корпус меньше 25k — «бледный» ряд (148 надёжных из 357).

2

compute_features.py → report.json + coauthors/years/cliches.json

Тяжёлая часть, один проход + кэш. Считает фирменные слова (weighted log-odds), родственных авторов (tf-idf + косинус), граф соавторства, слово/имя/место года и штампы. Промежуточные счётчики кэшируются в _raw.pkl, так что перебор фильтров занимает секунды, а не минуты (пересчёт: --fresh).

3

build_site.py → 6 страниц

Вшивает JSON прямо в HTML: каждая страница самодостаточна (данные внутри файла, ничего не грузится с бэкенда). Общие тема, навигация и переключатель светлая/тёмная.

Фирменные слова: weighted log-odds

Не «самые частые» (у всех выйдет «который») и не «только у него» (это опечатки). Сравниваем частоту слова у автора и во всём остальном корпусе, со сглаживающим приором Дирихле (Monroe, Colaresi & Quinn, 2008). Итог — z-оценка «насколько надёжно слово отличает автора»:

δ = log( (yiw) / (ni−yi+…) ) − log( то же для «всех остальных» ) ;  z = δ / √(вариация)

Слова делим на темы (имена, фамилии, города, организации — по морфо-тегам pymorphy Surn/Name/Geox/Orgn) и стиль (нарицательная лексика). Подробнее — на странице Как считаем.

Остальные метрики коротко

Честные оговорки

Данные и профили авторов: база вопросов ЧГК gotquestions.online. Метод «фирменных слов» — weighted log-odds (см. Как считаем). Дизайн — тема Pac-Man.