1. 텍스트 분류 전체 파이프라인 (STEP 1~6)
리뷰 텍스트
↓ ① 전처리() 특수문자 제거
↓ ② train_test_split() 훈련 75% / 테스트 25%
↓ ③ TfidfVectorizer char_wb + ngram(2,4) → 수천 개 특성
.fit_transform(훈련) 훈련만 fit!
.transform(테스트) 테스트는 변환만!
↓ ④ 모델.fit() 나이브 베이즈 or 로지스틱 회귀
모델.predict()
↓ ⑤ classification_report() 정확도 + Precision + Recall + F1
STEP 1. 데이터 준비 및 레이블링
- 데이터: 긍정 리뷰와 부정 리뷰 데이터를 수집
- 레이블(Label):
- 모델이 정답을 학습할 수 있도록 긍정은 '1', 부정은 '0'으로 숫자를 부여
- 레이블의 품질은 모델 성능의 절반을 결정할 만큼 중요한 요소
# ─── 데이터 ──────────────────────────────────────────────────
긍정_리뷰 = [
"치킨이 정말 바삭하고 맛있어요 소스도 최고예요",
"배달이 엄청 빠르고 포장도 꼼꼼했어요",
"피자 도우가 쫄깃하고 치즈가 넘쳐요 완전 맛집",
# ... (25개)
]
부정_리뷰 = [
"배달이 너무 늦어서 음식이 다 식었어요",
"치킨이 눅눅하고 기름기가 너무 많아요",
"포장이 엉망이라 국물이 다 쏟아졌어요",
# ... (25개)
]
X = 긍정_리뷰 + 부정_리뷰 # 리뷰 텍스트
y = [1]*25 + [0]*25 # 정답 (1=긍정, 0=부정)
STEP 2. 텍스트 전처리
- URL 제거, 특수문자 제거, 연속 공백 정리 등을 통해 모델이 노이즈 없이 데이터의 본질에 집중하게 만듦
def 전처리(텍스트):
텍스트 = re.sub(r'[^가-힣a-zA-Z0-9 ]', ' ', 텍스트)
return re.sub(r'\\s+', ' ', 텍스트).strip()
STEP 3. 훈련 및 테스트 데이터 분리
- 이유: 모델이 학습한 적 없는 '보지 못한 데이터'로 실제 성능을 공정하게 측정하기 위함
- 비율: 일반적으로 80:20 또는 75:25 비율로 분리
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.25, random_state=42)
STEP 4. 수치화 (Vectorization)
- TfidfVectorizer를 사용하여 텍스트 데이터를 숫자로 변환
변환기 = TfidfVectorizer(analyzer='char_wb', ngram_range=(2, 4))
X_train_vec = 변환기.fit_transform(X_train) # 훈련만 fit!
X_test_vec = 변환기.transform(X_test) # 테스트는 transform만!
STEP 5. 모델 학습 (Model Training)
- 준비된 훈련 데이터와 레이블을 모델에 입력하여 단어와 감성 사이의 관계를 학습
- 나이브 베이즈 (MultinomialNB)
모델 = MultinomialNB()
모델.fit(X_train_vec, y_train)
예측 = 모델.predict(X_test_vec)
- 로지스틱 회귀 (LogisticRegression)
모델 = LogisticRegression(max_iter=1000, random_state=42)
모델.fit(X_train_vec, y_train)
예측 = 모델.predict(X_test_vec)
STEP 6. 모델 평가 및 예측
- 테스트 데이터를 입력하여 모델의 예측값과 실제 정답을 비교하고 성능 지표를 산출
2. 주요 머신러닝 모델 상세
- 나이브 베이즈 (Naive Bayes - MultinomialNB)
- 원리: 단어들이 나타날 확률을 기반으로 분류
- 특징: 학습 속도가 매우 빠르고, 데이터 양이 상대적으로 적을 때 먼저 시도하기 좋음
- 로지스틱 회귀 (Logistic Regression)
- 원리: 각 단어에 가중치를 부여하여 긍정/부정 확률을 계산
- 특징: 어떤 단어가 긍정/부정에 큰 영향을 주었는지 가중치를 통해 확인할 수 있어 모델 디버깅과 해석 가능
- 두 모델 비교
| 나이브 베이즈 | 로지스틱 회귀 | |
| 원리 | 단어 등장 확률 | 단어 가중치 합산 |
| 학습 속도 | 매우 빠름 ✅ | 반복 최적화 필요 |
| 데이터 적을 때 | 강함 ✅ | 약할 수 있음 |
| 데이터 많을 때 | 괜찮음 | 더 강함 ✅ |
| 해석 가능성 | 확률로 해석 | 가중치로 해석 ✅ |
3. 성능 평가 지표 (Evaluation Metrics)
모델이 얼마나 잘 분류했는지 판단하는 기준들입니다.
| 예측 긍정 | 예측 부정 | |
| 실제 긍정 | TP(True Positive) | FN(False Negative) |
| 실제 부정 | FP(False Positive) | TN(True Negative) |
- 정확도 (Accuracy):
- 전체 예측 중 맞춘 비율
- “전체 중 얼마나 맞게 예측했나”
- (TP+TN) / (TP + FN + FP + TN)
- 정밀도 (Precision):
- 모델이 '긍정'이라고 예측한 것 중 실제로 '긍정'인 비율
- 오탐(틀린 예측)이 치명적일 때 확인하는 지표
- “맞았다고 예측한 것 중 실제로 맞은 것”
- TP / (TP + FP)
- 민감도(Sensitivity), 재현율(Recall), TPR(True Positive Rate):
- 실제 '긍정'인 것들 중 모델이 '긍정'이라고 맞춘 비율
- 미탐(놓친 데이터)이 치명적일 때 확인하는 지표
- “실제로 맞는 것 중 맞았다고 예측한 것”
- TP / (TP + FN)
- F1 점수 (F1-score):
- 정밀도와 재현율의 조화 평균
- 두 지표의 균형을 한눈에 파악할 때 확인하는 지표
- 2TP / (2TP + FP + FN)
- 혼동 행렬 (Confusion Matrix): 모델이 어떤 유형의 리뷰를 주로 잘못 분류하는지 상세히 분석하는 도구
4. 실무 핵심 개념 및 주의사항
- 데이터 누수 (Data Leakage):
- 테스트 데이터의 정보가 학습 과정에 섞이는 '반칙' 상황
- 성능이 비정상적으로 너무 좋다면 이를 의심해야 함
- fit_transform 주의: 훈련 데이터에는 학습과 변환을 동시에 수행하는 fit_transform을 쓰지만, 테스트 데이터에는 이미 학습된 기준을 그대로 적용하기 위해 transform만 사용해야 함
- char n-gram:
- 단어 단위가 아닌 '글자 조합(2~4글자)'으로 특성을 추출하는 기법
- KoNLPy 같은 형태소 분석기 없이도 한국어의 의미를 잘 파악할 수 있는 유용한 팁
5. 마무리
| 개념 | 한 줄 설명 | 현실 팁 |
| 레이블 | 모델에게 알려주는 정답 (1/0) | 레이블 품질이 성능의 절반 |
| 훈련/테스트 분리 | 보지 않은 데이터로 진짜 성능 측정 | 80:20 또는 75:25가 일반적 |
| 데이터 누수 | 테스트 정보가 학습에 섞이는 반칙 | 성능이 너무 좋으면 의심하라 |
| char n-gram | 2~4글자 조합으로 특성 추출 | KoNLPy 없이도 한국어 잘 됨 |
| fit_transform | 훈련 데이터: 학습 + 변환 | 테스트엔 절대 fit 금지 |
| 나이브 베이즈 | 단어 확률로 분류, 빠름 | 데이터 적을 때 먼저 시도 |
| 로지스틱 회귀 | 단어 가중치로 분류, 해석 가능 | 가중치로 모델 디버깅 가능 |
| Precision | 예측의 정확성 | 오탐이 치명적일 때 중요 |
| Recall | 실제를 빠짐없이 찾기 | 미탐이 치명적일 때 중요 |
| F1 | 두 지표의 균형 | 일반적 상황에서 기본 지표 |
AI_Agent/Text _Analysis_and_LLM/[BDA]_4주차_텍스트_분류.ipynb at main · 427paul/AI_Agent
Contribute to 427paul/AI_Agent development by creating an account on GitHub.
github.com
'AI Agent > 텍스트 분석과 LLM' 카테고리의 다른 글
| 7. Transformer — Attention Is All You Need (0) | 2026.07.09 |
|---|---|
| 6. 텍스트 분석을 위한 딥러닝 기초 (1) | 2026.06.30 |
| 5. 단어 임베딩 — Word2Vec (0) | 2026.06.24 |
| 2. 텍스트 전처리(Text Preprocessing) (0) | 2026.05.26 |
| 1. 텍스트 분석 입문 및 환경 설정 (0) | 2026.05.24 |