working_helen

[리뷰 감정분석] KOTE 논문 리뷰 / KOTE fine-tuning 모델을 활용한 감정분석 본문

deep daiv./NLP project

[리뷰 감정분석] KOTE 논문 리뷰 / KOTE fine-tuning 모델을 활용한 감정분석

HaeWon_Seo 2024. 9. 12. 11:09

각 리뷰들에 대하여 긍정/부정/중립 감정을 라벨링하는 감정분석을 진행한다. 감정분석 모델을 선택하는 과정에서 시도해본 KOTE를 활용한 fine-tuning 모델에 대해 정리해본다.

 

 

1. KOTE 

2. 논문 리뷰 : User Guide for KOTE

3. pre-trained KcELECTRA + KOTE fine-tuning 

4. 감정분석 결과 

 


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. pre-trained KcELECTRA + KOTE fine-tuning 

KOTE를 이용해 KcELECTRA을 fine-tuning 모델로 마켓컬리 리뷰 데이터에 감정분석 시도 

 

- 긍정/부정이 아닌 긍정/부정/중립 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_for_easygoing_people 모델

 

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 = 일부 리뷰 예시문장
pip_text = pipe(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 이상인 감정들

 

 

 

 

 

4. 감정분석 결과 

- 감정 분석 결과 각 43가지 감정에 해당될 확률값을 출력

- 긍정/부정/중립 중 하나로 결정하는 3가지 방법 시도 

  • sentiment_ver1 확률이 최대인 감정이 속한 sentiment로
  • sentiment_ver2 긍정/부정/중립 평균 확률을 계산하고 최대 확률인 sentiment로
  • sentiment_ver3 확률이 0.4가 넘는 감정들의 voting 결과 sentiment로

 

- 3가지 방식에서 분류 결과에 큰 차이를 보이지 않았으며,

  3가지 방식 모두 리뷰 문장에서 감정 분석의 정확도가 떨어지는 모습을 보임

ver1에서 감정을 잘못 분류한 문장 예시

 

 

➡️ KcELECTRA을 fine-tuning 모델은 마켓컬리 리뷰 데이터 감정 분석에 부적절한 것으로 판단
      ELECTRA보다 모델 크기가 더 큰 LLM(Llama와 GPT) 사용을 고려 

 

- ELECTRA는 기존의 BERT 모델의 학습 효율성을 증진하기 위해 고안된 모델

- 모델 크기가 작고 Token-level 학습을 수행 → 긴 문맥을 잘 이해하지 못하고, 다수의 감정이 혼재되거나 세밀한 감정적 뉘앙스가 들어간 문장을 처리하는데 한계가 있음
- Llama나 GPT와 같은 대규모 언어모델 LLM은 대규모 데이터와 파라미터를 기반
- 길고 복잡한 문맥과 표현도 더 잘 처리하며, 간접적이고 다중적인 감정표현에 대해서도 더 잘 포착해냄 

 

 

 

 

 

 

 

 

 

 

 

 

 

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