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
다음 칼럼에서는 의미망 분석에 대해서 살펴보도록 하겠습니다.
인스타 주소 🎗
'MLOps > NLP' 카테고리의 다른 글
[NLU] 의미망 분석(Semantic Network Analysis)을 통한 관계 파악 (0) | 2024.11.10 |
---|---|
[NLP] Retriver에서 사용되는 비교분석(Comparative Analysis) (0) | 2024.11.10 |
[NLU] LOR과 TF-IDF를 통한 비교분석(Comparative Analysis) (0) | 2024.11.10 |
[NLU] 기본적인 명사 형태소 분석과 Tokenize의 필요성 (2) | 2024.11.09 |
NLP에 대한 기본 이해 (1) | 2024.11.09 |