-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Description
pip install konlpy
import gspread
from google.colab import drive
drive.mount('/content/drive')
train = '/content/drive/My Drive/mbti/mbti_train.xlsx'
test= '/content/drive/My Drive/mbti/mbti_test.xlsx'
import pandas as pd
import urllib.request
import matplotlib.pyplot as plt
import re
from konlpy.tag import Okt
from tqdm import tqdm
from tensorflow.keras.preprocessing.text import Tokenizer
import numpy as np
from tensorflow.keras.preprocessing.sequence import pad_sequences
train_data = pd.read_excel(train)
test_data = pd.read_excel(test)
import pandas as pd
from sklearn.datasets import fetch_20newsgroups
import matplotlib.pyplot as plt
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.utils import to_categorical
train_data['내용'] = train_data['내용'].str.replace('^ +', "") # 공백은 empty 값으로 변경
train_data['내용'].replace('', np.nan, inplace=True) # 공백은 Null 값으로 변경
train_data = train_data.dropna(how='any') # Null 값 제거
print('전처리 후 훈련용 샘플의 개수 :',len(test_data))
test_data['내용'] = test_data['내용'].str.replace('^ +', "") # 공백은 empty 값으로 변경
test_data['내용'].replace('', np.nan, inplace=True) # 공백은 Null 값으로 변경
test_data = test_data.dropna(how='any') # Null 값 제거
print('전처리 후 테스트용 샘플의 개수 :',len(test_data))
stopwords = ['의','가','이','은','들','는','좀','잘','걍','과','도','를','을','으로','자','에','와','한','하다',
'인프피','인픕','인픞','인프제','인티피','인팁','인팊','인티제','잇프피','잇픕','잇픞','잇프제',
'잇티피','잇팁','잇팊','잇티제','엔프피','엔픕','엔픞','엔프제','엔티피','엔팁','엔팊','엔티제',
'엣프피','엣픕','엣픞','엣프제','엣티피','엣팁','엣팊','엣티제']
okt = Okt()
train_text = []
for sentence in tqdm(train_data['내용']):
tokenized_sentence = okt.morphs(sentence, stem=True) # 토큰화
stopwords_removed_sentence = [word for word in tokenized_sentence if not word in stopwords] # 불용어 제거
train_text.append(stopwords_removed_sentence)
test_text = []
for sentence in tqdm(test_data['내용']):
tokenized_sentence = okt.morphs(sentence, stem=True) # 토큰화
stopwords_removed_sentence = [word for word in tokenized_sentence if not word in stopwords] # 불용어 제거
test_text.append(stopwords_removed_sentence)
train_label = train_data['label']
test_label = test_data['label']
max_words = 10000
num_classes = 20
def prepare_data(train_data, test_data, mode): # 전처리 함수
tokenizer = Tokenizer(num_words = max_words) # max_words 개수만큼의 단어만 사용한다.
tokenizer.fit_on_texts(train_data)
X_train = tokenizer.texts_to_matrix(train_data, mode=mode) # 샘플 수 × max_words 크기의 행렬 생성
X_test = tokenizer.texts_to_matrix(test_data, mode=mode) # 샘플 수 × max_words 크기의 행렬 생성
return X_train, X_test, tokenizer.index_word
X_train, X_test, index_to_word = prepare_data(train_text, test_text, 'binary') # binary 모드로 변환
y_train = to_categorical(train_label, num_classes) # 원-핫 인코딩
y_test = to_categorical(test_label, num_classes) # 원-핫 인코딩
print('훈련 샘플 본문의 크기 : {}'.format(X_train.shape))
print('훈련 샘플 레이블의 크기 : {}'.format(y_train.shape))
print('테스트 샘플 본문의 크기 : {}'.format(X_test.shape))
print('테스트 샘플 레이블의 크기 : {}'.format(y_test.shape))
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout
def fit_and_evaluate(X_train, y_train, X_test, y_test):
model = Sequential()
model.add(Dense(256, input_shape=(max_words,), activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X_train, y_train, batch_size=128, epochs=5, verbose=1, validation_split=0.1)
score = model.evaluate(X_test, y_test, batch_size=128, verbose=0)
return score[1]
modes = ['binary', 'count', 'tfidf', 'freq'] # 4개의 모드를 리스트에 저장.
for mode in modes: # 4개의 모드에 대해서 각각 아래의 작업을 반복한다.
X_train, X_test, _ = prepare_data(train_text, test_text, mode) # 모드에 따라서 데이터를 전처리
score = fit_and_evaluate(X_train, y_train, X_test, y_test) # 모델을 훈련하고 평가.
print(mode+' 모드의 테스트 정확도:', score)
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels