# src/summary.py from __future__ import annotations import re from typing import Dict, List, Tuple from schema import ExtractedDocument def _top_keywords(keywords: Dict[str, int], top_n: int = 10) -> List[Tuple[str, int]]: items = sorted(keywords.items(), key=lambda x: x[1], reverse=True) return [(k, v) for k, v in items if v > 0][:top_n] def _guess_address(text: str) -> str: # Very naive US-style address guess # e.g., "123 Main St, Dallas, TX 75201" pattern = r"\b\d{1,6}\s+[A-Za-z0-9.\- ]+\s+(Street|St|Avenue|Ave|Road|Rd|Boulevard|Blvd|Lane|Ln|Drive|Dr)\b.*?\b[A-Z]{2}\s+\d{5}\b" m = re.search(pattern, text, flags=re.IGNORECASE) return m.group(0).strip() if m else "" def naive_summary(doc: ExtractedDocument) -> Dict[str, object]: words = doc.text.split() address_guess = _guess_address(doc.text[:20000]) # only scan early chunk return { "filename": doc.filename, "reader": doc.reader, "num_pages": doc.num_pages, "word_count": len(words), "table_count": len(doc.tables), "top_keyword_hits": _top_keywords(doc.keywords, top_n=12), "address_guess": address_guess, }