Половина текста половины законов появляется после первого чтения. Проверил 2405 законопроектов
Что между первым и вторым чтением Госдумы. GPТimage. Дума: http://vote.duma.gov.ru/ (Источник 1); карточки законопроектов — https://sozd.duma.gov.ru/ (Источник 2); http://api.duma.gov.ru/ (Источник 3) — выгрузка и расчёты + 9 источников в конце поста.
Продолжение серии разборов поимённых голосований Госдумы. Этот пост — про то, что происходит с текстом закона между первым и вторым чтением, и про честную попытку это измерить.
Сразу оговорюсь про жанр. Здесь нет обвинений и нет «разоблачения». Есть измерение, у которого одна часть получилась, а вторая — нет, и обе я показываю. Отрицательный результат в конце поста мне самому нравится больше положительного.
Коротко для ЛЛ
Сравнил внесённую редакцию с редакцией ко второму чтению у 2405 законопроектов. Хотя бы один новый абзац появился у 1749 из них — это 72,7%.
У этих 1749 медианная доля нового текста в итоговой редакции — 52,8%. Половина текста написана после того, как палата проголосовала за концепцию.
Всего таких вставок 23 415. Там, где удалось разобрать таблицу поправок (10 978 вставок), решение комитета «принять» или «учтена» стоит у 93,1%.
Документированный случай смены предмета есть, и доказывает его не моя модель, а аннотация самой Думы: у законопроекта №1197680-7 она между чтениями стала длиннее на две новые темы.
А вот найти такие случаи автоматически не вышло. Разница между «прицепом» и обычной доработкой по смыслу текста статистически значима, но настолько мала, что порогом не разделяется. Показываю, как именно не вышло.
Что точно измеримо
Метод простой и его можно повторить. Беру два документа из карточки законопроекта: текст при внесении и текст ко второму чтению. Сравниваю абзац с абзацем (difflib, порог схожести 0,60). Если ни один абзац внесённой редакции не похож на абзац второй сильнее порога — считаю его новым. Вставки короче 120 знаков и шапку законопроекта не считаю: это почти всегда правка нумерации и реквизитов.
Обе редакции удалось извлечь у 2405 законопроектов. Результат:
хотя бы одна вставка — у 1749 из 2405, это 72,7%;
у этих 1749 медианная доля нового текста в финальной редакции — 52,8%, медианный рост объёма — ×1,32;
если считать по всем 2405, включая нетронутые, медиана доли вставок — 29,0%, рост — ×1,15.
Оговорка, без которой цифра врёт: доработка ко второму чтению — штатная процедура, и 72,7% сами по себе ничего плохого не означают. Уточнить формулировку, исправить отсылку, добавить переходное положение — это тоже новый текст. Здесь измерен факт появления текста, а не чей-то умысел.
Кто эти поправки вносит
Там, где таблицу поправок удалось разобрать построчно, — это 10 978 вставок по 687 законопроектам — расклад такой:
решение комитета «принять» или «учтена» — у 93,1% вставок;
среди авторов есть депутаты — у 66,2% вставок;
есть правительство — у 14,4%.
То есть поправки ко второму чтению почти не отклоняются, и вносят их в основном депутаты. Это, кстати, объясняет, почему стадия второго чтения так удобна: там нет отдельного голосования по каждой норме, таблицу принятых поправок голосуют целиком, одним нажатием.
Случай, который документирован
Законопроект №1197680-7 внесли в Кодекс об административных правонарушениях. Вот как его предмет описан в официальной аннотации к голосованию первого чтения 15 декабря 2021 года (Источник 1), дословно:
«О внесении изменений в Кодекс Российской Федерации об административных правонарушениях» (об установлении административной ответственности за совершение в интересах юридического лица сделок или финансовых операций с имуществом, полученным преступным путем)
Первое чтение прошло 365 голосами «за» при нуле «против» (голосование).
А вот аннотация к третьему чтению того же законопроекта, 4 марта 2022 года, дословно:
«О внесении изменений в Кодекс Российской Федерации об административных правонарушениях» (об установлении административной ответственности за совершение в интересах юридического лица сделок или финансовых операций с имуществом, полученным преступным путем, а также за публичные действия, направленные на дискредитацию использования Вооруженных Сил Российской Федерации, и за призывы к введению мер ограничительного характера в отношении Российской Федерации)
Между этими двумя строчками — 79 дней. Обратите внимание, что это не моя интерпретация и не результат работы модели: это описание одного и того же законопроекта самой Думой, до и после. Оно стало длиннее на две темы.
В тексте, который появился ко второму чтению, эта норма начинается так (Источник 2):
«Статья 20.33. Публичные действия, направленные на дискредитацию использования Вооруженных Сил Российской Федерации в целях защиты интересов Российской Федерации и ее граждан, поддержания международного мира и безопасности…»
Номер записан как «20.33», потому что в документе он со степенью; в кодексе номера такого вида пишут через точку.
Четыре голосования по законопроекту. Дума: http://vote.duma.gov.ru/ (Источник 1); карточки законопроектов — https://sozd.duma.gov.ru/ (Источник 2); http://api.duma.gov.ru/ (Источник 3) — выгрузка и расчёты.
Голосования по законопроекту №1197680-7. Источник — открытые поимённые голосования с официального сайта Государственной Думы: http://vote.duma.gov.ru/ (Источник 1); карточки законопроектов — https://sozd.duma.gov.ru/ (Источник 2); http://api.duma.gov.ru/ (Источник 3) — выгрузка и расчёты.
Как выглядит отклонённое 1-ое чтение. Дума: http://vote.duma.gov.ru/ (Источник 1); карточки законопроектов — https://sozd.duma.gov.ru/ (Источник 2); http://api.duma.gov.ru/ (Источник 3) — выгрузка и расчёты.
Пять отклонённых чтений. Дума: http://vote.duma.gov.ru/ (Источник 1); карточки законопроектов — https://sozd.duma.gov.ru/ (Источник 2); http://api.duma.gov.ru/ (Источник 3) — выгрузка и расчёты.
Как это прошло процедурно: таблицу принятых поправок голосовали 4 марта в 07:28 — 403 «за», 0 «против» (голосование). Третье чтение — в 07:31 того же дня, 407 «за», 0 «против» (голосование). Три минуты между ними.
Карточка со всеми редакциями и таблицей поправок открыта: sozd.duma.gov.ru/bill/1197680-7 (Источник 2). Оба текста лежат там, сравнить можно своими глазами.
А теперь про то, что не получилось
Дальше я хотел сделать очевидное: если такие случаи бывают, надо найти их все. В американской политологии это называют legislative hitchhikers — «попутчики»: норму цепляют к движущемуся законопроекту. Там факт вставки приходится восстанавливать по совпадениям текстов. У нас он зафиксирован документально, и казалось, что задача проще.
Гипотеза была такая: если норму прицепили, она должна быть смыслово дальше от предмета законопроекта, чем обычная доработка. Считаю для каждой вставки косинусное расстояние между её текстом и текстом внесённой редакции (модель BAAI/bge-m3), называю это «негерманностью». Контроль обязателен, иначе мерить не с чем: беру абзацы того же законопроекта, которые вставками не являются, и считаю то же расстояние для них.
Распределение негерманности вставок и контроля. Дума: http://vote.duma.gov.ru/ (Источник 1); карточки законопроектов — https://sozd.duma.gov.ru/ (Источник 2); http://api.duma.gov.ru/ (Источник 3) — выгрузка и расчёты.
Отличить «прицеп» от обычной доработки по смыслу текста не вышло. Источник — сравнение внесённых редакций и редакций ко второму чтению с карточек https://sozd.duma.gov.ru/ (Источник 2); расчёт — модуль src/insertion_germaneness.py, модель BAAI/bge-m3.
Результат честно отрицательный.
Разница есть, и она значима. Перестановочный тест на 10 000 перемешиваний: p = 0,0001. Вставки в среднем действительно чужероднее сохранённых абзацев.
Но разница мизерная. Медиана негерманности вставок — 0,394, контроля — 0,363. Разница средних +0,035. На картинке видно, что два распределения почти совпадают: порогом их не разделить, и любой «детектор прицепов» на этой мере будет ошибаться чаще, чем угадывать.
И главное — проверка на эталоне. У №1197680-7 одиннадцать вставок, и про них точно известно, что там смена предмета. Если мера работает, они должны сидеть в верхнем хвосте. В верхние 10% корпуса попала одна из одиннадцати. Остальные разбросаны по середине распределения: перцентили 84, 84, 74, 67, 64, 63, 57, 57, 55, 50.
До эмбеддингов я пробовал дешёвый структурный признак — «вставка упоминает другой кодекс или другой закон». На эталоне он сработал ноль раз из одиннадцати: статьи вставлены в тот же самый КоАП, который правит и внесённая редакция. Смена предмета внутри одного акта структурно неотличима от технической правки этого же акта.
Что из этого следует
Вывод получился не тот, которого я хотел, но он полезный.
Документ надёжнее модели. Момент вставки в российских данных не нужно угадывать — он записан в таблице поправок, с автором и решением комитета, а изменение предмета видно даже в аннотации к голосованию. Это сильная сторона наших открытых данных, и странно её не использовать.
Автоматически отранжировать 23 415 вставок по «чужеродности» пока нельзя. Мера ранжирует кандидатов, но не выносит приговор, и на единственном заведомо верном примере она почти промахнулась. Публиковать список «вот прицепные поправки», построенный на ней, было бы враньём, поэтому такого списка в посте нет.
Верхняя граница, которую мера всё же даёт: у 14,5% вставок расстояние до своего законопроекта такое же, как до случайно взятого чужого. Это потолок, а не оценка, и принимать его за число прицепов нельзя.
Чего эти числа не говорят
72,7% — это не «доля протащенного». Это доля законопроектов, где ко второму чтению появился новый текст. Штатная доработка считается наравне с чем угодно другим.
Выборка неполная. Сканированные PDF без текстового слоя (примерно 3% карточек) в извлечение не попадают вовсе — такие законопроекты выпадают молча, на этапе сбора.
У 87 законопроектов из 2405 в извлечённом тексте есть невалидные байты — след неатомарной записи при пересекающихся прогонах. Ошибка исправлена, но эти 87 посчитаны и перечислены в выводе модуля, а не выброшены без объявления.
Таблицу поправок удалось разобрать не везде — 687 законопроектов из 1749. Проценты по авторам и решениям комитета относятся только к разобранной части.
Один случай — это один случай. №1197680-7 показывает, что смена предмета между чтениями бывает и что она документируется. Про её частоту он не говорит ничего.
Другие разборы этой серии
Чтобы остановить закон в Думе, кнопку нажимать не нужно — про то, как законопроекты останавливают неучастием, а не голосами «против». Прямое продолжение этого поста: там про вход, здесь про то, что происходит внутри.
3857 принятых законов и ни одного, где голоса оппозиции меняли исход — арифметика порога в 226 голосов.
Не только запреты: разбор 2432 текстов законов — что вообще делают законы созыва, если читать их тексты.
Иноагенты и блокировки: кто из фракций как голосовал по 63 законам об информации — соседняя тема по предмету.
Дополнительные источники
Источник 1: поимённые голосования Государственной Думы, включая аннотации к каждому голосованию — http://vote.duma.gov.ru/
Источник 2: карточка законопроекта №1197680-7 со всеми редакциями и таблицей поправок — https://sozd.duma.gov.ru/bill/1197680-7
Источник 3: портал открытых данных Государственной Думы — http://api.duma.gov.ru/
Голосования по законопроекту: первое чтение 15.12.2021 · таблица поправок 04.03.2022 · третье чтение 04.03.2022
UPD:
ВЫВОДЫ
Между первым и вторым чтением текст закона меняется не эпизодически, а системно: у 72,7% из 2405 законопроектов появился новый текст, а у изменённых проектов медианно 52,8% итоговой редакции написано уже после первого чтения. При этом 93,1% разобранных вставок комитет рекомендовал принять или учесть.
Самый важный процедурный риск — смена предмета уже после одобрения концепции. Такой случай документирован самой Думой по №1197680-7: законопроект в первом чтении был про финансовые операции с преступным имуществом, а ко второму в него добавили ответственность за «дискредитацию» армии и призывы к санкциям. Автоматически находить такие «прицепы» по смысловой дистанции пока нельзя — модель на контрольном примере почти промахнулась.



















