# Text Classification ## 정의 텍스트 분류(Text Classification)는 **주어진 텍스트를 사전 정의된 카테고리 중 하나로 분류하는 NLP 작업**이다. 감정 분석, 스팸 탐지, 주제 분류 등 다양한 실무 응용 분야가 있다. ## 주요 작업 유형 ### 1. 감정 분석 (Sentiment Analysis) **정의**: 텍스트의 긍정/부정/중립 감정 판단 ``` 입력: "이 제품은 정말 훌륭합니다!" 출력: 긍정 (confidence: 0.95) 입력: "최악의 경험이었어요" 출력: 부정 (confidence: 0.92) 입력: "이 제품은 파란색이다" 출력: 중립 (confidence: 0.88) ``` **응용:** - 상품 리뷰 분석 - 소셜 미디어 모니터링 - 고객 피드백 수집 - 브랜드 평판 관리 ### 2. 스팸 탐지 (Spam Detection) **정의**: 이메일, SMS, 댓글이 스팸인지 판단 ``` 입력: "로또 당첨! 지금 클릭하세요!" 출력: 스팸 (confidence: 0.99) 입력: "회의 시간이 내일 3시로 변경되었습니다" 출력: 정상 (confidence: 0.98) ``` **응용:** - 이메일 필터링 - SMS 스팸 차단 - 댓글 모더레이션 - 악성 링크 탐지 ### 3. 주제 분류 (Topic Classification) **정의**: 텍스트의 주제를 분류 ``` 입력: "국내총생산이 3.2% 증가했습니다" 출력: 경제 입력: "새로운 바이러스 변종이 발견되었습니다" 출력: 건강/과학 입력: "경기 결과: 2:1로 승리" 출력: 스포츠 ``` **응용:** - 뉴스 분류 - 문서 라우팅 - 고객 티켓 자동 분류 - 검색 엔진 카테고리화 ### 4. 의도 분류 (Intent Classification) **정의**: 사용자의 의도 파악 ``` 입력: "날씨 어때?" 출력: 날씨_조회 입력: "내일 회의 일정 추가" 출력: 일정_관리 입력: "비행기 표 예약하고 싶어" 출력: 예약_요청 ``` **응용:** - 챗봇 요청 라우팅 - 가상 어시스턴트 - 음성 명령 처리 - IVR 시스템 ## 아키텍처 ### 1. 고전적 방법 ``` 텍스트: "이 영화는 정말 좋았어요" ↓ 전처리 (토큰화, 소문자화) ↓ 특성 추출: - Bag of Words (단어 빈도) - TF-IDF (가중치) - N-grams ↓ 분류 모델 (SVM, 나이브 베이즈, 로지스틱 회귀) ↓ 출력: 긍정 (0.87) ``` **장점:** 빠름, 해석 가능 **단점:** 문맥 무시, 신조어 약함 ### 2. 딥러닝 (CNN/RNN) ``` 텍스트: "이 영화는 정말 좋았어요" ↓ Embedding (각 단어를 벡터로) [이, 영화, 는, 정말, 좋, 았, 어, 요] ↓ CNN 또는 RNN (문맥 학습) ↓ Global Max/Average Pooling (특성 축약) ↓ Dense Layer (분류) ↓ Softmax ↓ 출력: 긍정 (0.92) ``` **장점:** 문맥 이해, 신조어 처리 **단점:** 데이터 필요, 해석 어려움 ### 3. Transformer 기반 (최신) ``` 텍스트: "이 영화는 정말 좋았어요" ↓ Token Embedding ↓ Transformer (Self-Attention) (각 토큰이 다른 모든 토큰과 상호작용) ↓ [CLS] 토큰 (문장 표현) ↓ Classification Head (1~2개 Dense Layer) ↓ Softmax ↓ 출력: 긍정 (0.96) ``` **장점:** 최고 성능, 양방향 문맥, 전이학습 **단점:** 계산량 많음, GPU 필요 ## 주요 모델 선택 | 모델 | 강점 | 약점 | 용도 | |------|------|------|------| | **BERT** | 양방향, 양호 성능 | 생성 불가 | 분류 작업 표준 | | **RoBERTa** | BERT 개선, +1-2% | 같은 비용 | 고성능 필요 | | **DistilBERT** | 빠름, 작음 | 성능 -3% | 속도 우선 | | **GPT-3.5** | 일반화 좋음 | 비용 높음 | Few-shot 가능 | | **T5** | 유연한 프롬프트 | 느림 | 여러 작업 통합 | | **LLaMA** | 오픈소스 | 성능 변동 | 커스텀 배포 | ## 실전 구현 (BERT 예제) ### Step 1: 데이터 준비 ```python # 감정 분석 데이터셋 train_texts = [ "이 영화는 정말 좋았어요", # 긍정 "최악의 경험입니다", # 부정 "평범했어요", # 중립 ] train_labels = [1, 0, 2] # 긍정=1, 부정=0, 중립=2 ``` ### Step 2: 모델 로드 ```python from transformers import BertTokenizer, BertForSequenceClassification import torch # 사전학습 모델 로드 tokenizer = BertTokenizer.from_pretrained('bert-base-multilingual-cased') model = BertForSequenceClassification.from_pretrained( 'bert-base-multilingual-cased', num_labels=3 # 3개 클래스 ) ``` ### Step 3: Fine-tuning ```python # 옵티마이저 from torch.optim import AdamW optimizer = AdamW(model.parameters(), lr=2e-5) # 학습 루프 for epoch in range(3): for text, label in zip(train_texts, train_labels): # 토큰화 inputs = tokenizer( text, return_tensors='pt', max_length=128, padding=True, truncation=True ) # 포워드 outputs = model(**inputs, labels=torch.tensor([label])) loss = outputs.loss # 역전파 loss.backward() optimizer.step() optimizer.zero_grad() ``` ### Step 4: 추론 ```python # 평가 모드 model.eval() # 새로운 텍스트 new_text = "이 제품은 훌륭합니다" inputs = tokenizer(new_text, return_tensors='pt') with torch.no_grad(): outputs = model(**inputs) # 예측 logits = outputs.logits prediction = torch.argmax(logits, dim=1) confidence = torch.softmax(logits, dim=1)[0].max() print(f"클래스: {prediction.item()}, 신뢰도: {confidence:.2%}") ``` ## 평가 지표 ### 1. 이진 분류 (Binary Classification) ``` 혼동 행렬 (Confusion Matrix): 예측_긍정 예측_부정 실제_긍정 TP FN 실제_부정 FP TN 정확도 (Accuracy) = (TP + TN) / (TP + TN + FP + FN) 정밀도 (Precision) = TP / (TP + FP) [긍정이라고 한 것 중 맞은 것] 재현율 (Recall) = TP / (TP + FN) [실제 긍정 중 찾은 것] F1 = 2 × (정밀도 × 재현율) / (정밀도 + 재현율) ``` ### 2. 다중 분류 (Multi-class) ``` Macro F1: 각 클래스별 F1의 평균 Weighted F1: 클래스 빈도를 고려한 F1 ``` ## 최적화 기법 ### 1. 클래스 불균형 (Class Imbalance) ``` 문제: 스팸 0.1%, 정상 99.9% 결과: 항상 "정상"이라고 예측해도 정확도 99.9% (의미 없음) 해결책: - Weighted Loss: 드문 클래스에 높은 가중치 - Oversampling: 드문 클래스 복제 - Undersampling: 흔한 클래스 제거 - Focal Loss: 어려운 샘플에 집중 ``` ### 2. 데이터 부족 ``` 해결책: - Transfer Learning (사전학습 모델 사용) - Data Augmentation (텍스트 생성/회전) - Few-shot Learning (적은 예시) - Prompt-based Learning (프롬프트) ``` ### 3. 계산 효율화 ``` 크기 줄이기: - DistilBERT, ALBERT (경량화) - Quantization (양자화) - Pruning (가지치기) 추론 가속: - Batch Processing - ONNX Export - TensorRT ``` ## 실무 가이드 ### 좋은 선택 ✅ **상황:** - 명확한 카테고리가 정의됨 - 충분한 라벨링 데이터 있음 (100+ 샘플) - 정확한 분류 필요 ✅ **모델:** - 소규모: DistilBERT, 규칙 기반 - 중규모: BERT, RoBERTa - 대규모: GPT-3.5, Claude ### 피해야 할 때 ❌ **상황:** - 모호한 경계 - 데이터 매우 부족 (<10 샘플) - 매우 노이즈 많음 ## 현대적 위치 (2024-2026) ### 트렌드 ``` 2018-2020: BERT 시대, 높은 정확도 2021-2023: 경량 모델 (DistilBERT, ALBERT) 2024-2026: - LLM 기반 Few-shot 분류 - 멀티모달 분류 (이미지+텍스트) - Zero-shot 분류 (레이블 없이) ``` ### Zero-shot Classification ``` 사전학습 LLM 활용: "이 영화는 정말 좋았어요" 레이블들: ["긍정", "부정", "중립"] LLM이 직접 분류 (학습 필요 없음) → 출력: "긍정" 장점: 재학습 불필요, 유연함 단점: 성능 변동, 비용 ``` ## 관련 개념 - [[ai/nlp/concepts/bert|BERT]] — 분류의 표준 모델 - [[ai/nlp/concepts/gpt-series|GPT Series]] — Few-shot 분류 - [[ai/algorithms/transformer/concepts/transformer|Transformer]] — 기초 아키텍처 - [[ai/nlp/concepts/named-entity-recognition|Named Entity Recognition]] — 비슷한 NLP 작업 ## 참고 자료 - **Devlin et al. (2018)**: BERT 논문 - **Hugging Face**: Text Classification 튜토리얼 - **SQuAD, SST-2**: 표준 벤치마크 데이터셋