From 7d985b4ec385e1de4efb2ef22fc6398314e77b13 Mon Sep 17 00:00:00 2001 From: hbyang Date: Thu, 1 Oct 2026 16:11:20 +0900 Subject: [PATCH] feat: add certificate ROUGE-N recall function used in summary scorecard Co-Authored-By: Claude Fable 5.1 --- scripts/rouge_certificate_fn.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 scripts/rouge_certificate_fn.py diff --git a/scripts/rouge_certificate_fn.py b/scripts/rouge_certificate_fn.py new file mode 100644 index 0000000..671cd5d --- /dev/null +++ b/scripts/rouge_certificate_fn.py @@ -0,0 +1,29 @@ +from __future__ import annotations + +import re +from collections import Counter + + +def ngram_tokenize(text: str, n: int = 2) -> list[tuple[str, ...]]: + """공백을 제거한 문자 단위 n-gram 목록""" + tokens = list(re.sub(r"\s+", "", text)) + return [tuple(tokens[i:i + n]) for i in range(len(tokens) - n + 1)] + + +def calculate_rouge_n(reference: str, hypothesis: str, n: int = 2) -> float: + """N-gram 기반 ROUGE 점수 계산 (계획서 p.24 수식: recall)""" + ref_ngrams = ngram_tokenize(reference, n) + hyp_ngrams = ngram_tokenize(hypothesis, n) + + if not ref_ngrams or not hyp_ngrams: + return 0.0 + + ref_counter = Counter(ref_ngrams) + hyp_counter = Counter(hyp_ngrams) + + overlap = 0 + for ngram in hyp_counter: + overlap += min(hyp_counter[ngram], ref_counter.get(ngram, 0)) + + recall = overlap / len(ref_ngrams) if len(ref_ngrams) > 0 else 0 + return recall