working_helen

[감정 분석 모델] 한국어 감정 분석 데이터셋 KOTE 논문 리뷰 / Python에서 KOTE 모델 사용하기 본문

deep daiv./NLP project

[감정 분석 모델] 한국어 감정 분석 데이터셋 KOTE 논문 리뷰 / Python에서 KOTE 모델 사용하기

HaeWon_Seo 2024. 9. 12. 11:09

마켓컬리 리뷰 텍스트에 대하여 긍정/부정/중립 감정 라벨리을 위하여 감정분석 모델을 사용하는 과정에서 학습한 KOTE 데이터셋과 KOTE를 활용한 fine-tuning 모델에 대해 정리해본다.

 

 

1. KOTE 

2. 논문 리뷰 : User Guide for KOTE

3. Python에서 KOTE 모델 사용하기 

 


1. KOTE 

1) KOTE (Korean Online That-gul Emotions) 데이터셋 
- 서울대학교 심리학과 연구실에서 개발한 데이터셋
- 한국어 텍스트 내 감정을 43개로 분류한 후 
  자체적으로 수집한 온라인 댓글 데이터에 대하여 라벨링 


2) KOTE fine-tuning 모델
KcELECTRA를 pre-trained 모델로, KOTE를 데이터로 사용하여 fine-tuning한 한국어 감정분석 모델
- 3가지 패키지 사용 : pytorch, pytorch-lightning, transformers

