brunch

Python으로 자연어 분석하기 (2) 감정 분류

by 노다해

[피드백]

사전 학습된 머신을 사용하기 보다는 gpt/Gemini api 사용하는게 훨씬 더 잘됨


+ 로컬의 GPU 의존성도 없고, 더 좋은 하드웨어 활용 가능

다만 gpt는 free trial이 적은데, Gemini는 조금 더 많아서 Gemini 추천


Q. 그러면 머신러닝은 언제 쓰지?


A.

머신러닝은 모델이 단순해서 사람이 이해하기 쉽다는 장점

AI가 훨씬 잘하지만 내부 메커니즘을 알 수가 없는


같은 이유로 머신러닝보다 더 단순한 선형회귀를 쓰는 이유는,

독립/종속 관계를 수식으로 알아낼 수 있다


모델이 단순할수록 해석이 용이함


-----------------------------------------------------------------


[느낀점]


컴퓨터는 반복 작업을 수행하는데에 유용하고,

반복 작업의 방향, 해석의 기준 등은 사람이 설정한다는 점을

다시 한 번 느꼈다.



-----------------------------------------------------------------


1. 감정 분석(Sentiment analysis)


감정 분석의 결과는 긍정/부정/중립이고, 정도를 숫자로 나타내기도 한다.

한국어에서는 KnuSentiLex가 유명한 듯 한데, 이건 21년도 이후로 업데잇이 안되고 있다.

이건 어절마다 점수가 매겨져 있는데, 점수는 -2 ~ +2의 범위를 가진다.


감정 분석은 문장의 각 어절마다의 점수를 합산해서 특정 문장의 긍부정 점수를 매기는 방식이다.

KnuSentiLex는 어미도 포함한 어절 마다 점수를 매기기는 했지만,

나는 이전에 형태소 분석 해두었던게 있어서 그걸 활용했다.


아무래도 어미 변형을 제거하면 예외처리할 일도 없고 간편하겠지.

그런데 단순히 긍/부정 만으로 나누기는 한계가 느껴져서 감정 분류로 넘어갔다.



2. 감정 분류(Emotion Classification)


감정 분류에서는 문장을 그대로 사용한다.


감정 분류는 방법이 여러가지가 있는데, 나는 챗GPT가 추천해준 Zero Shot 방법을 썼다.


Zero Shot은 사용자가 지정한 카테고리에 따라 문장을 분류해준다.


입력 문장과 가설 문장("입력 문장은 분노를 표현한다")의 관계를 Yes/Neutral/No로 나누고,

Yes일 확률을 계산하여, 확률이 가장 높은 감정 후보를 선택하는 방식이다.


확률 계산에는 사전 학습된 한국어 NLI 모델을 활용한다.

* 자연어 추론(Natural Language Inference, NLI)



Zero Shot은 학습 기반이기는 해도, 로컬에서 GPU가 없어도 사용할 수는 있다.

다만 굉장히 느리고, 지피티 말에 따르면 속도가 10~20배는 차이가 난다고 한다.



처음에는 이런 분류를 이용해서 진행했다.


emotion_labels = ["기쁨", "슬픔", "우려", "분노", "신뢰", "놀람"]


그런데 내가 데이터 정제했을 때의 기억으로 "놀람"은 알맞은 분석이 아닌 듯 했다.


Zero Shot은 꼭 감정이 아니어도 된다 그래서 아래처럼 카테고리를 늘려주었다.

그랬더니 처음에 "놀람"으로 분류된 문장은 새로 추가된 카테고리로 분류되었다.


emotion_labels = ["기쁨", "슬픔", "우려", "분노", "신뢰", "놀람", "당위", "주장", "제안", "긍정", "부정"]



Zero shot은 문장마다 속하는 카테고리와, 해당 카테고리에 확률를 알려준다.

확률 범위 해석은 이 정도로 하면 된다.


0.7 이상 강한 감정 확신 (자신감 있음)

0.4 ~ 0.7 어느 정도 명확한 감정 (보통 해석 가능)

0.2 ~ 0.4 애매하거나 감정 표현이 약함

0.2 이하 감정이 분산돼 있거나 중립적일 가능성 ↑





** 코드는 네이버 블로그를 참고해주세요.

https://blog.naver.com/ekgo48sun/223910281360

keyword
매거진의 이전글Python으로 자연어 분석하기 (1) 형태소 분석