Guilherme
Add Precision/Recall: manual & CSV tabs; batch core; BERTScore+ROUGE
2e6da1f
# 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