1. 감성 분석이란?
감성 분석(Sentiment Analysis)은 텍스트 데이터를 분석하여 해당 문장의 감정을 분류하는 기술이다. 일반적으로 긍정(Positive), 부정(Negative), 중립(Neutral) 등의 클래스로 분류되며, 고객 리뷰 분석, 소셜 미디어 모니터링, 브랜드 평판 분석 등에 활용된다.
✅ 이번 프로젝트 목표:
- 한국어 영화 리뷰 데이터를 활용하여 감성 분석 모델을 구축
- 데이터 탐색(EDA) 및 전처리를 수행하여 분석의 기초를 마련
- 머신러닝 및 딥러닝 모델 적용 전, 데이터 이해를 심화
2. 데이터 수집 및 탐색적 데이터 분석 (EDA)
우리는 **네이버 영화 리뷰 데이터(Naver Sentiment Analysis Dataset)**를 사용한다.
- ratings_train.txt: 학습용 데이터 (150,000개 리뷰)
- ratings_test.txt: 테스트 데이터 (50,000개 리뷰)
2.1 데이터 로드 및 기본 탐색
import pandas as pd
import re
import matplotlib.pyplot as plt
import seaborn as sns
# 데이터 로드
df = pd.read_csv("ratings_train.txt", sep="\t")
# 결측값 제거
df = df.dropna()
# 데이터 개수 확인
print("데이터 개수:", len(df))
# 감성(Label) 분포 시각화
plt.figure(figsize=(6,4))
sns.countplot(x=df['label'], palette='coolwarm')
plt.title("긍정 vs 부정 리뷰 개수")
plt.xlabel("감성 레이블")
plt.ylabel("리뷰 개수")
plt.xticks(ticks=[0,1], labels=['부정(0)', '긍정(1)'])
plt.show()
2.2 텍스트 길이 분석
# 문장 길이 분석
df['length'] = df['document'].apply(lambda x: len(str(x)))
plt.figure(figsize=(8,5))
plt.hist(df['length'], bins=50, color='blue', alpha=0.7)
plt.title("문장 길이 분포")
plt.xlabel("문장 길이")
plt.ylabel("빈도수")
plt.show()
2.3 리뷰별 단어 개수 분석
# 형태소 분석기 활용하여 단어 개수 분석
from konlpy.tag import Okt
okt = Okt()
df['word_count'] = df['document'].apply(lambda x: len(okt.morphs(str(x))))
plt.figure(figsize=(8,5))
sns.histplot(df['word_count'], bins=50, kde=True, color='green')
plt.title("리뷰별 단어 개수 분포")
plt.xlabel("단어 개수")
plt.ylabel("빈도수")
plt.show()
2.4 감성별 리뷰 길이 비교
plt.figure(figsize=(8,5))
sns.boxplot(x=df['label'], y=df['length'], palette='coolwarm')
plt.title("긍정 vs 부정 리뷰의 문장 길이 비교")
plt.xlabel("감성 레이블")
plt.ylabel("문장 길이")
plt.xticks(ticks=[0,1], labels=['부정(0)', '긍정(1)'])
plt.show()
EDA를 통해 긍정/부정 리뷰의 비율이 거의 1:1이며, 문장 길이의 분포가 넓게 퍼져 있는 것을 확인할 수 있다. 또한, 부정 리뷰가 긍정 리뷰보다 다소 짧은 경향이 있음을 알 수 있다. 이는 데이터 전처리 및 모델 선택에 영향을 줄 수 있다.
3. 텍스트 데이터 전처리
한글 텍스트를 벡터화하기 위해 형태소 분석기를 사용한다. 여기서는 **Okt(Open Korean Text)**를 활용한다.
from konlpy.tag import Okt
from sklearn.feature_extraction.text import TfidfVectorizer
okt = Okt()
# 형태소 분석 함수 정의
def tokenize(text):
return ' '.join(okt.morphs(text))
# 텍스트 데이터 토큰화
df['document'] = df['document'].apply(tokenize)
# TF-IDF 벡터화
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(df['document'])
y = df['label']
4. 다음 단계
✅ 2편에서 다룰 내용:
- 머신러닝 및 딥러닝 모델 학습 (Naive Bayes, SVM, Random Forest, Logistic Regression, LSTM, BERT)
- 모델별 성능 비교 및 결과 분석
- 향후 발전 방향 논의
🚀 다음 편: 감성 분석 모델 학습 및 평가 (2편)