* PyTorch Lightning (참고링크 : https://wikidocs.net/156985)
: PyTorch에 대한 High-level 인터페이스를 제공하는 오픈소스 Python 라이브러리  

* Transformers
: Hugging Face는 NLP task를 위한 오픈소스 라이브러리와 모델, 데이터, API 허브를 제공하는 플랫폼이며, 특히 다양한 트랜스포머 기반 사전학습 모델(BERT, GPT, ELECTRA 등)을 손쉽게 불러와 활용 가능 

 

 

 

 

 

 

2. 논문 리뷰 

논문명 : User Guide for KOTE: Korean Online Comments Emotions Dataset

저자명 : Duyoung Jeon, Junho Lee, Cheongtag Kim

https://arxiv.org/abs/2205.05300

 

User Guide for KOTE: Korean Online Comments Emotions Dataset

Sentiment analysis that classifies data into positive or negative has been dominantly used to recognize emotional aspects of texts, despite the deficit of thorough examination of emotional meanings. Recently, corpora labeled with more than just valence are

arxiv.org

 

✏️ 논문 내용 정리 

" KOTE라는 새로운 한국어 감정 데이터셋을 구축 "

- 새로운 감정 분류 제시 : 한국어 '감정 단어'를 43개의 감정 클러스터로 분류

- 12개의 도메인에서 수집된 5만개의 온라인 댓글에 대하여 감정 라벨링 
- KOTE로 fine-tuning한 감정 분석 모델이 좋은 성능을 보임 


- KOTE 구축 과정
① 새로운 한국어 감정 분류 구축
: 기존의 한국어 사전으로부터 '감정 단어' dataset 구축
fastText로 '감정 단어' word embedding
'감정 단어'의 word embedding 벡터를 클러스터링
클러스터별로 의미 해석을 통해 해석가능한 43가지 감정 클러스터 확정

② 데이터 수집 및 감정 라벨링 
: 다양한 12개의 도메인에서 5만개의 온라인 댓글 수집
3084명의 모국어가 한국어인 rater들의 크라우드소싱을 통해 labeling
1개의 댓글은 결과적으로 평균 7.91개의 감정 분류로 라벨링 


- KOTE를 사용한 감정 분석 모델 fine-tuning
: pre-trained 모델로 KcELECTRA를 사용 + pre-trained 모델의 마지막 hidden layer [CLS] 토큰에 1개의 linear layer를 삽입해 multi-label classification 모델 구조로 변환 

 

 

 

 

▶ 0. Abstract

 

- 대부분의 한국어 감정 코퍼스는 instance의 수가 적고, 제한된 범위의 감정만 포괄함 
- KOTE에는 5만개의 한국어 온라인 댓글로 구성
- 크라우드소싱을 통해 각각의 댓글을 43개의 감정 label 또는 'NO EMOTION'으로 수동 labeling 
-  43개의 감정 분류는 워드 임베딩 공간에 표현된 한국어 감정 개념의 클러스터링을 통해 체계적으로 정함

 

 


1. Introduction


- 일반적으론 감정을 긍정 혹은 부정으로 분류하는 방식의 감정 분석이 주로 사용되어 옴 
- 언어 모델의 발전으로 더 정교한 감정들에 대해서도 분석할 필요성이 제기 
- 이전까지는 한국어 자연어 감정분석을 위해 GoEmotions(영어 데이터셋)을 기계번역하여 사용하는 방식을 주로 사용해왔지만, 감정은 문화적 산물로써 각 나라의 문화와 강력하게 관련되어 있기 때문에 감정의 분류 또한 문화마다 달라야 함 

- KOTE는 43개의 감정에 대해 labeled된 5만개의 한국어 댓글 데이터셋
- 온라인 댓글은 12개의 플랫폼에서 수집 : 뉴스, 온라인 커뮤니티, 소셜미디어, 전자 상거래, 비디오 플랫폼, 영화 리뷰, 마이크로블로그, 포럼
- 사전 학습된 KcELECTRA 모델을 KOTE로 fine-tuning한 결과, 기계번역을 거친 GoEmotions로 학습된 기존 모델보다 더 나은 성능을 달성
- 한국어에 적합한 새로운 감정 분류 데이터셋을 제안했다는 의의 


 


3. Korean Emotion Taxonomy


- 새로운 한국어 감정 분류를 구축한 과정 
- 한국어 사전으로부터 '감정 단어' 식별하여 '감정 단어' dataset 구축 
  → '감정 단어'를 word embedding 모델에 입력해 단어에 대한 임베딩 벡터 생성 
  '감정 단어'의 임베딩 벡터를 클러스터링

  → 클러스터별로 의미 해석을 통해 감정 분류 확정 


3.1 Emotion Words


- '감정 단어' dataset을 구축한 과정 
- Korean Emotion Words Inventory, Korean Emotion Vocabulary Taxonomy, KNU SentiLex 3가지 사전 데이터셋 사용 
- Bi-LSTM을 사용하여 어휘들을 읽어 한국어 사전 밖에 있는 감정 표현들은 사전 필터링
  →  감정에 관한 속어 및 이모티콘들은 수동적으로 추가
  →  human rater들의 검토를 통해 각 표현의 감정이 무엇인지 확정
  →  감정을 비유적으로 표현하는 일부 표현 삭제
  →  KoNLPy를 사용한 토큰화로 기능어와 불용어를 삭제

 

=> 인간의 감정을 직접적으로 나타낸다고 생각되는 3,017개의 표현으로 구성된 '감정 단어' dataset 

 


3.2 Word Vectorization


- 3017개의 '감정 단어'들을 fastText 모델로 벡터화

* FastText
: 페이스북에서 개발한 Word Embedding 모델 
- Word2Vec이 단어를 최소 단위로 보았던 것과 달리 단어를 서브워드(subword)로 분해하여 학습 
- 각 단어는 글자를 단위로 n-gram의 구성으로 인식됨
- n의 최소값과 최대값으로 범위를 설정하면 각 단어로부터 가능한 모든 n-gram subwords를 추출
 → 해당 단어의 임베딩 벡터값은 모든 subwords의 임베딩 벡터값들의 총 합으로 계산 

- Out Of Vocabulary(OOV) : 새로운 단어에 대해선 임베딩할 수 없었던 Word2Vec와 달리, FastText에선 현재 데이터셋의 단어들의 n-gram 중에서 일부를 조합함으로써 새로운 단어의 임베딩 벡터를 생성 가능 
- rare word : 신조어, 희소 단어에 대해서도 현재 데이터셋의 단어들의 n-gram 중에서 겹치는 부분을 찾아냄으로써 Word2Ve에 비해 어느 정도 유의미한 벡터 표현을 생성 가능 
- 실제 많은 비정형 데이터에는 오타가 섞여있고, 이 오타들은 기존 데이터셋에 존재하지 않았기 때문에 Word2Vec을 사용하면 제대로 임베딩되지 않지만, FastText는 이에 대해서도 더 나은 성능을 보임 

(참고링크) https://wikidocs.net/22883 

 

 

 

3.3 Exploring Dimensionality of Emotion

 

- '감정 단어' 임베딩 벡터를 clustering하는 과정 

- UMAP(Uniform Manifold Approximation and Projection)을 사용한 차원 축소가 수행

  → HDBSCAN(Hierarchical Density-Based Spatial Clustering of Application with Noise)으로 클러스터링 

  → 136개의 클러스터로 분할됨 

  → 클러스터의 해석 가능성이 명확한 43가지 감정으로 확정 

43가지 감정 종류

 

 


4. KOTE

: 3번에서 구축한 새로운 감정 클러스터 내 43개의 감정을 사용해

  5만개의 온라인 댓글 한국어 데이터셋을 labeling


4.1 Text

 

- 일반적인 온라인 환경을 포괄하기 위해 다양한 12개의 도메인에서 5만개의 온라인 댓글 수집
- text의 최소 길이는 10, 최대 길이는 각 플랫폼의 90번째 백분위수로 설정
  즉 각 플랫폼마다 가장 긴 텍스트의 상위 10%의 길이보다 짧은 텍스트만 수집
- 최대 길이는 404, 평균은 57.32, 중간값은 42
- 모든 텍스트에서 사용자 ID와 같은 개인 정보는 원본을 남기지 않고 삭제


4.2 Label

 

- 5만개의 온라인 댓글들이 크라우드소싱을 통해 labeling
- 3084명의 모국어가 한국어인 rater들이 보수를 받고 라벨링을 진행
- 5명의 랜덤하게 선택된 rater들은 1개의 댓글에 배정되어 각 댓글마다 5개씩 binary label이 생성
  → 5개의 label이 합쳐지면서 label에서 각 원소의 값 범위는 0-5가 됨 

 


4.4 Finetuning

 

: KOTE를 이용해 한국어 감정분류 모델을 fine-tuning 


① Preparation : 학습 데이터 준비 
- 0에서 5의 범위를 가지는 label 원소 값들을 0 또는 1로 변환 
  → 각 댓글의 label 원소 값들에 대해 minmax scaling
  → scaling 이후 점수가 0.2 이상이면 1로, 이하이면 0으로 변환
  → 1개의 댓글은 결과적으로 평균 7.91개의 감정을 보유 
       (label 원소값이 1인 감정이 평균 7.91개)

 

Training : 모델 학습 
- pre-trained 언어모델 KcELECTRA를 3개의 패키지로 finetuning : pytorch, pytorch-lightning, transformers
- Batch size = 32, Epoch = 최대 15
- Loss = 각 label별 binary cross entropy
- input token size= 512, input의 token의 수가 512보다 적으면 [PAD] 토큰으로 패딩
- 마지막 hidden layer의 [CLS] 토큰에 1개의 linear layer를 삽입해 multi-label classification 
- [CLS], [SEP], [PAD]를 제외한 5%의 토큰들을 랜덤한 토큰으로 바꾸며, 5%의 토큰은 [MASK] 토큰으로 교체하여 학습

 

 

 

 

 

 

3. Python에서 KOTE 모델 사용하기 

➡️ KOTE를 사용해 KcELECTRA을 fine-tuning한 모델로 감정분석 진행 

- 현재 리뷰 데이터에는 구어적 표현, 오타나 비문, 신조어 등 온라인 텍스트의 특성 많음 + 비정형화
→ KOTE는 12개의 다양한 플랫폼에서 수집한 댓글 데이터로 일반적인 온라인 환경을 포괄 
    다른 정제된 텍스트 데이터 혹은 대화 및 음성에서 추출된 데이터에 비해 본 프로젝트의 데이터와
    내용이나 형태가 더 유사할 것이라 판단, 본 프로젝트 데이터에서 정확도가 높을 것이라 판단 
→ KOTE fine-tuning은 KcELECTRA pre-trained 모델로 사용하는데, 이 KcELECTRA는
    댓글 데이터를 학습데이터로 사용하여 구어체, 신조어, 오탈자 등이 많이 포함되는 특성을 가지는
    텍스트도 적절히 처리할 수 있는 언어모델이므로 리뷰 데이터에도 적절하다고 판단 

- 긍정/부정이 아닌 긍정/부정/중립 3가지 카테고리로 라벨링하고자 함 
→  KOTE는 매우 세분화된 43가지 감정 분류를 가지고 있으며
     논문에서 제시한 방식에 따라 긍정/부정/중립 3가지 카테고리로 재분류 가능  

- 현재 약 150만개에 달하는 텍스트 데이터
→ 모델 속도가 더 빠른 kote_for_easygoing_people를 사용 

 

 

hugging face KOTE dataset : https://huggingface.co/datasets/searle-j/kote

 

searle-j/kote · Datasets at Hugging Face

YAML Metadata Warning: The task_ids "text-classification-other-emotion" is not in the official list: acceptability-classification, entity-linking-classification, fact-checking, intent-classification, language-identification, multi-class-classification, mul

huggingface.co

 

hugging face KOTE fine-tuning 모델1 : https://huggingface.co/searle-j/kote_for_easygoing_people

 

searle-j/kote_for_easygoing_people · Hugging Face

README.md exists but content is empty. Use the Edit model card button to edit it.

huggingface.co

 

hugging face KOTE fine-tuning 모델2 : https://huggingface.co/searle-j/kote_for_meticulous_people

 

searle-j/kote_for_meticulous_people · Hugging Face

README.md exists but content is empty. Use the Edit model card button to edit it.

huggingface.co

 

 

 

1) KOTE 데이터셋 탐색 

