* harvest_core.nnm_part_studio: студия из части строки «Перевод:» nnm
(«Дублированный (Невафильм)», «… - Jaskier»); раньше такие строки шли с
«(не указана)», и модель училась не извлекать студию даже из
«Дублированный (Пифагор)». tech-строки со студиями больше не
выбрасываются, если на странице нет строк «Аудио N» с именами.
* harvest_core.kz_title_rows: kinozal, студии из заголовка «ПМ (LostFilm,
HDrezka Studio)», которых нет на странице; вход — сегмент как у сервиса,
строка «Аудио Rus: … | Студия» — в audio_raw.
* tools/relabel_studios.py — то же по готовому labels.csv без пересборки
страниц; применено к data/labels.csv: со студией 22 061 -> 29 331 строк
(nnm +3 051, kinozal +4 219 строк в 3 007 релизах); prepare_data:
39 418 строк, спан студии 24 004 -> 31 214.
* e2e: эталон как aggregate — «тип без студии» убирается, если у типа есть
студия.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Пустая кодек-строка («Аудио 1: AC3, 6 ch, 384 kbps - Русский») снова
негатив: с -1 модель разучилась её отбрасывать и на nnm подменяла ею
строку «Перевод: …».
Пробное обучение (2 эпохи, ~34 мин на 27.9k страниц) e2e по 400 тестовых
страниц, P/R пар (тип, студия), текущие веса -> новые: nnm 0.872/0.879 ->
0.836/0.860, rutracker 0.891/0.917 -> 0.883/0.910, kinozal 0.720/0.844 ->
0.724/0.845. Новые веса не лучше текущих, models/segmenter не заменён.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Обучение:
* page_text/kinozal_text: текст kinozal = h1 + «Техданные» + «Релиз» из
data/raw/kinozal/*.json (в pages/kz-*.txt нет заголовка и «Техданных»,
откуда половина меток kinozal; сервис видит обе вкладки).
* label_page: позитив — raw или audio_raw; неразмеченная кодек-строка
русской дорожки («Аудио 3: … Русский (MVO, X)», «Аудио Rus: … | X»)
получает -1 и в обучение не идёт: как негатив она учила отбрасывать
кодек-строки. Сводка «Аудио: Русский, английский (…)» остаётся негативом.
Инференс (release):
* model_segments -> (основные, кодек); выбранные моделью кодек-строки идут
второстепенным источником вместе с правилом codec_segments; иноязычные
(«Казахский (Dub, …)», «English Dubbing», «Original») отбрасываются.
* merge_extra_tracks(adopt_type): кодек-дорожка с типом «неизвестно»
получает тип единственной дорожки страницы без студии.
e2e_segmenter: тот же текст kinozal, не больше E2E_MAX (400) страниц на
трекер, train-страницы только с --train-pages (меню парсит только тест).
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Конфликт в src/release.py: взяты original_info, lostfilm_release,
series_info и серии дорожек из advisor; сохранены same_studio,
merge_extra_tracks и codec_segments. Кодек-дорожкам тоже проставляются
серии.
Кодек-строки теперь подключаются, только если у какой-то дорожки страницы
нет студии: с новыми моделями безусловное подключение роняло precision
студий на rutracker (0.908 -> 0.793). С условием, test-сплит, по 300
релизов, студии P/R: rutracker 0.908/0.882 -> 0.840/0.900, nnm
0.875/0.915 -> 0.875/0.940, kinozal 0.816/0.845 -> 0.800/0.863. Тесты:
240 ok.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
С only_second токенизатор бросал исключение, если сама строка (до 220
символов) не помещалась в MAX_LEN и обрезать было нечего, кроме контекста.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
На kinozal во встроенном #tabs только «Техданные» («Перевод:» без студий),
а строки «Аудио N: … (MVO, LostFilm)» лежат во вкладке «Релиз», которую
страница грузит JS. Поэтому по URL определялись только типы без студий.
* fetch: для kinozal скачиваются вкладки showtab(id,N)
(get_srv_details.php?id=…&pagesd=N, кроме «Техданных» и «Скриншотов»)
и дописываются в #tabs; недоступная вкладка пропускается.
* release: кодек-строки с типом озвучки берутся правилом codec_segments
(сегментатор их отбрасывает — в разметке rutracker это не raw) и идут
второстепенным источником (source=codec / page+codec): только дорожки
со студией, дубли студии (same_studio) пропускаются, студия вписывается
в дорожку того же типа без студии. «English Dubbing» и т.п. не берутся.
* merge_title_tracks переведён на общий merge_extra_tracks.
e2e test rutracker без изменений (P 0.988 / R 0.982); train-страницы
P 0.975 -> 0.951. Тесты: 77 ok.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
- Docker: Dockerfile (CPU), compose с FlareSolverr, настройка через DUB_* переменные,
токен доступа к /predict, tools/pack_models.py, workflow Gitea Actions, docs/docker.md
- Модель грузится офлайн (config.json рядом с весами); общий код вынесен в src/spans.py,
сервису не нужны sklearn/matplotlib/pandas
- Обучение: профили tiny2/base/large/modern, запуски в models/runs, реестр и честное
сравнение на одной тестовой выборке (src/runs.py), пункт меню «Модели»
- Датасет: язык и аудио-параметры дорожек, 18+ по строкам «Аудио», ручные метки по ссылкам,
переиндексация сохранённого HTML, параллельная сборка, сбалансированная выборка
- Тексты страниц (data/pages) больше не хранятся в git
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>