Sentiment analysis란 텍스트 데이터에서 감정 상태를 식별하는 자연어 처리의 중요한 과제이다. 저번에는 BERT를 사용해봤고 이번에는 RNN을 사용해 감정 분석을 수행하고 그 성능을 비교해 보겠다. 두 모델의 코드 설명, 성능 지표 분석, 모델 특성 및 성능 비교, 그리고 프로젝트를 통해 얻은 교훈을 포함한다.
다음 사진은 SSLSTM(Sentiment and Semantic LSTM) 아키텍처 구조를 나타내는 사진이다. 감정 분석 분야에 순환 신경망, Recurrent Neural Network 구조가 눈에 띄게 성능을 잘 보이는 듯 하다.
데이터 전처리
RNN 모델의 경우에도 BERT와 동일한 전처리 과정을 거친다. URL, 멘션, 해시태그, 숫자, 특수 문자를 제거하고, 중복 공백과 양쪽 공백을 제거하며, 소문자로 변환한 후 불용어를 제거한다. 이 과정을 통해 텍스트 데이터를 정제하고, 모델이 중요하지 않은 정보를 무시하고 중요한 패턴을 학습할 수 있도록 한다.
레이블링
def func(sentiment):
if sentiment =='positive':
return 0;
elif sentiment =='negative':
return 1;
else:
return 2;
train_ds['sentiment'] = train_ds['sentiment'].apply(func)
validation_ds['sentiment'] = validation_ds['sentiment'].apply(func)
x_train = np.array(train_ds['text'].tolist())
y_train = np.array(train_ds['sentiment'].tolist())
x_test = np.array(validation_ds['text'].tolist())
y_test = np.array(validation_ds['sentiment'].tolist())
BERT 모델과 동일하게, 감정 레이블을 정수 인덱스로 변환한다. 각 감정 레이블을 고유한 숫자에 매핑하여 모델 입력 데이터로 사용한다.
RNN 모델 학습
RNN(Recurrent Neural Network) 모델을 사용하여 감정 분석을 수행. RNN은 시퀀스 데이터를 처리하는 데 강점을 가지고 있으며, 텍스트 데이터의 순차적인 특성을 잘 반영한다. RNN 모델 학습 과정은 다음과 같다:
l 텍스트 토크나이저: 텍스트 데이터를 숫자 시퀀스로 변환하기 위해 `Tokenizer`를 사용. 최대 단어 수를 20,000으로 설정하고 텍스트 데이터를 토큰으로 변환한다.
l 패딩: 각 시퀀스의 길이를 동일하게 맞추기 위해 패딩을 사용한다. 최대 길이를 35로 설정하고 시퀀스를 패딩한다.
l 모델 초기화: `Sequential` 모델을 사용하여 RNN 모델을 초기화한다. 첫 번째 레이어는 임베딩 레이어로, 입력 차원은 20,000, 출력 차원은 5, 시퀀스 길이는 35로 설정한다. 그 다음, `SimpleRNN` 레이어를 추가하여 순차적 특성을 학습한 후 마지막으로, `Dense` 레이어를 사용하여 출력 레이블 수를 설정한다.
l 최적화기: Adam 최적화기를 사용하여 모델의 파라미터를 업데이트한다.
모델 학습 단계에서는 각 배치에 대해 손실을 계산하고 역전파를 통해 파라미터를 업데이트한다.
tokenizer = Tokenizer(num_words=20000)
tokenizer.fit_on_texts(x_train)
tokenizer.fit_on_texts(x_test)
x_train = tokenizer.texts_to_sequences(x_train)
x_test = tokenizer.texts_to_sequences(x_test)
from keras.utils import pad_sequences
x_train = pad_sequences(x_train, padding='post', maxlen=35) # Set maxlen to 35
x_test = pad_sequences(x_test, padding='post', maxlen=35)
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
history = model.fit(x_train, y_train, epochs=10, validation_data=(x_test, y_test))
모델 평가
학습이 완료된 후, 평가 모드로 전환하여 테스트 데이터셋에 대해 예측을 수행한다. 평가 지표로는 정확도(accuracy)와 `classification_report`를 사용하여 모델의 성능을 분석한다.
import matplotlib.pyplot as plt
loss = history.history['loss']
val_loss = history.history['val_loss']
accuracy = history.history['accuracy']
val_accuracy = history.history['val_accuracy']
epochs = range(1, len(loss) + 1)
# 손실 시각화
plt.figure(figsize=(14, 6))
plt.subplot(1, 2, 1)
plt.plot(epochs, loss, 'b-', label='Training loss')
plt.plot(epochs, val_loss, 'r-', label='Validation loss')
plt.title('Training and Validation Loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
# 정확도 시각화
plt.subplot(1, 2, 2)
plt.plot(epochs, accuracy, 'b-', label='Training accuracy')
plt.plot(epochs, val_accuracy, 'r-', label='Validation accuracy')
plt.title('Training and Validation Accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend()
plt.show()
RNN LSTM 모델을 이용해 감정 분석을 실행한 결과를 평가하는 지표를 나타낸 그래프입니다. 그래프는 왼쪽의 손실(loss) 그래프와 오른쪽의 정확도(accuracy) 그래프로 구성되어 있습니다. 각각의 그래프는 훈련 데이터와 검증 데이터에 대한 성능 변화를 보여줍니다.
손실 그래프에서의 훈련 손실(Training Loss)은 학습이 진행될수록 지속적으로 감소하는 경향을 보인다. 이는 모델이 훈련 데이터에 대해 점점 더 정확하게 예측하고 있다는 것을 의미한다. 그래프의 시작 부분에서 손실이 급격히 감소하는 것을 볼 수 있으며, 후반부로 갈수록 손실 감소율이 줄어듭니다. 이는 모델이 학습을 통해 점차 최적의 파라미터를 찾아가는 과정이다. RNN의 특성을 잘 반영한다고 볼 수 있겠다.
정확도 그래프에서는 훈련 정확도는 에포크가 증가할수록 지속적으로 상승합니다. 이는 모델이 훈련 데이터를 점점 더 잘 예측하고 있음을 나타냅니다. 그래프의 초기 부분에서 정확도가 급격히 상승하고, 후반부에서는 점차 상승폭이 줄어든다. 이는 손실 그래프와 일치하며, 모델이 최적화되는 과정을 보여준다.
모델 특성에 따라 RNN LSTM 모델은 시퀀스 데이터를 처리하는 데 강점을 가지며, 감정 분석과 같은 자연어 처리 작업에 적합하다. 그러나 이 그래프는 모델이 병목 현상(bottle neck)에 의해 훈련 데이터에 과적합되는 경향을 보여준다. 훈련 손실과 훈련 정확도는 지속적으로 향상되지만, 검증 손실이 증가하고 검증 정확도가 정체되거나 감소하는 것은 모델이 훈련 데이터에 과하게 맞춰져서 새로운 데이터에 대한 일반화 성능이 떨어진다는 것을 의미한다.
...이번에는 순환 신경망을 이용해 감정 분석을 해보았다.
'NLP' 카테고리의 다른 글
[논문 뜯어보기] DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning (2) | 2025.02.14 |
---|---|
BERT로 감정 분석 실습 해보기 (30) | 2024.06.20 |
챗봇 구현을 위한 데이터로더 기능 테스트 (7) | 2024.05.22 |
Transformer로 간단한 챗봇 구현 및 평가 해보기 (2) | 2024.05.02 |
Transformer 데이터 전처리 해보기 (5) | 2024.05.01 |