- 5만개의 데이터 → train 4만개, validation 5천개, test 5천개 

 

 

2) KOTE 모델 불러와 사용하기 

 

TextClassificationPipeline

- hugging face의 transformers 라이브러리에서 제공하는 파이프라인 중 하나 

- device 설정을 통해 원하는 GPU 혹은 CPU를 사용하여 연산 가능 

- 분류모델과 토크나이저를 지정하면 입력 텍스트에 대하여 설정된 분류 task를 수행

- Sentiment Analysis, Topic Classification, Intent Classification, Spam Detection 등에 사용 가능 

import torch
device = "cuda" if torch.cuda.is_available() else "cpu"

from transformers import AutoTokenizer, AutoModelForSequenceClassification

# hugging face에서 토크나이저와 모델 불러오기
tokenizer = AutoTokenizer.from_pretrained("searle-j/kote_for_easygoing_people")
model = AutoModelForSequenceClassification.from_pretrained("searle-j/kote_for_easygoing_people")

# 감정 분석 모델 설정 
pipe = TextClassificationPipeline(
        model=model,
        tokenizer=tokenizer,
        device=-1, # gpu number, -1 if cpu used
        return_all_scores=True,
        function_to_apply='sigmoid'
    )

 

모델이 계산한 text의 첫번째 문장이 각 감정 분류에 해당될 확률을 출력한 결과

# pipe를 거친 결과들에 대하여
# 각 감정에 해당할 확률(score)이 0.4 이상인 감정들만 출력

for i in range(len(pipe_text)):
    print(text[i])
    for output in pipe_text[i]:
        if output["score"] > 0.4:
            print(output)
    print("\n")

text의 각 문장의 score가 0.4 이상인 감정들

 

 

 

 

 

 

 

 

Reference

https://brunch.co.kr/@hrkaylee/11
https://dontn.tistory.com/m/entry/User-Guide-for-KOTE-Korean-Online-Comments-Emotions-Dataset

https://github.com/searle-j/KOTE?tab=readme-ov-file
https://github.com/boostcampaitech3/final-project-level3-nlp-07/tree/master