Слияние студии из заголовка, title в сервисе, детект заглушек, e2e через predict_release

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
This commit is contained in:
DenozordecandClaude Sonnet 5.5 committed 2026-10-27 17:05:30 +07:00
1 parent 8cbd800ec7
commit 6be369c415
7 files changed
+112 -19

No files matched your search

+14 -3
View File
@@ -16,12 +16,14 @@ from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from src.predict import DubPredictor # noqa: E402
from src.html_extract import read_input # noqa: E402
from src.release import predict_release # noqa: E402
from src.studio_norm import canonical # noqa: E402
ROOT = Path(__file__).resolve().parents[1]
def release_check(predictor: DubPredictor, rows: list[dict]) -> dict:
def release_check(predictor: DubPredictor, rows: list[dict], use_title: bool = True) -> dict:
"""E2E на текстовых дампах страниц: пары (тип, автор) по релизам."""
by_release: dict[tuple[str, str], list[dict]] = defaultdict(list)
for r in rows:
@@ -43,7 +45,10 @@ def release_check(predictor: DubPredictor, rows: list[dict]) -> dict:
gt_rows = by_release[(src, rid)]
gold = {(r["translation_type"], r["studio"] or None) for r in gt_rows}
try:
tracks = predictor.predict_file(page)
if use_title: # путь релиза: описание + студии из заголовка раздачи
tracks = predict_release(predictor, text=read_input(page))["tracks"]
else:
tracks = predictor.predict_file(page)
except Exception as e: # noqa: BLE001
misses.append(f"{page.name}: ошибка {e}")
continue
@@ -115,7 +120,13 @@ def main() -> None:
.read_text(encoding="utf-8"))
predictor = DubPredictor()
print("== e2e: страницы против меток ==")
print("== e2e: страницы против меток (только описание, baseline) ==")
base = release_check(predictor, rows, use_title=False)
print(f"релизов: {base['n_releases']}, precision {base['mean_precision']:.3f}, "
f"recall {base['mean_recall']:.3f}; "
+ "; ".join(f"{s}: P={v['precision']:.3f} R={v['recall']:.3f}"
for s, v in base["per_source"].items()))
print("\n== e2e: страницы против меток (описание + заголовок, predict_release) ==")
rel = release_check(predictor, rows)
print(f"релизов проверено: {rel['n_releases']}, "
f"mean precision {rel['mean_precision']:.3f}, "
+23
View File
@@ -201,5 +201,28 @@ check("aggregate: 18+ = OR", agg["is_18plus"] is True)
check("aggregate: студии", [x["studio"] for x in agg["studios"]] == ["MovieDalen", "LostFilm"])
check("aggregate: пусто", aggregate([])["is_18plus"] is False)
from src.fetch import blocked_reason # noqa: E402
from src.release import merge_title_tracks, title_from_text # noqa: E402
check("заглушка Cloudflare", blocked_reason("<html><title>Один момент…</title>") is not None)
check("нормальная страница", blocked_reason("<html><title>X</title>Перевод: A") is None)
_page = [dict(_t("проф. двухголосый", None), studio_span=None, studio_confidence=None),
dict(_t("проф. дубляж", "MovieDalen"), studio_span="MovieDalen", studio_confidence=1)]
_title = [dict(_t("проф. двухголосый", "Red Head Sound"), studio_span="Red Head Sound",
studio_confidence=0.9),
dict(_t("проф. дубляж", "MovieDalen"), studio_span="x", studio_confidence=1),
dict(_t("проф. многоголосый", "LostFilm"), studio_span="LostFilm", studio_confidence=1)]
merge_title_tracks(_page, _title)
check("title: студия вписана в дорожку без студии",
_page[0]["studio"] == "Red Head Sound" and _page[0]["source"] == "page+title")
check("title: дубль студии пропущен, новая добавлена",
len(_page) == 3 and _page[2]["source"] == "title")
_dump = ("Меню\nГангстерленд / MobLand / 2025 / ПМ (LostFilm) / WEB\n"
"Гангстерленд / 2026 / ДБ (X) / WEB-DL")
check("title_from_text: первая строка",
"LostFilm" in title_from_text(_dump) and "ДБ" not in title_from_text(_dump))
print(f"\nитог: {PASS} ok, {FAIL} failed")
sys.exit(1 if FAIL else 0)