본문 바로가기
MLOps/NLP

[NLU] Doc에 대한 감성 분석(Sentiment Analysis)

by Finn# 2024. 11. 10.
728x90

Intro

어떤 문서에 대한 긍정/중립/부정의 감정이 어느정도인지 전체적인 감성이 어떤지에 대한 분석 결과는 해당 문서의 전체적인 감성을 정의함에 유용하게 사용될 수 있을 것입니다. 이런 감정 분석의 결과들이 시간 종속적인 데이터의 결과로 누적되면 감정 변화 패턴이라는 분석의 결과물로도 활용될 수 있을 것입니다. 따라서 자연어를 통해 해당 doc의 감성을 분석하는 방법에 대해서 이해하는 것도 중요한 내용이라 할 수 있습니다.


기준을 어떻게 정의해야하지?

감성 분석의 기준은 특정 토큰을 기준으로 긍정적인지 부정적인지를 수치화해놓은 Vocabulary를 활용해서 점수를 측정합니다. 이 Vocabulary를 감정사전이라고 부릅니다. 이 감정사전을 통해서 각각의 토큰에 대해서 긍정/부정으로 labeling을 할 수 있게 되고 이를 통해 해당 문장에 담긴 토큰의 긍정과 부정 빈도를 계산할 수 있습니다. 이 때 이 두 클래스 긍정/부정에 대해서 LOR을 구하게 되면 긍정이 부정보다 몇배 더 높은 출현 빈도를 가지는지, 부정이 긍정보다 몇배 더 높은 출현 빈도를 가지는지 정량으로 비교해볼 수 있습니다.


실제 코드를 통해 감정분석 살펴보기

실제 코드를 통해서 감정사전을 간단하게 만들어봤고,  이 감정사전에 labeling 된 값에 따라서 해당 Doc에서의 긍정/부정/중립의 빈도가 Count되도록 구현해두었습니다.  추가로 긍정/부정에 대한 전체 빈도를 log odds ratio를 통해 정량화하여 해당 문서에서 긍정/ 부정 출현빈도의 상대적 차이를 알 수 있습니다.

from collections import Counter
import numpy as np

# 간단한 감정 사전 정의 (1: 긍정, -1: 부정)
sentiment_lexicon = {
    "good": 1, "happy": 1, "love": 1, "excellent": 1, "great": 1,
    "bad": -1, "sad": -1, "hate": -1, "terrible": -1, "awful": -1
}

# 예제 문서 정의
doc = "I love this product. It is excellent and makes me very happy, but sometimes it's terrible."

# 문서에서 감정 단어의 빈도 계산 함수
def get_sentiment_counts(doc, lexicon):
    tokens = doc.lower().split()  # 소문자로 토큰화
    sentiment_counts = Counter({1: 0, -1: 0})  # 긍정, 부정 카운트 초기화
    for token in tokens:
        sentiment = lexicon.get(token, 0)  # 감정 사전에 있는 단어만 계산
        if sentiment != 0:
            sentiment_counts[sentiment] += 1
    return sentiment_counts

# 단일 문서의 감정 단어 빈도 계산
sentiment_counts = get_sentiment_counts(doc, sentiment_lexicon)

# Log Odds Ratio 계산
epsilon = 1e-10  # 0으로 나눔 방지용 작은 상수
positive_count = sentiment_counts[1]
negative_count = sentiment_counts[-1]

# 긍정/부정 비율에 대한 Log Odds Ratio
log_odds_ratio = np.log((positive_count + epsilon) / (negative_count + epsilon))

# 결과 출력
print(f"긍정 단어 수: {positive_count}")
print(f"부정 단어 수: {negative_count}")
print(f"Log Odds Ratio (긍정/부정): {log_odds_ratio}")

 

Outro

다음 칼럼에서는 의미망 분석에 대해서 살펴보도록 하겠습니다.

인스타 주소 🎗

https://www.instagram.com/f.inn_sharp/

반응형