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 D와A 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: 개별 단어보다 연속된 두 단어의 겹침이 적다는 의미