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편)

+ Recent posts