o2o-plagiarism-ai/tests/test_rouge.py

51 lines
1.8 KiB
Python

"""ROUGE 평가 모듈 단위테스트 (성능지표 No.7)."""
from __future__ import annotations
from app.engine.rouge import rouge_n, rouge_l, evaluate_pairs, tokenize
def test_identical_is_perfect():
s = rouge_n("홍길동은 활빈당을 만들었다", "홍길동은 활빈당을 만들었다", n=1)
assert s.f1 == 1.0
assert s.recall == 1.0
def test_no_overlap_is_zero():
s = rouge_n("우주선이 행성을 탐사한다", "사랑은 아름다운 감정이다", n=1, mode="char")
assert s.f1 == 0.0
def test_partial_overlap_between_zero_and_one():
s = rouge_n("홍길동은 활빈당을 만들어 재물을 빼앗았다",
"홍길동은 활빈당을 조직했다", n=1)
assert 0.0 < s.f1 < 1.0
def test_rouge2_stricter_than_rouge1():
sys = "홍길동은 활빈당을 만들어 재물을 빼앗았다"
ref = "홍길동은 재물을 활빈당으로 만들어 빼앗았다" # 단어 순서 섞임
r1 = rouge_n(sys, ref, n=1).f1
r2 = rouge_n(sys, ref, n=2).f1
assert r2 <= r1 # bigram 은 순서에 민감 → 더 낮거나 같음
def test_rouge_l_rewards_sequence():
s = rouge_l("홍길동은 활빈당을 만들어 재물을 빼앗았다",
"홍길동은 활빈당을 만들어 재물을 빼앗았다")
assert s.f1 == 1.0
def test_evaluate_pairs_aggregates():
pairs = [
("홍길동은 활빈당을 만들었다", "홍길동은 활빈당을 만들었다"),
("어린왕자가 여우를 만났다", "어린왕자가 여우를 만났다"),
]
out = evaluate_pairs(pairs)
assert set(out) == {"rouge1", "rouge2", "rougeL"}
assert out["rouge1"]["f1"] == 1.0
def test_tokenize_char_fallback():
toks = tokenize("Hello 월드 123", mode="char")
assert "hello" in toks and "월드" in toks and "123" in toks