AI Agent/텍스트 분석과 LLM

4. 텍스트 분류 — 긍정/부정 자동 판단

427paul 2026. 6. 9. 22:23

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 두 지표의 균형 일반적 상황에서 기본 지표

 

 

https://github.com/427paul/AI_Agent/blob/main/Text%20_Analysis_and_LLM/%5BBDA%5D_4%EC%A3%BC%EC%B0%A8_%ED%85%8D%EC%8A%A4%ED%8A%B8_%EB%B6%84%EB%A5%98.ipynb

 

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