본문 바로가기
AI/Contents

텍스트처리로 문장에 감성분석

by AI미남홀란드 2024. 3. 15.
728x90

 

인공지능(AI) 기술이 급속도로 발전함에 따라, 자연어 처리(NLP)는 다양한 분야에서 중요한 역할을 하고 있습니다. 오늘은 AI-HUB의 감정 말뭉치 데이터를 활용해 텍스트 기반의 언어 모델을 만들고, 이를 통해 감정 분류를 실습해보겠습니다. 이 과정은 크게 두 부분으로 나뉩니다: 첫째, 머신러닝을 사용한 감정 분류와, 둘째, LSTM 모델을 사용한 감정 분류입니다.

 

자연어 처리의 기본 단계

자연어 처리 프로젝트는 대체로 다음과 같은 순서로 진행됩니다:

  • 전처리: 데이터 클리닝, 정규화 등
  • 토큰화: 텍스트를 개별 단어나 표현으로 분리
  • 벡터화: 텍스트를 숫자로 변환
  • 모델링: 데이터를 기반으로 학습 진행
  • 평가 및 예측: 모델 성능 평가 및 새로운 데이터에 대한 예측

A. 머신러닝을 이용한 감정 분류

머신러닝 접근 방식에서는 TF-IDF 토크나이저와 랜덤포레스트 분류기를 사용합니다. 전처리 단계에서는 한글 외의 문자를 제거하고, 중복을 제거하는 등의 데이터 클리닝 작업이 필요합니다. 이후, 데이터를 훈련 세트와 테스트 세트로 분리하고, 모델을 훈련시킨 후 성능을 평가합니다.

 

B. LSTM 모델을 이용한 감정 분류

LSTM(Long Short-Term Memory) 모델을 사용하는 접근 방식은 시퀀스 데이터 처리에 강력합니다. 이 방법에서는 Keras 토큰나이저를 사용하여 텍스트를 숫자로 변환하고, 패딩을 통해 입력 시퀀스의 길이를 통일합니다. 그 후, Embedding 레이어를 사용하여 단어를 밀집 벡터로 변환하고, LSTM 레이어를 통해 모델을 구성합니다. 이 모델 역시 훈련 후 성능을 평가합니다.

실습 과정의 중요 포인트

  • 데이터 전처리: AI-HUB 감정 말뭉치 데이터를 사용, 한글과 공백을 제외한 모든 문자 제거
  • 토큰화 및 벡터화: Keras 토큰나이저로 텍스트를 숫자로 변환, 패딩을 통해 일정 길이의 시퀀스로 만듬
  • 모델링: Embedding 레이어를 통해 단어를 벡터로 변환, LSTM을 사용한 언어 모델 구성
  • 성능 평가 예측: 훈련된 모델을 사용하여 감정 분류 성능 평가
# 필요한 라이브러리를 불러옵니다.
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Embedding, LSTM, Dense, Flatten
from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint

# 데이터 로드
final_data = pd.read_csv('https://github.com/ohgzone/file1/raw/main/aihub_coupus.csv')

# 데이터 전처리
final_data['문장'] = final_data['문장'].str.replace('[^가-힣 ]','')
final_data.dropna(inplace=True)
final_data.drop_duplicates(subset=['문장'], inplace=True)

# 라벨 인코딩
labels = final_data['감정'].unique()
label_dict = {label: index for index, label in enumerate(labels)}
final_data['감정'] = final_data['감정'].map(label_dict)

# 훈련 데이터와 테스트 데이터로 분리
X_train, X_test, y_train, y_test = train_test_split(final_data['문장'], final_data['감정'], test_size=0.2, random_state=42)

# A. 머신러닝 이용하여 자연어 Classification하기

# TF-IDF 벡터화
tfidf_vectorizer = TfidfVectorizer()
X_train_tfidf = tfidf_vectorizer.fit_transform(X_train)
X_test_tfidf = tfidf_vectorizer.transform(X_test)

# 랜덤 포레스트 분류기 학습
rf_classifier = RandomForestClassifier()
rf_classifier.fit(X_train_tfidf, y_train)

# 성능 평가
rf_predictions = rf_classifier.predict(X_test_tfidf)
print('Random Forest Classifier Accuracy:', accuracy_score(y_test, rf_predictions))

# B. LSTM 모델 이용하여 자연어 Classification하기

# 토큰화 및 시퀀스 변환
tokenizer = Tokenizer()
tokenizer.fit_on_texts(X_train)
X_train_seq = tokenizer.texts_to_sequences(X_train)
X_test_seq = tokenizer.texts_to_sequences(X_test)

# 패딩
max_len = max(len(l) for l in X_train_seq)
X_train_pad = pad_sequences(X_train_seq, maxlen=max_len)
X_test_pad = pad_sequences(X_test_seq, maxlen=max_len)

# LSTM 모델 구성
model = Sequential()
model.add(Embedding(len(tokenizer.word_index)+1, 32, input_length=max_len))
model.add(LSTM(16, return_sequences=True))
model.add(Flatten())
model.add(Dense(128, activation='swish'))
model.add(Dense(32, activation='swish'))
model.add(Dense(len(label_dict), activation='softmax'))

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

# 모델 학습
es = EarlyStopping(monitor='val_loss', patience=10, verbose=1)
model.fit(X_train_pad, y_train, epochs=50, batch_size=512, validation_split=0.2, verbose=1, callbacks=[es])

# 성능 평가
lstm_predictions = model.evaluate(X_test_pad, y_test, verbose=1)
print('LSTM Model Accuracy:', lstm_predictions[1])

 

728x90

'AI > Contents' 카테고리의 다른 글

꽃 이미지로 배우는 CNN 모델 구현 및 평가  (5) 2024.03.15
W5X00-EVB-Pico with SSL/TLS  (3) 2024.03.08
Attention Mechanism 이란? - (1)  (4) 2024.03.04
Chat With RTX 사용방법과 후기  (4) 2024.02.20
Stream을 아시나요?  (4) 2024.02.15