감성 분석
IT 위키
더 많은 작업
- Sentiment Analysis; 감정 분석, 감성 분류
- 텍스트에 담긴 의견이 긍정인지 부정인지(극성)와 그 강도를 판별하는 텍스트 마이닝 기법
감성 분석은 상품평, 댓글, SNS 글, 설문 응답처럼 사람이 쓴 문장에서 글쓴이의 태도나 평가를 찾아내 긍정·부정·중립으로 분류하거나 점수로 나타낸다. 의견을 대상(제품, 기능)과 함께 추출하는 오피니언 마이닝과 거의 같은 뜻으로 쓰이며, Pang과 Lee(2008)의 개관 논문 제목도 "Opinion Mining and Sentiment Analysis"이다. 엄밀히 나누면 오피니언 마이닝은 의견의 대상·속성·의견 보유자까지 구조화하는 넓은 작업이고, 감성 분석은 그 가운데 극성(polarity)을 판정하는 부분에 초점을 둔다.
ADP에서는 비정형 데이터 마이닝의 텍스트 마이닝 영역에서 다룬다. 기업은 고객 리뷰로 제품 평판을 관찰하고, 브랜드 언급의 긍정·부정 비율 변화를 추적하며, 불만 글을 자동으로 골라 대응하는 데 쓴다.
| 수준 | 설명 | 예 |
|---|---|---|
| 문서 수준 | 리뷰 한 편 전체가 긍정인지 부정인지 판정한다. 문서 하나가 대상 하나에 대한 의견이라고 가정한다 | 영화평 한 편 → 긍정 |
| 문장 수준 | 문장마다 주관적 문장인지(객관적 사실 진술과 구분) 먼저 가린 뒤 극성을 판정한다 | "배송은 빨랐다" → 긍정, "택배로 왔다" → 객관 |
| 속성(aspect) 수준 | 대상의 속성별로 의견을 나눈다. 한 문장 안에 상반된 의견이 있어도 처리할 수 있다 | "화면은 좋은데 배터리가 약하다" → 화면 긍정, 배터리 부정 |
| 구분 | 사전 기반(lexicon-based) | 기계학습 기반(machine learning) |
|---|---|---|
| 원리 | 긍정어·부정어와 극성 점수를 담은 감성 사전을 만들고, 문장에 나온 단어의 점수를 합산한다 | 긍정·부정 레이블이 붙은 학습 문서로 분류 모델을 학습해 새 문서를 분류한다 |
| 필요한 자원 | 감성 사전(직접 구축하거나 공개 사전 사용) | 레이블이 붙은 학습 데이터 |
| 대표 기법 | 단어 점수 합산, 부정어 처리, 강조어 가중 | 나이브 베이즈, 로지스틱 회귀, 서포트 벡터 머신, 딥러닝(BERT 등) |
| 장점 | 학습 데이터가 없어도 된다. 결과를 설명하기 쉽다 | 도메인 특유의 표현을 데이터에서 배운다. 일반적으로 정확도가 높다 |
| 단점 | 사전에 없는 단어·신조어·반어·도메인별 의미 차이("길다"는 배터리에는 긍정, 대기 시간에는 부정)에 약하다 | 레이블링 비용이 크고, 학습한 도메인 밖에서는 성능이 떨어진다 |
- 두 방법을 섞어 사전 점수를 기계학습 모델의 입력 변수로 쓰는 혼합 방식도 많이 쓴다.
- 초기 연구로 Turney(2002)는 구절과 "excellent", "poor"의 연관도로 극성을 정하는 비지도 방식을, Pang 외(2002)는 영화평을 나이브 베이즈·최대 엔트로피·SVM으로 분류하는 지도 학습 방식을 보였다.
- Hu와 Liu(2004)는 상품평에서 제품 속성(feature)과 그에 대한 의견 단어를 뽑아 요약하는 속성 수준 분석을 제안했다.
사전 기반 방법에서 문장(또는 문서)의 감성 점수는 보통 다음과 같이 계산한다.
- s(w)는 단어 w의 극성 점수(예: 긍정 +1, 부정 −1, 강한 표현 ±2)이다.
- S > 0이면 긍정, S < 0이면 부정, S = 0이면 중립으로 분류한다. 길이 차이를 줄이려고 단어 수로 나누거나 (긍정 수 − 부정 수) / (긍정 수 + 부정 수) 같은 비율로 바꾸기도 한다.
- 부정어("안", "못", "not")가 앞에 오면 극성을 뒤집고, 강조어("매우", "very")는 가중치를 곱한다.
외부 사전을 내려받지 않고 작은 사전을 직접 만들어 점수를 합산한다. 예시를 단순하게 하려고 띄어쓰기로 토큰을 나누고 단어를 기본형으로 적었다. 실제 한국어 문장은 형태소 분석으로 기본형을 얻어야 한다.
import re
pos = {"좋다": 1, "만족": 1, "빠르다": 1, "친절": 1, "최고": 2}
neg = {"나쁘다": -1, "느리다": -1, "불친절": -1, "실망": -1, "최악": -2}
lexicon = {**pos, **neg}
negators = {"안", "못"}
def score(sentence):
tokens = sentence.split()
s = 0
for i, t in enumerate(tokens):
w = re.sub(r"[.!?,]", "", t)
if w in lexicon:
v = lexicon[w]
if i > 0 and tokens[i-1] in negators: # 부정어 처리
v = -v
s += v
return s
reviews = ["배송 빠르다 포장 최고",
"직원 불친절 그리고 배송 느리다",
"가격 좋다 하지만 품질 실망",
"기대 안 좋다"]
for r in reviews:
s = score(r)
label = "긍정" if s > 0 else ("부정" if s < 0 else "중립")
print(f"{s:+d} {label} | {r}")
실행 결과:
+3 긍정 | 배송 빠르다 포장 최고
-2 부정 | 직원 불친절 그리고 배송 느리다
+0 중립 | 가격 좋다 하지만 품질 실망
-1 부정 | 기대 안 좋다
- 세 번째 문장은 긍정 1개와 부정 1개가 상쇄되어 중립이 되었다. "하지만" 뒤의 내용이 더 중요하다는 점은 단순 합산으로는 반영되지 않는다. 이것이 속성 수준 분석이나 기계학습이 필요한 이유이다.
- 네 번째 문장은 부정어 "안" 때문에 "좋다"의 +1이 −1로 뒤집혔다.
레이블이 붙은 6개 문장으로 다항 나이브 베이즈 분류기를 학습한다(scikit-learn 1.7.2로 실행).
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
train = ["배송 빠르다 만족", "품질 최고 만족", "직원 친절 좋다",
"배송 느리다 실망", "품질 최악 환불", "직원 불친절 실망"]
y = [1, 1, 1, 0, 0, 0] # 1 = 긍정, 0 = 부정
vec = CountVectorizer()
clf = MultinomialNB().fit(vec.fit_transform(train), y)
test = ["배송 빠르다 친절", "품질 실망 환불"]
print(clf.predict(vec.transform(test)))
print(clf.predict_proba(vec.transform(test)).round(3))
실행 결과:
[1 0]
[[0.2 0.8 ]
[0.857 0.143]]
- 첫 문장은 긍정 확률 0.8로 긍정, 두 번째 문장은 부정 확률 0.857로 부정으로 분류되었다. predict_proba의 열 순서는 클래스 0(부정), 1(긍정)이다.
- tm 패키지로 코퍼스와 문서 단어 행렬을 만들고, 긍정어·부정어 목록과 매칭해 점수를 계산하는 방식이 기본이다.
- 기계학습 방식은 문서 단어 행렬을 입력으로 나이브 베이즈(e1071 패키지 등)나 SVM을 학습한다.
- 감성 분석은 오피니언 마이닝이라고도 하며, 문장의 긍정·부정(극성)을 판정한다는 정의를 기억한다.
- 사전 기반과 기계학습 기반 방법의 차이(학습 데이터 필요 여부, 도메인 의존성, 신조어·반어 처리의 어려움)를 비교하는 문제가 나온다.
- 분석 단위(문서·문장·속성 수준)와 부정어 처리를 이해한다.
- 텍스트 마이닝 절차(수집 → 전처리 → 문서 단어 행렬 → 분석 → 시각화) 안에서 감성 분석의 위치를 알아 둔다.
- Pang, B., Lee, L. (2008). Opinion Mining and Sentiment Analysis. Foundations and Trends in Information Retrieval, 2(1–2), 1–135. doi:10.1561/1500000011
- Pang, B., Lee, L., Vaithyanathan, S. (2002). Thumbs up? Sentiment Classification using Machine Learning Techniques. EMNLP 2002, 79–86. doi:10.3115/1118693.1118704
- Turney, P. D. (2002). Thumbs up or thumbs down? Semantic Orientation Applied to Unsupervised Classification of Reviews. ACL 2002. doi:10.3115/1073083.1073153
- Hu, M., Liu, B. (2004). Mining and summarizing customer reviews. KDD 2004, 168–177. doi:10.1145/1014052.1014073
- scikit-learn User Guide - Feature extraction (Text feature extraction)
- 한국데이터산업진흥원 데이터자격검정 - ADP 시험과목 및 출제기준