Spaces:
Sleeping
Sleeping
| # 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 | |