coredot.today
기술 탐색으로 돌아가기
로컬 AI실험

육하원칙 추출 (5W1H)

기사에서 누가·언제·어디서·무엇을·왜·어떻게를 꺼낸다 — 절반은 답을 찾는 일, 나머지 절반은 '없다'고 말하는 일

직접 해보기 5라이브 실행실측
종류
논문
라이선스
Apache-2.0 (Giveme5W1H)
언어
Python
사실 확인
2026.10.24

TRY IT

직접 해보기

OVERVIEW

개요

무엇인가

기자는 첫 문장에 여섯 질문의 답을 몰아넣고 덜 중요한 답은 아래로 내립니다(역피라미드). 육하원칙 추출은 그 여섯 답을 기계가 꺼내게 하는 일이고, 같은 사건 묶기·사실 추출·미디어 편향 분석의 첫 단계입니다.

출발점은 2019년 독일 콘스탄츠 대학의 Hamborg·Breitinger·Gipp이 낸 Giveme5W1H입니다. Stanford CoreNLP의 구문 분석·개체명·상호참조 위에 규칙과 위치 가중치를 쌓아 영어 기사에서 칸마다 후보를 뽑고 점수로 하나를 골랐습니다. BBC 기사 120건 평가에서 4W 평균 정밀도 0.82, 여섯 칸 평균 0.73이었고 '왜'는 0.28, '어떻게'는 0.42였습니다. 코드는 Apache-2.0으로 공개돼 있지만 영어 전용이고 2024년 10월 이후 커밋이 없습니다.

2026년의 한국어 기사에서는 손이 네 종류입니다. 독해 모델은 자르고, 임베딩은 찾고, LLM은 쓰고, 판정 모델은 고릅니다. 코어닷투데이는 같은 기사 72건에 같은 정의서를 주고 스무 가지가 넘는 조합을 돌려, 어느 칸을 어느 손에 맡길지 정리했습니다.

어떻게 동작하나

어려움의 절반은 모델이 아니라 정의입니다. 한 기사에 사건이 여럿이고 '누가'는 문장마다 바뀌므로, Giveme5W1H처럼 헤드라인이 가리키는 주요 사건 하나를 기준으로 삼습니다.

칸정의자주 틀리는 지점
누가주요 사건의 행위 주체. 기사 표기 그대로의 짧은 명사구질문한 의원, 피해자를 주체로 고름
언제송고 시각이 아니라 사건 시각"13일 밝혔다"의 발표일을 사건일로 봄
어디서사건 장소. 데이트라인 "(광주=연합뉴스)"는 장소가 아님기관명·나라를 장소로 지어냄
왜 · 어떻게기사에 명시된 경우만. 추론 금지, 없으면 null배경 설명을 이유로 지어냄

그리고 빈칸입니다. 검수한 정답 72건에서 '왜'가 없는 기사가 61%, '어떻게'가 없는 기사가 63%, '어디서'가 없는 기사도 40%였습니다. 큰 모델은 빈칸을 지어내고 작은 모델은 있는 답도 비웁니다. 그래서 설계는 무엇을 꺼낼지보다 무엇을 비워 둘지에서 시작합니다.

1. 쓰기
정의서와 문장 번호를 붙인 본문을 주고 여섯 칸과 근거 문장 번호를 JSON으로 받는다. 누가·언제·어디서·무엇을은 리드문에 거의 다 있다.
2. 부재 검문
'왜'·'어떻게'는 판정 모델에게 "기사에 명시돼 있는가"를 따로 묻고, 확률이 낮으면 null로 되돌린다. 또는 쓰기 모델 셋의 다수결로 지운다.
3. 근거 확인
값이 그 번호의 문장에 글자 그대로 있는지 문자열로 비교한다. 번호가 틀렸으면 판정 모델의 choice로 다시 짚게 한다.
4. 정규화
'언제'는 기사 표현 그대로 받고, "이날·전날·지난 10일"을 기사 날짜 기준 절대 날짜로 바꾸는 일은 코드로 한다. 두 값을 모두 저장한다.

빠른 시작

실측에서 효과가 컸던 정의서 문장입니다. 아래 라이브 실행도 같은 방향의 지시로 기사 문단을 구조화합니다.

정의서에서 효과가 컸던 문장
기준 사건
기사의 헤드라인이 가리키는 주요 사건 하나를 기준으로 한다.
언제
송고 시각이 아니라 사건 시각. 데이트라인 "(광주=연합뉴스)"는 사건 장소가 아니다.
왜·어떻게
기사에 명시되어 있을 때만. 추론하지 말 것. 없으면 null.
근거
각 항목에 그 값이 들어 있는 본문 문장 번호(0부터)를 적는다.

영어 기사라면 원조 구현을 돌려 볼 수 있습니다. README 기준으로 pip3 install giveme5w1h와 giveme5w1h-corenlp install 뒤 CoreNLP 서버(giveme5w1h-corenlp)를 먼저 띄워야 합니다.

python
from Giveme5W1H.extractor.document import Document
from Giveme5W1H.extractor.extractor import MasterExtractor

extractor = MasterExtractor()
doc = Document.from_text(text, date_publish)
doc = extractor.parse(doc)
print(doc.get_top_answer('who').get_parts_as_text())

코어닷투데이 실측

