KPoEM (Korean Poetry Emotion Mapping) 모델은 한국 근대시에 특화된 KcELECTRA 기반의 감정 분류 모델로, KcELECTRA-base에 KOTE dataset을 파인튜닝한 모델을, 다시 KPoEM dataset으로 파인튜닝하여 구현한 모델입니다.
Resources
모델 학습에 사용한 자원들은 아래 링크에서 확인하실 수 있습니다.
- 데이터세트: Zenodo, KPoEM dataset
- 파인튜닝 소스코드: GitHub, AKS-DHLAB/KPoEM
Model
KPoEM 모델의 활용은 다음의 코드를 참고해 주시기를 바랍니다.
# 필요 라이브러리 설치 (최초 1회만 실행)
!pip install -q transformers torch huggingface_hub
# 라이브러리 임포트
import torch
import torch.nn as nn
from transformers import AutoModel, AutoTokenizer
from huggingface_hub import hf_hub_download
# 기초 세팅
REPO_ID = "AKS-DHLAB/KPoEM"
DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# KPoEM_Classifier 클래스
class KPoEM_Classifier(nn.Module):
# 클래스 생성 시 모든 초기화(모델/토크나이저/가중치 로드) 수행
def __init__(self, repo_id, device):
self.labels = [
'불평/불만', '환영/호의', '감동/감탄', '지긋지긋', '고마움', '슬픔', '화남/분노', '존경',
'기대감', '우쭐댐/무시함', '안타까움/실망', '비장함', '의심/불신', '뿌듯함', '편안/쾌적',
'신기함/관심', '아껴주는', '부끄러움', '공포/무서움', '절망', '한심함', '역겨움/징그러움',
'짜증', '어이없음', '없음', '패배/자기혐오', '귀찮음', '힘듦/지침', '즐거움/신남', '깨달음',
'죄책감', '증오/혐오', '흐뭇함(귀여움/예쁨)', '당황/난처', '경악', '부담/안_내킴', '서러움',
'재미없음', '불쌍함/연민', '놀람', '행복', '불안/걱정', '기쁨', '안심/신뢰'
]
num_labels = len(self.labels)
super().__init__()
self.device = device
self.tokenizer = AutoTokenizer.from_pretrained(repo_id)
self.electra = AutoModel.from_pretrained(repo_id)
self.classifier = nn.Sequential(
nn.Dropout(p=0.1),
nn.Linear(self.electra.config.hidden_size, num_labels)
)
weights_path = hf_hub_download(repo_id=repo_id, filename="classifier_state.bin")
self.classifier.load_state_dict(torch.load(weights_path, map_location=self.device))
self.to(self.device)
self.eval()
# 텍스트를 입력받아 최종 logits 반환
def forward(self, text: str):
encoding = self.tokenizer(
text,
add_special_tokens=True,
max_length=512,
padding="max_length",
truncation=True,
return_tensors='pt',
).to(self.device)
with torch.no_grad():
outputs = self.electra(
input_ids=encoding["input_ids"],
attention_mask=encoding["attention_mask"],
token_type_ids=encoding["token_type_ids"]
)
pooled_output = outputs.last_hidden_state[:, 0, :]
logits = self.classifier(pooled_output)
return logits
# 텍스트 분석 결과 출력
def analyze(self, text: str, threshold=0.3):
print(f"\n{'=' * 50}")
print(f"입력 텍스트: \"{text}\"")
logits = self.forward(text)
probabilities = torch.sigmoid(logits.squeeze())
predictions = (probabilities > threshold).int()
detected_emotions = []
for i, label_id in enumerate(predictions):
if label_id == 1:
emotion = self.labels[i]
probability = probabilities[i].item()
detected_emotions.append((emotion, probability))
if not detected_emotions:
print("\n분석 결과: 임계값을 넘는 감정이 감지되지 않았습니다.")
else:
print("\n분석 결과:")
detected_emotions.sort(key=lambda x: x[1], reverse=True)
for emotion, probability in detected_emotions:
print(f"- {emotion} (확률: {probability:.2%})")
# print("-" * 50)
return detected_emotions
# KPoEM 모델 활용
print(f"... '{DEVICE}' 환경에서 '{REPO_ID}' 모델을 로드하고 있습니다 ...")
kpoem_model = KPoEM_Classifier(repo_id=REPO_ID, device=DEVICE)
print("KPoEM 모델을 성공적으로 로드하였습니다.")
# 예시1
example1 = "나의 생은 미친듯이 사랑을 찾아 헤매었으나"
kpoem_model.analyze(example1)
# 예시2
example2 = '''
나의 생은 미친듯이 사랑을 찾아 헤매었으나
단 한번도 스스로를 사랑하지 않았노라
'''
kpoem_model.analyze(example2)
상기 코드의 대화형 환경에서의 실행 결과는 다음과 같습니다.
... 'cpu' 환경에서 'AKS-DHLAB/KPoEM' 모델을 로드하고 있습니다 ...
KPoEM 모델을 성공적으로 로드하였습니다.
==================================================
입력 텍스트: "나의 생은 미친듯이 사랑을 찾아 헤매었으나"
분석 결과:
- 슬픔 (확률: 94.69%)
- 서러움 (확률: 93.75%)
- 안타까움/실망 (확률: 91.97%)
- 불안/걱정 (확률: 77.06%)
- 힘듦/지침 (확률: 71.37%)
- 깨달음 (확률: 68.45%)
- 비장함 (확률: 64.76%)
- 불쌍함/연민 (확률: 61.29%)
- 부담/안_내킴 (확률: 55.76%)
- 기대감 (확률: 47.76%)
- 당황/난처 (확률: 45.01%)
- 패배/자기혐오 (확률: 43.64%)
- 절망 (확률: 42.48%)
- 불평/불만 (확률: 38.77%)
- 아껴주는 (확률: 38.49%)
- 감동/감탄 (확률: 31.01%)
==================================================
입력 텍스트: "
나의 생은 미친듯이 사랑을 찾아 헤매었으나
단 한번도 스스로를 사랑하지 않았노라
"
분석 결과:
- 슬픔 (확률: 94.11%)
- 서러움 (확률: 92.44%)
- 안타까움/실망 (확률: 92.40%)
- 깨달음 (확률: 71.70%)
- 불안/걱정 (확률: 61.84%)
- 힘듦/지침 (확률: 60.10%)
- 불쌍함/연민 (확률: 59.04%)
- 패배/자기혐오 (확률: 55.15%)
- 비장함 (확률: 51.67%)
- 당황/난처 (확률: 48.10%)
- 부담/안_내킴 (확률: 45.45%)
- 절망 (확률: 44.80%)
- 불평/불만 (확률: 38.81%)
- 한심함 (확률: 34.83%)
- 아껴주는 (확률: 30.62%)
- 부끄러움 (확률: 30.03%)
[('슬픔', 0.9411415457725525),
('서러움', 0.9244144558906555),
('안타까움/실망', 0.9239906668663025),
('깨달음', 0.7170049548149109),
('불안/걱정', 0.6184237599372864),
('힘듦/지침', 0.6009577512741089),
('불쌍함/연민', 0.5903952121734619),
('패배/자기혐오', 0.5515390038490295),
('비장함', 0.5166702270507812),
('당황/난처', 0.48103633522987366),
('부담/안_내킴', 0.45452776551246643),
('절망', 0.4479917585849762),
('불평/불만', 0.388106107711792),
('한심함', 0.34834057092666626),
('아껴주는', 0.3062174916267395),
('부끄러움', 0.3003148138523102)]
References
- Downloads last month
- 38
Inference Providers
NEW
This model isn't deployed by any Inference Provider.
🙋
Ask for provider support
Model tree for AKS-DHLAB/KPoEM
Base model
beomi/KcELECTRA-base