# metrics/rouge.py """ ROUGE helpers. Keep existing single-score API for manual tab, and add (precision, recall, f1) triple helpers for batch/CSV export. """ from evaluate import load from rouge_score import rouge_scorer # stable P/R/F1 _hf_rouge = None def get_hf_rouge(): global _hf_rouge if _hf_rouge is None: _hf_rouge = load("rouge") return _hf_rouge def compute_rouge_single(reference: str, prediction: str) -> str: """Manual tab: return text with F1 (rougeL).""" if not reference or not prediction: return "Please provide both texts." rouge = get_hf_rouge() res = rouge.compute( predictions=[prediction], references=[reference], rouge_types=["rougeL"], ) score = res["rougeL"] if isinstance(score, (list, tuple)): score = score[0] return f"ROUGE-L Score: {float(score):.4f}" def rougeL_prec_rec_f1(pred: str, ref: str) -> tuple[float, float, float]: """ Robust (precision, recall, f1) using rouge_score directly. Note: RougeScorer.score(target, prediction) => (ref, pred). """ scorer = rouge_scorer.RougeScorer(["rougeL"], use_stemmer=True) sc = scorer.score(ref, pred)["rougeL"] return float(sc.precision), float(sc.recall), float(sc.fmeasure) def rougeL_score(pred: str, ref: str) -> float: """Back-compat: just F1.""" _, _, f1 = rougeL_prec_rec_f1(pred, ref) return f1