본문 바로가기
First step/AI 기초반

[TIL]21.07.28

by Joshua21 2021. 7. 28.

오전중에는 어제 배운 cnn 활용해서 각자 웹에서 데이터를 찾아 실습해보았다.

워낙적은 데이터를 수작업으로 하나씩 모았고 학습이 실행되는지만 확인했다

정확도를 더 올리고 싶다면 더많은 데이터를 가지고 학습하고 epoch 나 lr등을 조정하면 정확도를 더 올릴수 있을것 같다.

 

오후에는 단어의 토큰화를 배웠다. 

#주어진 문장을 '단어'로 토큰화 하기

# 텍스트 전처리 함수 text_to_word_sequence() 호출

from tensorflow.keras.preprocessing.text import text_to_word_sequence

 

#전처리할 텍스트를 정합니다

text='해보지 않으면 해낼 수 없다.'

 

#해당 텍스트를 토큰화 합니다.

result =text_to_word_sequence(text)

print('\n원물:\n',text)

print('\n토큰화:\n',result)

 

import numpy as np

import tensorflow as tf

from numpy import array

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 Dense,Flatten,Embedding

 

# 전처리하려는 세 개의 문장 정하기

docs = ['먼저 텍스트의 각 단어를 나누어 토큰화 합니다.',

        '텍스트의 단어로 토큰화 해야 딥러닝에서 인식됩니다.',

        '토큰화 한 결과는 딥러닝에서 사용할 수 있습니다.',]

  

# 토큰화 함수를 이용해 전처리하는 과정

token = Tokenizer()       # 토큰화 함수 지정

token.fit_on_texts(docs)  # 토큰화 함수에 문장 적용하기

  

# 각 옵션에 맞춰 단어의 빈도 수를 계산한 결과 출력 

print("\n단어 카운트:\n", token.word_counts)

#Tokenizer()의 word_counts 함수는순서를 기억하는 orderdDict 클래스를 사용합니다.  

 

# 출력되는 순서는 랜덤 

print("\n문장 카운트: ", token.document_count)

print("\n각 단어가 몇 개의 문장에 포함되어 있는가:\n", token.word_docs)

print("\n각 단어에 매겨진 인덱스 값:\n", token.word_index)



from tensorflow.keras.preprocessing.text import Tokenizer

 

text = '오랫동안 꿈꾸는 이는 그 꿈을 닮아간다'

 

token= Tokenizer()

token.fit_on_texts([text])

print(token.word_index)

x=token.texts_to_sequences([text])

 

print('\텍스트,토큰화 결과:\n',x)

from tensorflow.keras.utils import to_categorical

 

word_size=len(token.word_index)+1

x=to_categorical(x,num_classes=word_size)

 

print(x)

#영화 리뷰가 긍정적인지 부정적인지 예측하기

from numpy import array

#텍스트 리뷰자료를 지정합니다.

docs = ['너무 재밌네요','최고예요','참 잘 만든 영화예요','추천하고 싶은 영화입니다.',

        '한번 더 보고싶네요','글쎄요','별로예요','생각보다 지루하네요','연기가 어색해요','재미없어요']

#긍정 리뷰는1, 부정리뷰는 0으로 클래스를 지정합니다.

classes=array([1,1,1,1,1,0,0,0,0,0])

 

from tensorflow.keras.preprocessing.text import Tokenizer

 

#토큰화

token=Tokenizer()

token.fit_on_texts(docs)

print(token.word_index)

x=token.texts_to_sequences(docs)

print('\n리뷰 텍스트, 토큰화 결과 : \n',x)

 

from tensorflow.keras.preprocessing.sequence import pad_sequences

#패딩,서로 다른 길이의 데이터를 4로 맞추어 줍니다.

padded_x=pad_sequences(x,4)

print('\n패딩 결과:\n',padded_x)

 

from tensorflow.keras.models import Sequential

from tensorflow.keras.layers import Dense,Flatten,Embedding

 

from tensorflow.keras.preprocessing.text import Tokenizer

 

text='I am a boy. My name is Joshua'

 

#토큰화

token=Tokenizer(

    num_words=None,

    filters='!"#$%&()*+-,./:;<>=?@[\\]^_`{|}~\t\n',

    lower=False, split=' ',char_level=False,oov_token=None,document_count=0)

 

# num_words:단어 빈도가 많은 수서로 num_words개의단어를 보존한다.

# filters: 걸러낼 문자리스트를 적어준다.

# lower : 입력 받은 문자열을 소문잘 변환 할지를 T,F로 적어준다