2026년 10월 13일 연합뉴스 7개 섹션 60건과 네이버 뉴스 요약 데이터셋 12건, 합쳐 72건 432칸. 쓰기 모델 넷에는 글자 하나 다르지 않은 정의서를 줬습니다(글자 F1).

방법평균'왜'기사당
Gemini 3.8 Flash 쓰기 (사고 끔)0.860.733.6초
Flash + Clef-Flash 27B 부재 검문0.870.847초
Flash · Flash-Lite · 9B 다수결0.860.855초 (병렬)
Qwen3.5 9B 로컬 쓰기0.690.675.1초
판정 모델이 후보 다섯 중 고르기0.62~0.710.35~0.66—
KorQuAD 독해 모델 (KoELECTRA)0.18~0.300.10질문 6개에 0.4초
  • 독해 모델은 범용 질문에 무너졌습니다. "이 사건의 주체는?"에 '다소', '이미' 같은 부사를 잘라 왔습니다. KorQuAD는 본문 표현을 품은 구체적 질문용입니다.
  • 고르기는 쓰기를 못 이겼습니다. 정답이 후보 안에 있는데도(상한 0.9 이상) 그랬고, 후보를 쓰기 모델 셋으로 줄이자 4B부터 클라우드까지 네 판정 모델이 모두 0.74 근처로 모였습니다.
  • 부재는 선택지가 아니라 질문으로 묻습니다. 같은 Nimble이 "없음"을 선택지 하나로 끼우면 '왜' 0.35, "이유가 명시돼 있는가"를 noul로 따로 물으면 AUROC 0.85였습니다. 검문은 큰 모델의 과잉은 깎지만 작은 모델의 누락은 채우지 못했습니다.
  • 채점을 바꿔도 순위는 그대로였습니다. 답 2,371개를 판사 여섯에게 다시 채점시키자 클라우드 판사·Jev의 순위는 글자 F1과 켄달 상관 0.96~0.98. Flash와 9B의 격차도 0.175에서 0.160으로 줄었을 뿐입니다. '언제'는 날짜 정규화 규칙만으로 9B가 0.77에서 0.83이 됐습니다.
  • 증류는 실패했습니다. Flash 답 1,623개(라벨 비용 5.6달러)로 Qwen3 4B를 LoRA로 가르쳤더니 0.656으로, 학습 전(0.686)보다 낮았습니다. 학생은 판단보다 '여섯 칸을 다 채우는' 버릇을 먼저 배웠습니다.

언제 쓰고, 언제 피하나

제약구성
반출 가능, 단순하게Flash 단독 + 로컬 판정 모델(Clef-Flash 또는 Nimble) 부재 검문
반출 가능, 로컬 GPU 없음Flash 단독. '왜'의 지어냄은 감수하고 근거 번호로 검수
반출 불가, 애플 실리콘 있음로컬 쓰기 모델 + Nimble choice로 근거 문장. 증류 전에 같은 크기 최신 모델부터 정의서만으로 잰다
반출 불가, CPU만독해 모델 단독은 쓰지 않는다. 4B라도 들인다

한계와 주의

  • 정답 초안을 Gemini 3.8 Flash가 썼습니다. Claude가 432칸을 원문과 대조해 16칸을 고쳤지만, 사람 둘이 독립적으로 단 정답은 아닙니다. 다른 최상위 모델(Gemini 3.1 Pro)과 정답의 거리도 이 정도였으니 0.85를 넘는 차이는 표현 차이로 읽습니다.
  • 72건은 작습니다. 칸별 점수의 95% 신뢰구간은 대략 ±0.08입니다.
  • '왜'의 정답 자체가 흔들립니다. 판사들이 정답을 의심한 네 칸은 다시 보니 모두 정답 쪽이 지나치게 엄격했습니다. 정의서를 바꾸면 '왜' 점수는 0.1 단위로 움직입니다.
  • 채점 판사에게는 가족 편향이 있었습니다. Gemini 판사는 Gemini 답에, Qwen 계열 로컬 판사는 Qwen 답에 후했습니다. 평가 대상과 다른 가족의 판사 둘 이상의 중앙값을 씁니다.
  • 로컬 27B 쓰기 모델은 Ollama MLX 러너가 긴 입력에서 멈춰 빠졌습니다. 연합뉴스 60건은 국정감사 기간의 하루치입니다.

LIVE

라이브 실행

뉴스에서 육하원칙 뽑기

기사 문단에서 누가·언제·어디서·무엇을·어떻게·왜를 구조화해 뽑습니다. 사건 묶기·사실 추출 파이프라인의 첫 단계입니다.

콘솔에서 키 발급받기

키는 이 브라우저에서 core.today 게이트웨이로만 전송되고 코어닷투데이 서버를 거치지 않습니다. 실행 비용은 키 주인의 크레딧에서 차감됩니다.

예시 입력
모델에게 보내는 시스템 프롬프트 보기
한국어 뉴스 문단에서 육하원칙을 추출한다.
본문에 없는 내용은 추측하지 말고 null로 둔다. 상대 날짜(어제·지난주)는 원문 표현 그대로 남긴다.
JSON 하나만 출력한다: {"누가": ..., "언제": ..., "어디서": ..., "무엇을": ..., "어떻게": ..., "왜": ..., "근거문장": ["원문에서 그대로 옮긴 문장"]}

133 / 1,500자 · 모델 gpt-5.6-luna · 출력 최대 600 토큰

DEEP DIVE

더 깊이 읽기