크롤링 데이터 & NLP 기반, 뉴스 성향 분류


네이버에 작성된 뉴스들의 성향 분류하는 모델 개발 프로젝트이다.


1. Mini Project - 뉴스 성향 분류 모델

  • Member : 김경록 외 4명

  • Status : Complete

  • 사용언어 : python

  • 핵심 라이브러리 : BeautifulSoup, selenium, konlpy, sklearn


2. Why

네이버에 게재된 다양한 언론사 뉴스들은

언어적 표현 방식, 주제 키워드 등에 따라 특정 성향을 띨 수 있습니다.

본 프로젝트는 이 성향을 모델링하고, 어떤 기사 표현 및 방식이

성향 분류에 영향을 미치는지를 분석하는 것이 목표였습니다.


3. Data

특정 2개 사이트에서 Python 크롤링으로 수집

(A 단체 25500개, B 단체 25500개)

주요 텍스트 필드는 기사 제목과 본문


4. 분석 방법

(a). Data Crawling

- Selenium 및 BeautifulSoup를 사용하여 사이트 별 뉴스 기사 수집
- 수집한 텍스트에서 본문만 정제하여 분석에 사용
- 불용어, 날짜 등 의미없는 단어에 대해서는 제거 작업 수행

(b). 명사 추출 패키지 비교 작업

- Konlpy를 이용하여서 명사적인 부분만 가져오는 것을 목표
  
- Okt (Open korea text), Hannanum, Kkma (Kind Korean Morpheme Analyzer), komoran

  --> 명사가 중복되지 않고, 핵심적인 명사들만 최대한 가져오는 것을 목표로 함.
  
  명사 추출에 대해서 샘플링 진행 후, Okt 모델을 선택함.

  (Hannanum : 명사가 아닌 부분도 추출됨. / Kkma : 명사가 중복되게 추출 됨
  
  komoran : Okt와 가장 비슷하였지만 줄임말 등에 대해서 조금 약한 모습을 보임)

(c). 벡터화 (TF-IDF vs Word2Vec 비교)

- Word2Vec 모델로도 문서 임베딩 시도하였으나,
  실험 결과 및 해석력 측면에서 TF-IDF 방식으로 최종 선택

- TF-IDF는 각 문서에서 중요 단어의 가중치를 부여하며, 
  희소하지만 직관적 해석이 가능

- Word2Vec은 밀집 벡터 구조로 일반화에는 강점이 있으나, 
  단어별 영향도 파악이 어려운 점에서 제한적임

(d). 분류 모델 학습

- 로지스틱 회귀(Logistic Regression), LightGBM 등 비교 실험
  
- 최종적으로는 TF-IDF + Logistic Regression 조합이 가장 높은 일반화 성능을 보여 최종 채택
  
- Accuracy 약 95% 수준 달성
  
- cf. 단 Accuracy는 각 단체의 데이터를 Train : Test (8:2) 로 해서 진행  + 10-Fold 과정 추가


5. 경험 사항 & 한계

- Word2Vec, TF-IDF 등 단어 벡터화에 대한 지식 습득. 

- 분석/개발 프로젝트 진행 과정에 대한 전반적인 process 및
  
  개선 방향성에 대해서 습득 가능.

- 딥러닝에 대한 지식까지 활용하기에는 시간 부족으로 당시에 미 진행


6. 최신 관점에서의 개선 방향 (2025 기준)

ㅇ 사전학습 언어모델(BERT, KoBERT, KLUE-BERT 등) 도입: 

  TF-IDF는 문맥을 반영하지 못하므로, 
  
  사전학습 언어모델을 사용해 문맥 기반 임베딩을 활용하면 더 정교한 분류 가능

ㅇ 파인튜닝(fine-tuning): 전체 모델을 재학습하기보다, 
  
  크롤링한 뉴스 텍스트에 일부 도메인 적응을 통해 성능 개선 가능

ㅇ 성향 해석의 투명성: SHAP 등 모델 설명 도구를 통해 
  
  어떤 단어나 문장이 분류 결과에 영향을 주었는지 시각화 가능

ㅇ 멀티태스크/멀티레이블 분류 확장: 
  
  A vs B 뿐만 아니라 뉴스의 감성, 주제 등을 동시에 
  
  분류할 수 있는 구조로 확장 가능

ㅇ 타 프로젝트에서의 활용 가능성 : GPT 등 데이터를 크롤링 할 때,

  불필요한 데이터까지 다 크롤링하는 것이 아닌, 해당 모델 기반으로

  편향 기사, 민감성 주제 등으로 분류하여 1차적인 필터링 가능.


github private link