MakeAI 딥러닝

공시·뉴스 수집 파이프라인 — 같은 기사 200개 중에 진짜는 하나예요

투자 인텔리전스 제품의 바닥은 수집이에요. 똑같은 내용이 매체마다 반복되는 뉴스에서 원본을 찾고, 공시와 연결하고, 출처를 끝까지 남기는 방법을 정리했어요.

3분 읽기

이번 주부터는 Market 쪽 제품 이야기를 조금 해 볼게요. "Make Money"는 공시·뉴스·리포트를 모아서 종목별 이슈와 근거를 정리해 주는 제품인데, 화려한 건 분석 쪽이지만 실제로 제일 공들인 건 수집이에요.

뉴스는 거의 다 복사본이에요

하루에 특정 종목 관련 기사를 모으면 수백 건이 나오는데, 내용은 거의 같아요. 통신사 기사 하나를 수십 개 매체가 받아쓰고, 거기에 제목만 바꾼 것들이 또 붙어요. 이걸 그대로 사용자에게 보여 주면 "오늘 이슈 200건"이 되는데, 실제 이슈는 두세 개예요.

그래서 수집 파이프라인의 첫 일은 중복 제거예요.

중복은 세 단계로 걸러요

1. 정확 중복. 본문을 정규화(공백, 특수문자, 기자 이름·매체명 제거)한 뒤 해시를 비교해요. 받아쓴 기사 대부분이 여기서 걸려요.

2. 근사 중복. 제목만 다르고 본문은 거의 같은 것들이요. MinHash로 본문의 자카드 유사도를 근사하고, 임계값 이상이면 같은 묶음으로 봐요. 여기서 임계값을 너무 낮추면 "같은 회사의 다른 뉴스"가 합쳐져서 조심해야 해요. 저희는 보수적으로 잡고, 다음 단계에서 한 번 더 봐요.

3. 의미 중복. 문장은 다른데 사건이 같은 경우예요. "A사, 2분기 영업이익 30% 증가" 와 "A사 실적 호조… 영업이익 급증". 임베딩 유사도와 추출한 핵심 요소(회사, 사건 종류, 숫자)가 같으면 같은 사건으로 묶어요. 이 단계는 완벽하지 않아서, 묶은 결과는 "같은 사건으로 추정"이라고 표시해요.

원본 찾기

같은 묶음 안에서 어느 기사가 원본인가가 중요해요. 출처를 보여 줄 때 복사본을 가리키면 신뢰가 떨어지거든요. 규칙은 이래요.

  • 발행 시각이 가장 이른 것
  • 단, 공시가 묶음 안에 있으면 공시가 무조건 원본이에요. 기사보다 공시가 1차 자료니까요.
  • 통신사 기사가 있으면 그 다음 우선순위
  • 시각이 같으면 본문이 긴 것(받아쓰면서 줄이는 경우가 많아요)

공시와 뉴스를 연결하기

공시는 전자공시시스템에서 정형으로 들어와요. 회사 코드, 공시 종류, 시각이 명확해요. 뉴스는 회사명이 "삼성전자", "삼전", "삼성電子" 처럼 제각각이에요. 연결하려면 회사명 정규화가 먼저예요. 저희는 회사별 별칭 사전을 유지하고, 사전에 없는 표기는 후보로 모았다가 사람이 확인해요.

연결이 되면 "이 뉴스는 이 공시에 대한 보도"라는 관계가 생겨요. 사용자에게는 뉴스 요약 옆에 공시 원문 링크가 붙어요. 요약이 틀렸는지 바로 확인할 수 있는 거죠. 1월부터 계속 말씀드린 "확인 가능한 결과" 원칙이 여기도 똑같이 적용돼요.

출처는 끝까지 남겨요

파이프라인을 거치면서 데이터가 변형되는데(정규화, 요약, 묶음), 어느 단계에서든 원본 URL과 수집 시각, 원문 해시가 따라가요. 요약 문장 하나하나에 "이 문장은 어느 기사의 어느 문단에서"가 붙어요. 이걸 안 하면 나중에 "이 숫자 어디서 나온 거예요?"에 답을 못 해요.

또 하나, 수집 시각의 원문을 보관해요. 기사는 나중에 수정되거나 삭제되기도 하거든요. 사용자가 본 시점의 원문이 뭐였는지 증명할 수 있어야 해요.

실시간은 얼마나 실시간이냐면요

공시는 발표 즉시 수집되고, 뉴스는 매체별 수집 주기가 달라요. 저희는 "실시간"이라고 하지만 정확히는 수 분 단위 폴링이에요. 이걸 숨기지 않고 각 항목에 "수집 시각"을 표시해요. 투자 판단에 쓰는 데이터라서, 시차를 모르는 게 제일 위험해요.

아직 어려운 것

  • 같은 사건이 며칠에 걸쳐 전개될 때(의혹 제기 → 해명 → 추가 보도) 사건을 하나로 묶을지 나눌지가 애매해요. 지금은 하루 단위로 끊어요.
  • 영문 외신과 국문 기사를 같은 사건으로 묶는 건 아직 정확도가 낮아요.
  • 유료 기사는 본문 수집이 안 돼서 제목만으로 묶여요.

다음 주는 기업정보시스템 이야기예요. 회사마다 다른 재무제표 계정과목을 하나로 맞추는 작업이에요.