Dacon에서 연습용으로 할 수 있는 것이다. 

 

import pandas as pd
import urllib.request
%matplotlib inline

import matplotlib.pyplot as plt
import re
from konlpy.tag import Okt
from tensorflow.keras.preprocessing.text import Tokenizer
import numpy as np
from tensorflow.keras.preprocessing.sequence import pad_sequences
import os
from tensorflow.keras.datasets import reuters
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense,LSTM,Embedding
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.models import load_model
from tqdm import tqdm

 

데이터 불러오기

train_data=pd.read_csv('d:/data/train.csv',encoding='utf-8')
test_data=pd.read_csv('d:/data/test.csv',encoding='utf-8')
sample_submission=pd.read_csv('d:/data/sample_submission.csv',encoding='utf-8')

결측치 제거 및 간단한 전처리

train_data=train_data.dropna(how='any')
train_data['data']=train_data['data'].str.replace("[^ㄱ-ㅎㅏ-ㅣ가-힣 ]","")
test_data['data']=test_data['data'].str.replace("[^ㄱ-ㅎㅏ-ㅣ가-힣 ]","")
stopwords= ['의','가','이','은','들','는','좀','잘','걍','과','도','를','으로','자','에','와','한','하다','을']

konlpy에서 okt라는 자연어처리 라이브러리 불러오기

okt=Okt()

훈련용 데이터에 대해 자연어 처리 및 불용어처리 

*tqdm에 대해서는 추후 포스팅 하겠다.

X_train=[]
for sentence,i in zip(train_data['data'],tqdm(range(len(train_data['data'])))):
    temp_X=[]
    temp_X=okt.morphs(sentence,stem=True)
    temp_X=[word for word in temp_X if not word in stopwords]
    X_train.append(temp_X) 

테스트용 데이터에 대해 자연어 처리 및 불용어처리

X_test=[]
for sentence in test_data['data']:
    temp_X=[]
    temp_X=okt.morphs(sentence,stem=True)
    temp_X=[word for word in temp_X if not word in stopwords]
    X_test.append(temp_X)

fit_on_texts() 메서드를 통해 문자데이터를 입력받아 리스트 형식으로 변환.

text_to_sequences() 메서드를 통해 단어들을 시퀀스형식으로 변환

tokenizer=Tokenizer()
tokenizer.fit_on_texts(X_train)

vocab_size=30000
tokenizer=Tokenizer(vocab_size)
tokenizer.fit_on_texts(X_train)
X_train=tokenizer.texts_to_sequences(X_train)
X_test=tokenizer.texts_to_sequences(X_test)

pad_sequences() 메서드를 통해 서로 다른 개수의 단어로 이루어진 문장을 같은 길이로 만들어주기 위해 패딩한다.

500자로 동일하게 맞춰준다.

max_len=500
X_train=pad_sequences(X_train,maxlen=max_len)
X_test=pad_sequences(X_test,maxlen=max_len)

to_categorical() 메서드를 통해 One-hot인코딩 시행

*One-hot encoding:10진 정수 형식을 특수한 2진 바이너리 형식으로 변환, 파라미터로 값에 크기만큼 0으로 된 배열을 만들고, 파라미터 값 위치에만 1(hot)을 넣어준다.

y_train=to_categorical(train['category'])

데이터 모델링

Sequential(): Sequential()모델은 각 레이어에 정확히 하나의 입력 텐서와 하나의 출력 텐서가 있는 일반 레이어 스택에 적합.

Sequential 모델은 다음의 경우에 적합하지 않습니다.

  • 모델에 다중 입력 또는 다중 출력이 있습니다
  • 레이어에 다중 입력 또는 다중 출력이 있습니다
  • 레이어 공유를 해야 합니다
  • 비선형 토폴로지를 원합니다(예: 잔류 연결, 다중 분기 모델)

언어의 벡터화를 위해 Word Embedding 시행

LSTM기법 사용(120 layer)

활성화 함수:softmax 

전체 compile: 손실함수는 'categorical_crossentrophy'  이는 레이블이 n개일때 사용한다. 2개일때는 'binary cross entrophy'를  사용한다.

 

model=Sequential()
model.add(Embedding(vocab_size,120))
model.add(LSTM(120))
model.add(Dense(3,activation='softmax'))

model.compile(loss='categorical_crossentrophy',optimizer='adam',metrics=['acc'])
history=model.fit(X_train,y_train,batch_size=128,epochs=15)

 

예측한 자료를 csv 파일로 내보내자.

y_pred=model.predict_classes(X_test)
sample_submission['category']=y_pred
sample_submission.to_csv('d:/data/submission.csv',encoding='utf-8',index=False)

 

+ Recent posts