머신러닝 & 딥러닝/자연어처리

[NLP] 네이버 영화 리뷰 데이터(nsmc) 감성 분석 - CNN

by seokii 2022. 6. 30.
728x90
반응형

NLP Tutorial

https://github.com/Seokii/Korean_NLP_Tutorial

 

GitHub - Seokii/Korean_NLP_Tutorial: 한국어 자연어처리 튜토리얼

한국어 자연어처리 튜토리얼. Contribute to Seokii/Korean_NLP_Tutorial development by creating an account on GitHub.

github.com

자연어처리를 공부하며 여러 한국어 NLP Task에 대한 예시 코드를 작성하고자 만들었습니다.

예시 코드를 통해 저와 같은 자연어처리 입문자들에게 도움이 되었으면 합니다 :)

해당 깃허브 주소를 통해 작성한 주피터 노트북 파일을 다운받거나 확인할 수 있습니다.

 

이전 글

https://seokii.tistory.com/142#toc-NLP%20Tutorial

 

[NLP] 네이버 영화 리뷰 데이터(nsmc) 감성 분석 - LSTM

NLP Tutorial https://github.com/Seokii/Korean_NLP_Tutorial GitHub - Seokii/Korean_NLP_Tutorial: 한국어 자연어처리 튜토리얼 한국어 자연어처리 튜토리얼. Contribute to Seokii/Korean_NLP_Tutorial develo..

seokii.tistory.com

글에서 다루는 모든 과정인

1. 라이브러리 불러오기, 

2. 데이터 불러오기

3. 시각화

4. 결측값 확인

5. 데이터 전처리

에 대한 내용은 위의 작성한 이전 글에서 똑같이 진행합니다.

 

모델링 (CNN)

In [17] : 

vocab_size = 30000
word_vector_dim = 32

model = tf.keras.Sequential()
model.add(tf.keras.layers.Embedding(vocab_size, word_vector_dim, input_shape=(None,)))
model.add(tf.keras.layers.Conv1D(16, 5, activation='relu'))
model.add(tf.keras.layers.MaxPooling1D(5))
model.add(tf.keras.layers.Conv1D(16, 5, activation='relu'))
model.add(tf.keras.layers.GlobalMaxPooling1D())
model.add(tf.keras.layers.Dropout(rate=0.5))
model.add(tf.keras.layers.Dense(8, activation='relu'))
model.add(tf.keras.layers.Dense(1, activation='sigmoid'))


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

model.summary()

전처리 과정 중에 만든 단어 사전의 크기는 30000으로 지정했으며,

변경 가능한 값인 word_vector_dim은 32로 설정했습니다.

설정 값(vocab_size, word_vector_dim)으로 Embedding layer를 생성했습니다.

그 후, Conv1D와 MaxPolling1D를 사용해 각 layer을 구성했으며,

Dropout, Dense 등을 사용해 신경망을 구성했습니다.

(0 : 부정적 리뷰) 또는 (1 : 긍정적 리뷰) 을 구분하는 문제이기 때문에 활성화 함수로 Sigmoid를 사용했습니다. 손실 함수는 binary_crossentropy를 사용했습니다.

 

In [18] : 

X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.2, shuffle=True,
                                                  stratify=y_train, random_state=42)

train_test_split()을 사용해 데이터를 분리했습니다.

 

In [19] : 

history = model.fit(X_train, y_train, validation_data=(X_val, y_val),
                    batch_size=512, epochs=10, verbose=1)

batch_size = 512, epochs = 10으로 설정 후 학습을 진행했습니다.

 

In [20] : 

predict = model.evaluate(X_test, y_test, verbose=1)
print(predict)

훈련한 모델을 평가하는 코드입니다.

각각 loss 값과 accuracy 값을 나타냅니다.

 

In [21] : 

history_dict = history.history
print(history_dict.keys())

In [22] : 

acc = history_dict['accuracy']
val_acc = history_dict['val_accuracy']
loss = history_dict['loss']
val_loss = history_dict['val_loss']

epochs = range(1, len(acc) + 1)

plt.plot(epochs, loss, 'r', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()

plt.show()

모델 학습 시, 에포크별 train과 validation 데이터에 대한 loss값의 시각화입니다.

 

 

728x90
반응형

댓글