CHANGELOG

Aide 업데이트 노트

2026년 4월 11일 · 수집 품질 개선 · 지역 태그 · YouTube 감성 정확도 향상

목차

  1. 수집 노이즈 필터 강화
  2. 지역별 태그 & 통계
  3. YouTube 감성 분석 정확도
  4. 4/8 이후 데이터 재수집
  5. 수정 파일 목록
🚫

수집 노이즈 필터 강화

카테고리 목록 페이지, 기사 나열형 블로그 차단

① 카테고리 URL 휴리스틱 NEW

경로에 숫자가 없고 슬래시로 끝나는 URL → 기사 ID 없는 목록 페이지로 판단하여 차단

BLOCK https://www.chosun.com/national/regional/
PASS https://www.chosun.com/national/regional/2026/04/11/ARTICLE123/
// 경로 세그먼트가 모두 비숫자 + 최소 2단계 이상 + 슬래시 종료 if (url.endsWith("/")) { val segments = path.trim('/').split('/').filter { it.isNotEmpty() } if (segments.size >= 2 && segments.all { seg -> seg.none { c -> c.isDigit() } }) return true // 차단 }

② 블로그 post-crawl 기사나열 재탐지 IMPROVE

기존: Naver/Kakao API description만으로 기사나열 탐지 (description이 깨끗하면 통과)
변경: 크롤링 본문에서도 isAggregationPost() 재확인

BEFORE
API description만 체크
→ c1c1b1b1, mobitant 블로그 통과
AFTER
크롤링 후 본문 재체크
→ 나열형 본문 탐지·차단

탐지 기준 (기존과 동일):

  • \d+개의 관련뉴스 패턴 2회 이상 → 네이버 뉴스 나열형
  • 조선일보, 중앙일보 등 언론사명 3개 이상 → 기사 복붙 모음

③ 전체 차단 URL 패턴 목록

/news/cate/ · articleList · ?cid= · &cid= · /section/ · type=list · 숫자없는 2단계+ 경로/ · namu.wiki · wikipedia.org · 우만위키 제목 패턴
📍

지역별 태그 & 통계

시·군 단위 지역 사전 + 기사/블로그/카페 지역 태그 + 대시보드 통계 패널

지역 사전 (RegionDictionary.kt) NEW

광역 단위(대전시, 전남) 제외. 시·군 단위만 포함.

충남 (15개)

천안아산홍성 예산공주보령 서산당진논산 계룡태안금산 부여서천청양

광주전남 (23개)

광주목포여수 순천나주광양 담양곡성구례 고흥보성화순 장흥강진해남 영암무안함평 영광장성완도 진도신안

대전 (2개)

유성대덕

DB 스키마 변경 (V14 Migration) NEW

-- news_articles, blog_posts, naver_cafe_posts 공통 ALTER TABLE news_articles ADD COLUMN region_tag VARCHAR(20) NULL; ALTER TABLE blog_posts ADD COLUMN region_tag VARCHAR(20) NULL; ALTER TABLE naver_cafe_posts ADD COLUMN region_tag VARCHAR(20) NULL;

대시보드 지역별 반응 패널 NEW

오늘의 뉴스 섹션 하단 → 📍 지역별 반응 (최근 14일) 패널

  • 지역별 총 언급 건수 표시
  • 긍정% / 부정% 바 표시
  • API: GET /api/region-stats?candidateId=N&days=14
111
재수집 기사 중
지역 태그 완료
149
4/8 이후
재수집 뉴스
74%
지역 태그
인식률

YouTube 감성 분석 정확도

홍보성 발언 오판 방지 + 제목-only 영상 Gemini 강제 검토

사례 1 — 제목만 있는 영상 오판 수정 FIX

BEFORE
"김대중 교육감, 이름 때문에 무슨일이?!~~"
→ KNU: negative (-0.5)
AFTER
caption·description 없는 영상
→ Gemini 강제 검토 → neutral (0.0)

사례 2 — 후보 홍보 발언 오판 수정 FIX

영상: "이병학 후보, 전교조 교육감이 8년간 망친 충남교육을 살리겠다"
→ KNU가 "망친" 키워드로 -0.8 판정. 하지만 이는 후보 자신의 공약 발언입니다.

BEFORE (KNU 단독 판단)
negative (-0.8)
"망친", "전교조" 부정 어휘 카운트
AFTER (YouTube 전용 Gemini)
positive (+0.8)
후보 홍보성 발언 = 긍정으로 판단

YouTube 전용 Gemini 프롬프트 NEW

뉴스/블로그와 분리된 YouTube 전용 판단 기준 적용

판단 기준 (교육감 후보 관점): 1. 후보의 공약·연설·인터뷰·홍보 내용 → positive (상대 비판 표현이 있어도) 2. 해당 후보를 외부에서 비판·의혹 제기 → negative 3. 여론조사에서 후보가 우세·당선 → positive 4. 여론조사에서 후보가 열세·낙선 → negative 5. 단순 뉴스 보도나 맥락 불분명 → neutral

YouTube KNU 임계값 확대 IMPROVE

caption 없는 영상: ±0.7 미만이면 KNU 단독 판단 대신 Gemini 2차 검토로 전환

// 기존: |score| >= 0.5이면 KNU 단독 판단 // 변경: caption 없는 YouTube는 |score| >= 0.7부터 KNU 신뢰 val isYoutubeAmbiguous = video.caption == null && result.score > -0.7f && result.score < 0.7f
🔄

4/8 이후 데이터 재수집

노이즈 필터 + 지역 태그 적용을 위한 전체 재수집
875
삭제된 레코드
(뉴스+블로그+카페)
노이즈 필터
적용 재저장
지역 태그
자동 부착
YouTube
제외
(별도 관리)
📁

수정 파일 목록

이번 배포에 포함된 변경 파일
파일 변경
collector/RegionDictionary.kt 신규 — 시·군 지역 사전
db/migration/V14__add_region_tag.sql 신규 — region_tag 컬럼
collector/CollectorNoiseFilter.kt 카테고리 URL 휴리스틱 추가
collector/Naver·KakaoBlogCollector.kt post-crawl 기사나열 재탐지 + region 태그
collector/Naver·KakaoNewsCollector.kt region 태그
collector/Naver·KakaoCafeCollector.kt region 태그
vo/NewsArticle·BlogPost·CafePost.kt regionTag 필드 추가
analysis/SentimentPipeline.kt YouTube 임계값 확대 (±0.7)
analysis/ClaudeSentimentService.kt YouTube 전용 Gemini 프롬프트 추가
controller/DashboardController.kt /api/region-stats 엔드포인트 추가
templates/dashboard.html 지역별 반응 패널 + 오늘의 뉴스 5개 제한 해제 + 부정 댓글 표시