KPoEM (Korean Poetry Emotion Mapping) 모델은 한국 근대시에 특화된 KcELECTRA 기반의 감정 분류 모델로, KcELECTRA-baseKOTE dataset을 파인튜닝한 모델을, 다시 KPoEM dataset으로 파인튜닝하여 구현한 모델입니다.

Resources

모델 학습에 사용한 자원들은 아래 링크에서 확인하실 수 있습니다.

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
Safetensors
Model size
108M params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for AKS-DHLAB/KPoEM

Finetuned
(8)
this model