이번 글에서는 딥러닝을 사용하여 간단한 감정 분석 프로그램을 만드는 방법을 소개하게 하도록 하겠습니다. 감정 분석(Sentiment Analysis)은 텍스트 데이터에서 긍정, 부정, 중립과 같은 감정을 분석하는 기술이며 앞으로 다가올 휴머노이드 시대에 꼭 필요한 기반 기술입니다. 이 가이드는 초보자도 쉽게 따라할 수 있도록 구성되어 있으니 천천히 따라해 보시면서 익히시길 바랍니다.

준비 작업

Python과 필요한 라이브러리 설치하기

감정 분석을 구현하기 위해서는 Python과 몇 가지 라이브러리를 설치해야 합니다. 다음 명령어를 사용하여 필요한 패키지를 설치하세요 :

pip install numpy pandas tensorflow sklearn
  • NumPy: 과학 계산을 위한 라이브러리
  • Pandas: 데이터 분석을 위한 라이브러리
  • TensorFlow: 딥러닝 모델을 위한 라이브러리
  • scikit-learn (sklearn): 기계 학습을 위한 라이브러리

데이터 준비

감정 분석을 위한 훈련 데이터를 준비합니다. 여기서는 간단한 예제로 IMDb 영화 리뷰 데이터셋을 사용하겠습니다:

import pandas as pd
from sklearn.model_selection import train_test_split

# 데이터 불러오기
url = "https://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz"
df = pd.read_csv(url, compression='gzip', error_bad_lines=False)

# 데이터셋 나누기
train_data, test_data = train_test_split(df, test_size=0.2, random_state=42)

텍스트 전처리

텍스트 데이터를 딥러닝 모델에 적합한 형태로 전처리합니다:

import tensorflow as tf
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences

# 토크나이저 설정
tokenizer = Tokenizer(num_words=10000, oov_token="<OOV>")
tokenizer.fit_on_texts(train_data['review'])

# 텍스트 시퀀스 변환
train_sequences = tokenizer.texts_to_sequences(train_data['review'])
train_padded = pad_sequences(train_sequences, maxlen=200)

test_sequences = tokenizer.texts_to_sequences(test_data['review'])
test_padded = pad_sequences(test_sequences, maxlen=200)
  • Tokenizer: 텍스트를 숫자 시퀀스로 변환하는 도구
  • pad_sequences: 시퀀스의 길이를 동일하게 맞추기 위해 패딩을 추가하는 함수

딥러닝 모델 생성

감정 분석을 위한 딥러닝 모델을 생성합니다:

model = tf.keras.Sequential([
    tf.keras.layers.Embedding(10000, 16, input_length=200),
    tf.keras.layers.GlobalAveragePooling1D(),
    tf.keras.layers.Dense(24, activation='relu'),
    tf.keras.layers.Dense(1, activation='sigmoid')
])

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
  • Embedding: 단어를 고차원 공간에 매핑하는 층
  • GlobalAveragePooling1D: 시퀀스의 평균을 구하는 층
  • Dense: 완전 연결 신경망 층
  • binary_crossentropy: 이진 분류를 위한 손실 함수
  • sigmoid: 출력값을 0과 1 사이로 변환하는 활성화 함수

모델 훈련

모델을 훈련시킵니다:

history = model.fit(train_padded, train_data['sentiment'], epochs=10, validation_data=(test_padded, test_data['sentiment']), verbose=2)

모델 평가

훈련된 모델을 사용하여 감정 분석을 평가합니다:

loss, accuracy = model.evaluate(test_padded, test_data['sentiment'])
print(f"Test Accuracy: {accuracy*100:.2f}%")

전체 코드 예제

아래는 위의 모든 단계를 포함한 전체 코드 예제입니다:

import pandas as pd
import tensorflow as tf
from sklearn.model_selection import train_test_split
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences

# 데이터 불러오기
url = "https://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz"
df = pd.read_csv(url, compression='gzip', error_bad_lines=False)

# 데이터셋 나누기
train_data, test_data = train_test_split(df, test_size=0.2, random_state=42)

# 텍스트 전처리
tokenizer = Tokenizer(num_words=10000, oov_token="<OOV>")
tokenizer.fit_on_texts(train_data['review'])

train_sequences = tokenizer.texts_to_sequences(train_data['review'])
train_padded = pad_sequences(train_sequences, maxlen=200)

test_sequences = tokenizer.texts_to_sequences(test_data['review'])
test_padded = pad_sequences(test_sequences, maxlen=200)

# 딥러닝 모델 생성
model = tf.keras.Sequential([
    tf.keras.layers.Embedding(10000, 16, input_length=200),
    tf.keras.layers.GlobalAveragePooling1D(),
    tf.keras.layers.Dense(24, activation='relu'),
    tf.keras.layers.Dense(1, activation='sigmoid')
])

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

# 모델 훈련
history = model.fit(train_padded, train_data['sentiment'], epochs=10, validation_data=(test_padded, test_data['sentiment']), verbose=2)

# 모델 평가
loss, accuracy = model.evaluate(test_padded, test_data['sentiment'])
print(f"Test Accuracy: {accuracy*100:.2f}%")

이 코드는 간단한 감정 분석의 기본적인 구조를 제공합니다. 실제 애플리케이션에서는 다양한 데이터 전처리 기법과 모델을 적용하여 성능을 높일 수 있습니다.

마무리

이번 글에서는 딥러닝을 사용하여 간단한 감정 분석 프로그램을 만드는 방법을 소개하였습니다. 감정 분석은 다양한 텍스트 데이터 분석 애플리케이션에서 매우 유용하게 사용될 수 있습니다. 다음 포스트에서는 조금 더 재밌는 내용인 Python으로 손글씨 인식 프로그램을 만들어 보도록 하겠습니다.