# split: 문자열을 적어줘야하고,단어를 분리하는 기준을 적어준다

# char_level:True 인경우 모든 문자가 토큰으로 처리된다.

# oov_token : 값이 지정된 경우 text_to_sequence  호출과정에서 word_index에 추가되서 out of vocabulary words를 대체한다

 

token.fit_on_texts([text])

print(token.word_index)

 

import numpy as np

samples=['The cat sat on the mat.','The dog ate my homework.']



token_index={}

 

for sample in samples:

  print(sample)

  for word in sample.replace('.',' ').split():

    token_index[word] = len(token_index)+1

 

print(token_index)

 

 

# 각 샘플을 벡터로 변환합니다

# 각 샘플에서 max_length 까지 단어만 사용합니다

max_length=10

#결과를 저장할 배열입니다.

 

results=np.zeros((len(samples),max_length,max(token_index.values())+1))

#results=np.zeros(2,10,11)

 

for i, sample in enumerate(samples):

  print(sample)

  for j,word in list(enumerate(sample.replace('.',' ').split()))[:max_length]:

    #token_index(위에 만들어진 토큰의인덱스딕셔너리)

    index= token_index.get(word)

    results[i,j,index]=1

print(results)


#문장 분류해보기

import sys

import string

samples=['The cat sat on the mat.','The dog ate my homework.']

 

characters=string.printable

token_index=dict(zip(characters, range(1,len(characters)+1)))

 

print(token_index)

import numpy as np

 

max_length=50

#결과를 담을 3차원 배열을 0으로 초기화 하여 생성

results=np.zeros((len(samples),max_length,max(token_index.values())+1)) #2,50,101

 

for i,sample in enumerate(samples):

  for j,characters in enumerate(sample[:max_length]):

    index= token_index.get(characters)

    results[i,j,index]=1 #해당 되는아스키 코드의 index만 1로

import sys

np.set_printoptions(threshold=sys.maxsize)#print에서 생략하지 않고 모든 행/열을 표시

print(results)

 

#원-핫 인코딩 -해싱 기법

import numpy as np

samples=['The cat sat on the mat.','The dog ate my homework.']

 

# 단어의 크기가 1,000인 벡터로 저장합니다

# 1000개(또는 그이상)의 단어가 있다면 해싱 충돌이 늘어나고 

# 이노딩의 정확도가 감소될 것입니다

dimensionality=1000

max_length=10

 

results=np.zeros((len(samples),max_length,dimensionality)) #2,50,101

 

for i,sample in enumerate(samples):

  for j,word in enumerate(sample[:max_length]):

    #단어를 해싱하여 0,1000사이의 랜덤한 정수 인덱스로 변환합니다

    index= abs(hash(word)) % dimensionality

    results[i,j,index]=1

 

print(results)

#IMDB 영화 리뷰 감성 예측 문제 연습하기

 

from tensorflow.keras.datasets import imdb

from tensorflow.keras import preprocessing

 

max_features = 10000

maxlen=20

 

(X_train,Y_train),(X_test,Y_test)= imdb.load_data(num_words=max_features)

 

X_train = preprocessing.sequence.pad_sequences(X_train, maxlen=maxlen)

 

X_test = preprocessing.sequence.pad_sequences(X_test, maxlen=maxlen)

 

print(X_train.shape,Y_train.shape)

print(X_test.shape,Y_test.shape)

 

print(X_train[0])

 

from tensorflow.keras.models import Sequential

from tensorflow.keras.layers import Flatten,Dense,Embedding

 

print(X_train.shape)

 

model=Sequential()

#나중에 임베딩된 입력을 플래

model.add(Embedding(10000,8,input_length=maxlen))

 

model.add(Flatten())

 

model.add(Dense(1,activation='sigmoid'))

model.compile(optimizer='rmsprop',loss='binary_crossentropy',metrics=['acc'])

model.summary()

 

history=model.fit(X_train,Y_train,epochs=10,batch_size=32,validation_split=0.2)

 

loss: 0.3018 - acc: 0.8747 - val_loss: 0.5263 - val_acc: 0.7518

 

학습을 더한다면 더 좋은 예측치를 얻을수도 있을것 같다.

'First step > AI 기초반' 카테고리의 다른 글

[TIL]21.07.30 reuters 기사 분류  (0) 2021.07.30
[TIL]21.07.29 임베딩  (0) 2021.07.29
[TIL]21.07.27 CNN 기초2  (0) 2021.07.27
[TIL]21.07.26 CNN  (0) 2021.07.26
[TIL]21.07.23 mnist 사용 기초  (0) 2021.07.23