# 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**: 표준 벤치마크 데이터셋