working_helen
[리뷰 감정분석] KOTE 논문 리뷰 / KOTE fine-tuning 모델을 활용한 감정분석 본문
[리뷰 감정분석] 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
✏️ 논문 내용 정리
" 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가지 감정으로 확정
▶ 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
hugging face KOTE fine-tuning 모델1 : https://huggingface.co/searle-j/kote_for_easygoing_people
hugging face KOTE fine-tuning 모델2 : https://huggingface.co/searle-j/kote_for_meticulous_people
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")
4. 감정분석 결과
- 감정 분석 결과 각 43가지 감정에 해당될 확률값을 출력
- 긍정/부정/중립 중 하나로 결정하는 3가지 방법 시도
- sentiment_ver1 확률이 최대인 감정이 속한 sentiment로
- sentiment_ver2 긍정/부정/중립 평균 확률을 계산하고 최대 확률인 sentiment로
- sentiment_ver3 확률이 0.4가 넘는 감정들의 voting 결과 sentiment로
- 3가지 방식에서 분류 결과에 큰 차이를 보이지 않았으며,
3가지 방식 모두 리뷰 문장에서 감정 분석의 정확도가 떨어지는 모습을 보임
➡️ 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
'deep daiv. > NLP project' 카테고리의 다른 글
[키워드 추출] Llama를 이용한 리뷰 키워드 추출 및 카테고리 선정 (0) | 2024.09.15 |
---|---|
[모델링] LLM : OpenAI GPT & Meta Llama / LLM few-shot prompting (0) | 2024.09.15 |
[리뷰 감정분석] ELECTRA / Korean Pre-trained Language Models (6) | 2024.09.08 |
[데이터 전처리] 마켓컬리 리뷰 데이터 전처리 / kiwipiepy 형태소 분석기 (2) | 2024.09.05 |
[프롬프트 엔지니어링] 프롬프트 엔지니어링 연습 with ChatGPT Prompt Engineering for Developers (2) | 2024.09.01 |