File size: 1,471 Bytes
4b112ae
 
2e6da1f
 
 
4b112ae
 
2e6da1f
4b112ae
 
 
 
 
 
 
 
 
 
 
 
2e6da1f
4b112ae
 
 
2e6da1f
 
 
 
 
4b112ae
 
 
2e6da1f
4b112ae
 
2e6da1f
4b112ae
2e6da1f
 
4b112ae
2e6da1f
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# 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