sundeep-news-scan/_replay_political.py

54 lines
2.7 KiB
Python

import os, tempfile, contextlib, io, json, sys, shutil
tempfile.tempdir = os.path.abspath("_tess_tmp"); os.environ["TMPDIR"] = tempfile.tempdir
os.makedirs("_tess_tmp", exist_ok=True)
from pathlib import Path
import smart_extractor as se
from _lines import separator_barriers
# Replays the POLITICAL crop step (no API): saved political_result.json member ids
# + freshly recomputed region prep chain -> crop_political_articles (block-snap).
RUNS = [
("sakshi", Path("output/Sakshi_Jangaon_District_20260520_20260609_210104"), [1]),
("andhra_jyothi", Path("output/AndhraJyothi_Siddipet District_20260602_20260603_144919"), [2, 3, 4]),
("namaste_telangana", Path("output/NamastheTelangana_Jangaon_20260520_20260608_124720"), [1]),
]
for paper, RUN, pages in RUNS:
se._ACTIVE_PAPER = paper
D = RUN / "pages"
OUT = RUN / "articles_review"
if OUT.exists():
shutil.rmtree(OUT)
for pg in pages:
png = str(D / f"page_{pg:03d}.png")
prf = D / f"page_{pg:03d}.political_result.json"
if not prf.exists() or not os.path.exists(png):
continue
political = json.load(open(prf)).get("political_articles", [])
if not political:
continue
regs = json.loads((D / f"page_{pg:03d}.regions.json").read_text())["regions"]
buf = io.StringIO()
with contextlib.redirect_stdout(buf):
regs = se.dedup_overlapping_regions(regs)
regs = se.merge_stacked_title_lines(regs, png)
regs = se.drop_masthead_regions(regs, paper, pg, png)
regs = se.drop_classifieds_regions(regs, png)
regs = se.tag_legal_notices(regs, png)
regs = se.promote_paragraph_titles(regs, png, paper)
if paper == "sakshi":
regs = se.detect_sakshi_headline_bands(regs, png)
regs = se.mark_bullet_titles(regs, png)
ds = se.find_article_starts_by_dateline(regs, png, paper)
bars = separator_barriers(png, regs)
_p = se.cluster_all_article_blocks(regs, ds, sep_lines=bars)
if se.recover_orphan_text_headlines(_p, regs, png):
ds = se.find_article_starts_by_dateline(regs, png, paper)
recs = se.crop_political_articles(png, political, regs, OUT, pg,
dateline_starts=ds, sep_lines=bars)
print(f"=== {RUN.name} page {pg}: {len(political)} political -> {len(recs)} crops")
for l in buf.getvalue().splitlines():
if any(k in l for k in ("Block-snap", "Cropped:", "Clipped", "Floored", "Grew",
"Banner", "block-snap unavailable")):
print(" ", l.strip())
print("DONE")