감정 분석
Sentiment Analysis
텍스트의 감정/의견 판별. 소셜 미디어 분석, 고객 피드백.
Sentiment Analysis
텍스트의 감정/의견 판별. 소셜 미디어 분석, 고객 피드백.
감정 분석(Sentiment Analysis)은 텍스트에서 표현된 감정, 의견, 태도를 자동으로 식별하고 분류하는 자연어 처리(NLP) 기술입니다. 주로 긍정(Positive), 부정(Negative), 중립(Neutral)의 세 가지로 분류하며, 더 세분화된 분석에서는 기쁨, 슬픔, 분노, 두려움 등 다양한 감정을 탐지합니다.
이 기술은 2000년대 초반 온라인 리뷰 분석의 필요성과 함께 발전했습니다. 초기에는 사전 기반 접근법(감정 어휘 사전 활용)이 주류였으나, 2010년대 들어 머신러닝과 딥러닝의 발전으로 BERT, RoBERTa 등 사전학습 언어 모델을 활용한 방식이 표준이 되었습니다.
감정 분석은 문맥 의존성이 높습니다. "이 영화 정말 죽인다"와 같은 표현에서 '죽인다'는 긍정적 의미로 사용되며, 반어법이나 풍자를 탐지하는 것도 주요 과제입니다. 최신 LLM들은 zero-shot 방식으로 프롬프트만으로 감정 분석이 가능하며, 다국어 지원도 뛰어납니다.
실무에서 감정 분석은 고객 VOC(Voice of Customer) 분석, 소셜 미디어 모니터링, 브랜드 평판 관리, 금융 시장 심리 분석 등에 폭넓게 활용됩니다. 특히 실시간 대량 데이터 처리가 필요한 분야에서 필수적인 기술로 자리잡았습니다.
Hugging Face Transformers를 사용한 한국어 감정 분석 예제입니다.
# pip install transformers torch
from transformers import pipeline
# 다국어 감정 분석 모델 로드
sentiment_analyzer = pipeline(
"sentiment-analysis",
model="nlptown/bert-base-multilingual-uncased-sentiment"
)
# 분석할 텍스트
texts = [
"이 제품 정말 만족스러워요! 배송도 빠르고 품질도 좋아요.",
"완전 실망입니다. 사진과 너무 다르네요.",
"그냥 평범해요. 가격 대비 무난합니다."
]
# 감정 분석 수행
for text in texts:
result = sentiment_analyzer(text)[0]
stars = int(result['label'].split()[0]) # "5 stars" -> 5
if stars >= 4:
sentiment = "긍정"
elif stars <= 2:
sentiment = "부정"
else:
sentiment = "중립"
print(f"텍스트: {text}")
print(f" → 감정: {sentiment} ({result['label']}, 신뢰도: {result['score']:.2%})")
print()
# 출력 예시:
# 텍스트: 이 제품 정말 만족스러워요! 배송도 빠르고 품질도 좋아요.
# → 감정: 긍정 (5 stars, 신뢰도: 72.35%)
"고객 리뷰 5만 건에 감정 분석 돌려봤는데, 부정 리뷰의 42%가 배송 관련이에요. 물류팀과 협업이 필요해 보입니다."
"BERT 기반 감정 분석 모델로 F1 스코어 0.89를 달성했습니다. 반어법 탐지를 위해 문맥 윈도우를 확장하는 방식으로 성능을 개선했습니다."
"한국어 감정 분석에서는 KoBERT나 KoELECTRA가 다국어 모델보다 성능이 좋습니다. 다만 최신 LLM의 zero-shot 성능도 상당히 경쟁력 있어요."
영화 리뷰로 학습된 모델을 금융 뉴스에 적용하면 정확도가 크게 떨어집니다. 도메인 특화 데이터로 파인튜닝이 필요합니다.
"아 정말 대단하시네요~"처럼 문맥에 따라 의미가 달라지는 표현을 단순 긍정으로 오분류하는 경우가 많습니다.
도메인 특화 데이터셋으로 파인튜닝하고, 이모지/이모티콘까지 분석에 포함하세요. 복합 감정(긍정+불만 혼재)도 탐지할 수 있도록 설계하세요.