README: метрики модели 02.11.2026 (test 4 377 строк, e2e по трекерам), размер датасета, kinozal-вкладки. dataset.md: размер снимка, колонки studio_source и audio_raw. architecture.md: кодек-строки как позитивы сегментатора, E2E_MODEL. collecting.md: tools/audit_tracks.py. training-windows.md: доразметка, сравнение кандидата и постановка в models/best и Docker. plan.md: шаг «аудит дорожек». Co-Authored-By: Claude Opus 5.5 <[email protected]>
11 KiB
Датасет
Откуда берётся
data/labels.csv — снимок датасета, собранного пайплайном
deepseek-harness/default-workspace/dataset.py: системный Chrome по CDP
обходит релизы трекеров, из страницы извлекается вкладка описания (kinozal),
пост (rutracker, nnm), регулярки разбирают строки дорожек, а имена авторов
канонизируются словарём алиасов. Метки автоматически сгенерированы
регулярками — модель учится воспроизводить эту разметку и обобщать её на
новые формулировки.
Размер (снимок 02.11.2026): 55 324 строки из 27 900 релизов, 3 источника
(rutracker, nnm, kinozal); HTML-дамп страниц — data/raw (~32 тыс. файлов, ≈2.6 ГБ, в git не
хранится), разобранные тексты — data/pages. Точные числа показывает «Статистика датасета» в
tools/collect.py (пункт 3) и отчёт reports/data_audit.md после prepare_data.
Ранние цифры этого документа (3286 строк) относились к первому снимку.
К строкам при подготовке добавляются аугментированные морфологические варианты
(«многоголосое», «дублированное» и т.п.). Файлы *_entries.csv / *_releases.csv — те же данные в нарезке
по источникам и по релизам; модель используется только labels.csv.
Колонки labels.csv
| Колонка | Смысл | Использование моделью |
|---|---|---|
source, release_id |
трекер и id релиза | группировка сплитов |
raw |
строка дорожки целиком (с префиксом «Перевод:»/«Аудио N:») | вход (после снятия префикса) |
translation_type |
тип озвучки | метка 1 |
studio |
автор («(не указана)» если нет) | метка 2 (спан в тексте) |
age_18, note |
флаг/пометка 18+ | метка 3 |
role_raw |
скобочная часть / конкретный тип из перечисления | вход для nnm tech-строк |
studio_source |
откуда взята строка: release / tech (описание релиза / техданные, в т.ч. nnm «Перевод:»), codec (кодек-строка «Аудио N: … (MVO, LostFilm)»), title (заголовок kinozal), audio (только строка «Аудио»), manual (ручная разметка) |
не используется; codec не попадает в словарь студий codec_line_rows |
audio_raw |
кодек-строка той же дорожки целиком | разметка строк для сегментатора |
остальные (ru_title, codec, …) |
контекст релиза | не используются |
Форматы входа по источникам
- rutracker:
raw= тело после «Перевод N:» («Профессиональный (двухголосый закадровый) tycoon»); несколько дорожек уже разнесены по строкам. - kinozal:
raw= строка целиком с префиксом («Перевод: Дублированный | HDRezka Studio»); префикс снимается при подготовке. - nnm: два вида строк — «Аудио N: Opus, 6 ch, 221 Kbps | Русский AVO
(Дмитрий Пучков)» (автор в скобках) и «Перевод: Одноголосый, многоголосый
закадровый» (одна строка на несколько дорожек; при подготовке вместо общей
rawберётсяrole_rawконкретной дорожки, чтобы одинаковый текст не получал разные метки).
Семантика translation_type (15 классов после пересборки; 14 в ранних моделях)
Составные метки «кто делал × сколько голосов». Набор классов не зашит в код: prepare_data берёт его
из данных (label_maps.json), поэтому модель, обученная до пересборки, знает 14 классов, а после —
ещё и люб. дубляж.
- префикс:
проф.(профессиональная),люб.(любительская),авт.(авторская), без префикса — в тексте не указано; - вид:
дубляж/дублированный,многоголосый,двухголосый,одноголосый(обычно закадровые),неизвестно.
Все «*неизвестно»-варианты объединены в неизвестно; типы «оригинал» и
«субтитры» (1–2 строки-проскока генератора) удалены.
Что изменено в разметке (парсеры tools/harvest/harvest_core.py, PARSE_VERSION = 3)
| Проблема в старых метках | Исправление |
|---|---|
Любительский дубляж («Любительский (дублированный) Red Head Sound», «псевдодублированный») размечался как проф. дубляж (644 из 720 строк) |
Новый класс люб. дубляж |
| Дубляж по имени студии: «многоголосый … Дубляжная», «Продубляж» получали тип «дубляж» | «дубляж» считается типом, только если это отдельное слово или «дублир…» |
| Несколько дорожек в одной строке с одной меткой («Профессиональный (двухголосый закадровый), авторский (одноголосый закадровый)»; 7.3% строк) | split_multi_rows: строка раскладывается на дорожки теми же правилами, что и сервис (src/html_extract._split_entries); «Многоголосый, профессиональный - LostFilm» остаётся одной дорожкой. Остатки старых данных prepare_data отбрасывает (счётчик в аудите) |
Язык почти не размечался (122 строки UKR, 47 ENG): kinozal сопоставлял «Перевод» только с русскими аудиодорожками, а в строках |Дубляж, Le Doyen| студия читалась как одно имя |
Сопоставление со всеми аудиодорожками; язык берётся из строки «Аудио»; src/trackinfo.parse_audio_line делит |Тип, Студия| |
| Дорожки, названные только в строках «Аудио» (украинский дубляж и т.п.) терялись | audio_only_rows: строки с блоком |…|, студией и определимым типом (оригинал, комментарии, источники вроде «Blu-ray CEE» не берутся) |
| Одни и те же короткие строки доминировали («Перевод: Дублированный» — 2727 копий) | prepare_data --max-dup (по умолчанию 40 копий одного текста и типа) |
| Дисбаланс классов | Веса классов в потерях типа: корень из обратной частоты, потолок 4 (--no-class-weights отключает; значение записывается в run.json) |
Для применения к уже собранным данным нужна переиндексация с пересчётом меток
(python tools/collect.py → пункт 2 → «Переиндексировать data/raw … y»): старые строки
labels.csv заменяются, копия прежнего файла сохраняется как data/labels.bak_<время>.csv.
Аудит (reports/data_audit.md) и что с находками сделано
| Находка | Обработка |
|---|---|
| Из 3286 строк уникальных текстов ~2000, 377+ строк повторяются в разных релизах | Сплиты группируются не только по релизу, но и по тексту — одинаковые строки не попадают одновременно в train и test |
| 26 «мусорных» studio («лицензия R5», «+ вставки», «x4», суффиксы «ненормативная лексика») | Считаются «автора нет»; суффиксы дополнительно чистятся в словаре алиасов |
| Слитые дорожки (одна строка = несколько типов) | nnm решается через role_raw; оставшихся противоречий — 0 |
| Спан автора не найден в тексте | 11 строк: автор в метке есть, но в тексте написан иначе; BIO-разметка для них пустая |
| 18+ | 156 строк (в 1 строке флаг есть только в note, в тексте не виден — недообучаемая) |
Словарь алиасов (src/studio_norm.py)
Порт STUDIO_ALIASES генератора датасета: «hdrezka studio»→HDrezka,
«read head sound»→Red Head Sound, «гаврилов»→Андрей Гаврилов, инициалы
«ю. сербин»→Юрий Сербин и т.д. Поиск спана автора в тексте пробует по
порядку: точное вхождение → алиасы → фамилия/инициалы → гибкий шаблон
«слова через произвольные кавычки/разделители» (ловит «Студия «Кравец»,
LostFilm» и «SDI Media | TV 1000»).