35차시. 평가 데이터셋 구축
퀴즈 1 — 데이터셋 구성·누락·중복 점검하기
평가 데이터셋(딕셔너리 리스트)을 받아 유형별 개수, 부재 질문 비율(%), 문항별로 빠진 필드, 중복된 질문 문장을 딕셔너리로 돌려주는 check_dataset(data) 를 만드세요. 필수 필드는 라벨 항목 8개입니다.
빈칸 코드에서 시작합니다.
REQUIRED = ["id", "question", "type", "difficulty",
"answerable", "gold_answer", "gold_pages", "keywords"]
def check_dataset(data):
# 유형 분포, 부재 비율, 누락 필드, 중복 질문을 계산합니다
pass
결과 보기 (예시 풀이)
from collections import Counter
# 라벨 항목 8개. 하나라도 빠지면 채점에 쓸 수 없습니다.
REQUIRED = ["id", "question", "type", "difficulty",
"answerable", "gold_answer", "gold_pages", "keywords"]
def check_dataset(data):
"""데이터셋의 구성, 필드 누락, 중복 질문을 점검해 딕셔너리로 돌려줍니다."""
n = len(data)
# ① 구성: 유형별 개수와 부재 질문 비율
types = Counter(d.get("type", "?") for d in data)
absent = sum(1 for d in data if d.get("answerable") is False)
absent_ratio = absent / n * 100 if n else 0
# ② 필드 누락: 문항마다 빠진 필드 이름을 모읍니다
missing = {}
for d in data:
lack = [f for f in REQUIRED if f not in d]
if lack:
missing[d.get("id", "?")] = lack
# ③ 중복: 같은 질문 문장이 두 번 이상 나오면 골라냅니다
dup = [q for q, c in Counter(d.get("question") for d in data).items() if c > 1]
return {"total": n, "types": dict(types),
"absent_ratio": round(absent_ratio),
"missing": missing, "duplicates": dup}
def make(i, q, t, ans=True):
"""예시용 문항 하나를 만듭니다. 라벨 8개를 모두 채웁니다."""
return {"id": f"Q{i:03d}", "question": q, "type": t, "difficulty": "easy",
"answerable": ans, "gold_answer": "...", "gold_pages": [4] if ans else [],
"keywords": ["7일"]}
# 예시 1: 깨끗한 데이터셋 (부재 질문 1개, 누락·중복 없음)
good = [make(1, "환불은 며칠 이내인가요?", "fact"),
make(2, "물건이 고장 나서 왔는데 바꿀 수 있나요?", "variant"),
make(3, "대표이사 성함이 어떻게 되나요?", "absent", ans=False)]
print(check_dataset(good))
# 예시 2: gold_pages 가 빠진 문항과 중복 질문이 섞인 데이터셋
bad = [make(1, "환불은 며칠 이내인가요?", "fact"),
make(2, "환불은 며칠 이내인가요?", "fact"),
{"id": "Q003", "question": "오늘 날씨는?", "type": "out_of_scope",
"difficulty": "easy", "answerable": False,
"gold_answer": "자료에서 확인할 수 없습니다.", "keywords": []}]
result = check_dataset(bad)
print("누락:", result["missing"]) # Q003 의 gold_pages 가 잡혀야 합니다
print("중복:", result["duplicates"]) # 같은 질문 하나가 잡혀야 합니다
print("부재 비율:", result["absent_ratio"], "%")
실행 결과
{'total': 3, 'types': {'fact': 1, 'variant': 1, 'absent': 1}, 'absent_ratio': 33, 'missing': {}, 'duplicates': []}
누락: {'Q003': ['gold_pages']}
중복: ['환불은 며칠 이내인가요?']
부재 비율: 33 %채점 기준: 누락 필드와 중복 질문을 정확히 골라내고, 부재 비율을 answerable 이 False 인 문항으로 계산하면 정답입니다.
관련 교안: 35차시 「6. 실습 ③ — 데이터셋 검증」