logo

ROUGE

ROUGE

ROUGE(Recall-Oriented Understudy for Gisting Evaluation)

  • 용도: 주로 요약 평가
  • 관점: 참조문을 얼마나 포함했는지에 초점

ROUGE-N

ROUGE-N: 참조문의 n-gram 가운데 생성문에도 나타난 비율

  • ROUGE-1: unigram 기반
  • ROUGE-2: bigram 기반
  • 분모: 참조문의 n-gram 수
  • 해석: 참조문의 핵심 표현을 생성문이 얼마나 포함했는지 평가

ROUGE-L

ROUGE-L: 최장 공통 부분 수열(Longest Common Subsequence, LCS) 이용

  • 부분 수열: 일부 단어를 삭제해 만든 수열
    • 남은 단어의 순서는 유지하며 서로 연속할 필요는 없음
  • LCS: 두 문장에 공통으로 나타나는 부분 수열 가운데 가장 긴 수열
    • 예: A B C DA C E D의 LCS는 A C D
  • 점수: LCS 길이를 바탕으로 정밀도와 재현도 계산

더 알아보기: ROUGE 계산

  • 중복 n-gram: 두 문장의 출현 횟수 중 작은 값을 공통 개수로 계산
  • : 참조문에 나타난 서로 다른 n-gram의 집합
  • : 생성문에서 n-gram 가 나타난 횟수
  • : 참조문에서 n-gram 가 나타난 횟수
  • : 생성문에서 같은 n-gram을 반복해도 참조문의 횟수까지만 인정

BLEU와 ROUGE의 차이

  • BLEU: 생성문 기준 정밀도에 초점
  • ROUGE: 참조문 기준 재현도에 초점
  • 실제 구현에서는 정밀도, 재현도, F1을 모두 계산

ROUGE 실습

!pip install -q rouge-score
  • 비교 문장: BLEU 실습과 동일
  • 입력: RougeScorer에 문자열을 그대로 전달
from rouge_score import rouge_scorer

reference = """It is the guiding principle which guarantees the military forces
always being under the command of the Party""".strip()

hypothesis = """It is a guide to action which ensures that the military always obeys
the commands of the Party""".strip()

scorer = rouge_scorer.RougeScorer(
    ["rouge1", "rouge2", "rougeL"],
    use_stemmer=True,  # 영어 단어의 활용형을 같은 어간으로 비교
)
scores = scorer.score(reference, hypothesis)
  • ROUGE-1: 겹치는 개별 단어를 기준으로 계산
scores["rouge1"]  # 1-gram 정밀도·재현도·F1
실행 결과
Score(precision=0.6666666666666666, recall=0.6666666666666666, fmeasure=0.6666666666666666)
  • ROUGE-2: 연속된 두 단어가 함께 겹쳐야 하므로 더 낮은 점수
scores["rouge2"]  # 2-gram 정밀도·재현도·F1
실행 결과
Score(precision=0.35294117647058826, recall=0.35294117647058826, fmeasure=0.35294117647058826)
  • ROUGE-L: 두 문장의 최장 공통 부분 수열을 기준으로 계산
scores["rougeL"]  # LCS 정밀도·재현도·F1
실행 결과
Score(precision=0.6666666666666666, recall=0.6666666666666666, fmeasure=0.6666666666666666)
  • 정밀도와 재현도: 생성문과 참조문의 토큰 수가 같아 동일
  • 낮은 ROUGE-2: 개별 단어보다 연속된 두 단어의 겹침이 적다는 의미
Previous
BLEU