Python/Deep Learning

감성 분석(Sentiment Analysis) 모델 구현 (영문 텍스트 분석)

임베디드 친구 2026. 1. 5. 21:17
728x90
반응형

감성 분석(Sentiment Analysis) 모델 구현 (영문 텍스트 분석)

1. 감성 분석이란?

감성 분석(Sentiment Analysis)은 텍스트 데이터를 분석하여 긍정, 부정, 중립 등의 감성을 분류하는 자연어 처리(NLP) 기술입니다. 주로 고객 리뷰, SNS 게시글, 뉴스 기사 등의 감성을 평가하는 데 활용되며, 기업의 마케팅 전략, 고객 피드백 분석, 정치적 의견 조사 등 다양한 분야에서 중요한 역할을 합니다.

이번 포스팅에서는 영문 텍스트를 대상으로 감성 분석 모델을 구축하는 방법을 다루겠습니다. TensorFlow 및 Keras를 활용하여 감성 분석 모델을 구현하고, IMDb 영화 리뷰 데이터셋을 이용하여 모델을 학습 및 평가하는 과정을 설명하겠습니다.


2. 데이터 준비: IMDb 영화 리뷰 데이터셋

IMDb(Internet Movie Database) 영화 리뷰 데이터셋은 감성 분석 모델을 훈련하는 데 많이 사용되는 공개 데이터셋 중 하나입니다. 이 데이터셋은 긍정 리뷰(1)와 부정 리뷰(0)로 이루어져 있으며, Keras의 내장 데이터셋에서 쉽게 로드할 수 있습니다.

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.datasets import imdb
import numpy as np

# IMDb 데이터셋 로드 (최대 10,000개 단어 사용)
num_words = 10000
(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=num_words)

# 데이터 크기 확인
print(f"훈련 데이터 개수: {len(x_train)}, 테스트 데이터 개수: {len(x_test)}")

IMDb 데이터셋은 이미 정수 인코딩(integer encoding)이 되어 있으며, 각 단어는 특정 정수로 매핑되어 있습니다. 하지만 원본 텍스트가 필요할 경우 imdb.get_word_index()를 사용하여 매핑을 해제할 수 있습니다.

# IMDb 단어 사전 가져오기
word_index = imdb.get_word_index()
reverse_word_index = {value: key for (key, value) in word_index.items()}

# 정수 인코딩된 리뷰를 다시 텍스트로 변환하는 함수
def decode_review(encoded_review):
    return ' '.join([reverse_word_index.get(i - 3, '?') for i in encoded_review])

# 예제 리뷰 확인
print(decode_review(x_train[0]))

3. 데이터 전처리

신경망 모델은 입력 데이터의 길이가 일정해야 하므로, 패딩(Padding)을 적용하여 길이를 맞춰줍니다. Keras의 pad_sequences 함수를 사용하여 모든 리뷰를 동일한 길이로 변환합니다.

from tensorflow.keras.preprocessing.sequence import pad_sequences

# 최대 길이 설정
max_length = 500

# 패딩 적용
x_train_padded = pad_sequences(x_train, maxlen=max_length, padding='post', truncating='post')
x_test_padded = pad_sequences(x_test, maxlen=max_length, padding='post', truncating='post')

이제 훈련 데이터는 길이가 500으로 고정된 리뷰 데이터로 변환되었습니다.


4. 감성 분석 모델 구축

LSTM(Long Short-Term Memory) 모델을 사용하여 감성 분석 모델을 구현합니다. LSTM은 문맥을 기억하는 능력이 뛰어나 자연어 처리(NLP) 문제에서 많이 활용됩니다.

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Embedding, LSTM, Dense

# 모델 생성
model = Sequential([
    Embedding(input_dim=num_words, output_dim=128, input_length=max_length),
    LSTM(64, return_sequences=False),
    Dense(1, activation='sigmoid')
])

# 모델 컴파일
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

# 모델 요약
model.summary()

위 모델은 다음과 같은 구성 요소를 포함합니다:

  • Embedding Layer: 단어를 벡터로 변환하는 임베딩 레이어
  • LSTM Layer: 문맥 정보를 학습하는 LSTM 레이어
  • Dense Layer: 최종 이진 분류를 수행하는 출력 레이어 (시그모이드 활성화 함수 사용)

5. 모델 학습

이제 모델을 훈련시켜 감성 분석을 수행할 수 있도록 합니다.

# 모델 훈련
history = model.fit(
    x_train_padded, y_train,
    epochs=5,
    batch_size=64,
    validation_data=(x_test_padded, y_test)
)

훈련이 완료된 후, 모델의 성능을 평가합니다.

# 모델 평가
loss, accuracy = model.evaluate(x_test_padded, y_test)
print(f"테스트 정확도: {accuracy:.4f}")

6. 감성 분석 예측하기

훈련된 모델을 사용하여 새로운 리뷰의 감성을 예측해 봅니다.

def predict_sentiment(review_text):
    # 텍스트를 정수 인코딩으로 변환
    encoded_review = [word_index.get(word, 2) + 3 for word in review_text.lower().split()]
    padded_review = pad_sequences([encoded_review], maxlen=max_length, padding='post')
    prediction = model.predict(padded_review)[0][0]
    return "긍정적 리뷰" if prediction > 0.5 else "부정적 리뷰"

# 예제 리뷰 감성 분석
sample_review = "The movie was fantastic and full of suspense"
print(predict_sentiment(sample_review))

7. 결론

이번 포스팅에서는 IMDb 영화 리뷰 데이터셋을 활용한 감성 분석 모델을 구현했습니다. 주요 내용은 다음과 같습니다:

  1. IMDb 데이터셋을 로드하고 전처리하는 방법을 학습함
  2. LSTM 기반 감성 분석 모델을 구축하고 훈련함
  3. 학습된 모델을 활용하여 새로운 리뷰의 감성을 예측함

감성 분석은 고객 피드백 분석, SNS 감정 모니터링, 뉴스 분석 등 다양한 분야에서 활용될 수 있습니다.


참고자료

감사합니다!

반응형