rkdaldus/ko-sent5-classification
1297
KoBERT 기반 한국어 감정 분류 모델
이 프로젝트는 한국어 텍스트의 감정을 분류하는 KoBERT 기반의 감정 분류 모델을 학습하고 활용하는 코드를 포함합니다. 이 모델은 입력된 텍스트가 분노(Anger), 두려움(Fear), 기쁨(Happy), 평온(Tender), 슬픔(Sad) 중 어떤 감정에 해당하는지를 예측합니다.
1. 모델 학습 과정
Colab 환경 설정 및 데이터 준비
- 필요 라이브러리 설치:
transformers,datasets,torch,pandas,scikit-learn라이브러리를 설치합니다.
- 데이터 불러오기: ai hub 에 등록된 한국어 감성 대화 데이터로부터 감정 분류용 CSV 파일을 불러옵니다.
- 데이터셋 준비:
- 학습/검증 데이터 분할: 80%는 학습 데이터로, 20%는 검증 데이터로 사용.
- HuggingFace Dataset 형식 변환: Pandas DataFrame을 HuggingFace
Dataset으로 변환. - 레이블 컬럼명 변경: 감정 레이블을 나타내는
label_int컬럼을labels로 변경. - 데이터 토큰화:
monologg/kobert토크나이저를 이용해 입력 텍스트를 토큰화. - 형식 변환:
input_ids,attention_mask,labels만 남겨 학습 준비 완료.
- 모델 및 학습 설정:
- 모델:
monologg/kobert모델을 불러와 5개의 감정 레이블을 분류하도록 설정. - 학습 하이퍼파라미터:
learning_rate=2e-5,num_train_epochs=10,batch_size=16.- F1 스코어를 기반으로 베스트 모델 저장.
- Early stopping 적용.
- 학습 진행 및 모델 저장:
- 학습 완료 후 모델을 Google Drive에 저장.
성능 평가 및 테스트
- 평가 지표: Accuracy, F1 score (macro, weighted) 계산.
- 테스트 데이터 평가: 학습된 모델을 이용해 테스트 데이터셋 평가.
2. 모델 사용 방법
사전 준비
- HuggingFace Hub에서 학습된 모델을 불러와 사용할 수 있습니다.
- 모델 및 토크나이저는
monologg/kobert기반이며, 분류 레이블은 다음과 같습니다: - Anger: 😡
- Fear: 😨
- Happy: 😊
- Tender: 🥰
- Sad: 😢
사용 예시
- 단순 문장 입력 감정 분석:
- 사용자가 입력한 텍스트에 대해 모델이 감정을 예측하고, 각 감정의 확률을 함께 출력합니다.
- 엑셀 파일에서 감정 분석:
- 엑셀 파일에서 지정한 텍스트 열과 행 범위를 읽어와, 해당 텍스트들에 대해 감정을 분류하고 결과를 출력합니다.
코드 사용 예시
# 토크나이저 및 모델 로드
from transformers import AutoTokenizer, AutoModelForSequenceClassification
# KoBERT 토크나이저와 모델 로드
tokenizer = AutoTokenizer.from_pretrained("monologg/kobert", trust_remote_code=True)
model = AutoModelForSequenceClassification.from_pretrained("rkdaldus/ko-sent5-classification")
# 사용자 입력 텍스트 감정 분석
text = "오늘 정말 행복해!"
inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=True)
with torch.no_grad():
outputs = model(**inputs)
predicted_label = torch.argmax(outputs.logits, dim=1).item()
# 감정 레이블 정의
emotion_labels = {
0: ("Angry", "😡"),
1: ("Fear", "😨"),
2: ("Happy", "😊"),
3: ("Tender", "🥰"),
4: ("Sad", "😢")
}
# 예측된 감정 출력
print(f"예측된 감정: {emotion_labels[predicted_label][0]} {emotion_labels[predicted_label][1]}")