Docker-сервис, выбор основы и сравнение моделей, сборщик датасета
docker / build (push) Failing after 39s
docker / build (push) Failing after 39s
- 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 <noreply@anthropic.com>
This commit is contained in:
1 parent
d155b8584b
commit
efc9a4f56a
411 files changed
+87495
-27363
No files matched your search
@@ -0,0 +1,61 @@
|
||||
"""Рабочие функции переиндексации (tools/collect.py → build / meta).
|
||||
|
||||
Вынесены в отдельный лёгкий модуль, чтобы их можно было запускать в процессах
|
||||
(multiprocessing на Windows импортирует модуль заново, поэтому здесь нет rich,
|
||||
интерфейса и состояния сборщика). Каждая функция получает и возвращает только
|
||||
простые данные.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
_ROOT = Path(__file__).resolve().parents[1]
|
||||
for _p in (_ROOT, _ROOT / "tools", _ROOT / "tools" / "harvest"):
|
||||
if str(_p) not in sys.path:
|
||||
sys.path.insert(0, str(_p))
|
||||
|
||||
import harvest_core as hv # noqa: E402
|
||||
import meta # noqa: E402
|
||||
from src.html_extract import html_to_text # noqa: E402
|
||||
|
||||
PARSERS = {"kinozal": hv.kz_parse, "rutracker": hv.rt_parse, "nnm": hv.nnm_parse}
|
||||
|
||||
|
||||
def build_one(task: dict) -> dict:
|
||||
"""Один релиз: метки (если нужны) и страница data/pages/<stem>.txt (если нужна).
|
||||
|
||||
task: site, json, html, parse (строить метки), known (уже размечен), page (куда писать
|
||||
текст страницы или None). Ответ: labs, error, skipped (нет меток у нового релиза), wrote.
|
||||
"""
|
||||
out = {"labs": [], "error": None, "skipped": False, "wrote": False}
|
||||
rec = None
|
||||
if task["parse"]:
|
||||
rec = json.loads(Path(task["json"]).read_text(encoding="utf-8"))
|
||||
try:
|
||||
out["labs"], _ = PARSERS[task["site"]](rec)
|
||||
except Exception as exc: # noqa: BLE001
|
||||
out["error"] = str(exc)
|
||||
if not task["known"]:
|
||||
return out # новый релиз без разбора — пропуск
|
||||
if not out["labs"] and not task["known"]:
|
||||
out["skipped"] = True # без меток страницу в обучение не берём
|
||||
return out
|
||||
if task["page"]:
|
||||
text = html_to_text(Path(task["html"]).read_text(encoding="utf-8"))
|
||||
Path(task["page"]).write_text(text, encoding="utf-8")
|
||||
out["wrote"] = True
|
||||
return out
|
||||
|
||||
|
||||
def meta_one(task: dict) -> dict:
|
||||
"""Одна строка meta.csv. task: site, rec, name, html, page (готовый текст страницы или None)."""
|
||||
full = ""
|
||||
page = task.get("page")
|
||||
if page and Path(page).exists():
|
||||
full = Path(page).read_text(encoding="utf-8") # уже разобран при сборке страниц
|
||||
elif task.get("html") and Path(task["html"]).exists():
|
||||
full = html_to_text(Path(task["html"]).read_text(encoding="utf-8"))
|
||||
return meta.extract(task["site"], task["rec"], task["name"], full)
|
||||
Reference in new issue
Block a user