정치 텍스트 감성 분석 (Python NLP)
중급
정량 분석
political
python
난이도: 중급 — 실제 연구에 바로 적용 가능한 수준입니다.
개요
정치 관련 뉴스 기사의 텍스트를 분석하여 정치적 성향(진보/보수)을 분류하는 머신러닝 모델을 Python으로 구축한다. TF-IDF 벡터화와 로지스틱 회귀를 결합하여 텍스트 분류 파이프라인을 구성한다.
분석 절차
1단계: 데이터 수집 및 전처리
뉴스 기사 크롤링 또는 API로 수집한 후 텍스트 정제(특수문자 제거, 소문자 변환)를 수행한다.
2단계: TF-IDF 벡터화
TfidfVectorizer로 텍스트를 숫자 벡터로 변환한다. max_features로 상위 5,000개 단어만 사용하여 차원을 축소한다.
3단계: 모델 학습
로지스틱 회귀로 분류 모델을 학습한다. 80%는 학습 데이터, 20%는 테스트 데이터로 사용한다.
4단계: 모델 평가
classification_report로 정밀도(Precision), 재현율(Recall), F1-score를 확인한다.
5단계: 해석
회귀 계수가 높은 단어는 보수적 성향과 연관된 단어, 계수가 낮은 단어는 진보적 성향과 연관된 단어다.
코드 예제
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
# 데이터 로드
df = pd.read_csv('political_articles.csv')
# TF-IDF 벡터화
vectorizer = TfidfVectorizer(max_features=5000, stop_words='english')
X = vectorizer.fit_transform(df['article_text'])
y = df['political_leaning'] # progressive/conservative
# 학습/테스트 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 로지스틱 회귀 분류
clf = LogisticRegression(max_iter=1000)
clf.fit(X_train, y_train)
# 예측 및 평가
y_pred = clf.predict(X_test)
print(classification_report(y_test, y_pred))
# 주요 단어 확인
feature_names = vectorizer.get_feature_names_out()
coefs = clf.coef_[0]
top_progressive = sorted(zip(coefs, feature_names))[:10]
top_conservative = sorted(zip(coefs, feature_names), reverse=True)[:10]
참고문헌
Manning, C. D., Raghavan, P., & Schütze, H. (2008). Introduction to Information Retrieval. Cambridge University Press.
코드 예제
PYTHON
import pandas as pd from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import classification_report # 데이터 로드 df = pd.read_csv('political_articles.csv') # TF-IDF 벡터화 vectorizer = TfidfVectorizer(max_features=5000, stop_words='english') X = vectorizer.fit_transform(df['article_text']) y = df['political_leaning'] # progressive/conservative # 학습/테스트 분할 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 로지스틱 회귀 분류 clf = LogisticRegression(max_iter=1000) clf.fit(X_train, y_train) # 예측 및 평가 y_pred = clf.predict(X_test) print(classification_report(y_test, y_pred)) # 주요 단어 확인 feature_names = vectorizer.get_feature_names_out() coefs = clf.coef_[0] top_progressive = sorted(zip(coefs, feature_names))[:10] top_conservative = sorted(zip(coefs, feature_names), reverse=True)[:10]
참고문헌
Manning, C. D., Raghavan, P., & Schütze, H. (2008). Introduction to Information Retrieval. Cambridge University Press.