콘텐츠로 바로가기

now0930 일지

이런저런 생각

  • 홈
  • 비공개
  • 강좌
  • 잔여 작업 조회
  • 위치

keras로 키워드 분석(3/5)

과거 acc를 못 올리는 이유를 알아보았다. 둘 중 하나를 선택하는 문제는 activation softmax대신 sigmoid를 사용해야 한다. 아래로 고치고 1,000번 학습시켰다. 최고값을 찾은 weight를 파일로 저장했다. 147번 학습해보니 0.99?? 정확도를 보이나, vlaidation 체크용은 0.87대 정확도를 보인다.

from konlpy.tag import Okt
okt=Okt()
from gensim.models import Word2Vec
from keras.layers import Dense, Flatten, SimpleRNN
from keras.models import Sequential
from keras.preprocessing.sequence import pad_sequences
from keras.layers.embeddings import Embedding
import numpy as np

#model save
from keras.callbacks import ModelCheckpoint

model=Word2Vec.load('./myModel')
MAX_VOCAB=len(model.wv.vocab)
WV_SIZE=model.wv.vectors.shape[1]
print("로드한 모델 vocab 최대값은", MAX_VOCAB)
print("로드한 모델 vectror 크기는", WV_SIZE)

#b=model.wv.most_similar(positive=["클램프", "잠김"])
print(model)

#print(model.wv["후드힌지시프트"])

#tokenizer 설정.
#Okt()사용.

targetFile = open("./tagv4태그붙인파일.csv", "r", encoding='UTF-8')

i=0
sentence_by_index=[]
traing_result=[]
WORD_MAX=6
#WV_SIZE=10
#model을 load후 최대값 확인
#MAX_VOCAB=3532

#못찾은 단어를 입력하기 위한 부분.
#삭제.
#VACANT_ARRAY = np.zeros((4,1))


while True:

    lines = targetFile.readline()
    firstColumn = lines.split(',')
    #print(lines)

    if not lines:break
    #if i == 1000:break
    i=i+1
    #word2vec를 만든 형태소 분석기를 사용..
    tokenlist = okt.pos(firstColumn[1], stem=True, norm=True)
    temp=[]

    for word in tokenlist:
        #word[0]은 단어.
        #word[1]은 품사.
        #print("word[0]은",word[0])
        #print("word[1]은",word[1])

        if word[1] in ["Noun","Alpha","Number"]:
            #temp.append(model.wv[word[0]])
            #word[0]를 index로 변경.
            #단어장에 없는 단어를 예외처리
            #입력과 출력을 같이 맞추기 위해, 입출력 동시에 append
            try:
                #print("---------")
                #print(i)
                #print(word[0])
                temp.append(model.wv.vocab.get(word[0]).index)
                #print(model.wv.vocab.get(word[0]).index)

            except AttributeError:
                #값을 못찾으면 0값 입력
                temp.append(0)
                #print(temp)
    #print("index is ", i)
    #print("temp is", temp)

    #가져단 쓴 코드는 temp에 값이 있을 경우에만 append.
    #출력과 맞추기 위해, list가 비어있어도 append로 변경.
    #if temp:
    #    sentence_by_index.append(temp)
    sentence_by_index.append(temp)

    #결과를 배열로 입력
    tempResult=firstColumn[4].strip('\n')
    traing_result.append(tempResult)

targetFile.close()
training_result_asarray = np.asarray(traing_result)

#최대 단어를 6으로 설정.
#행 수보다 6까지 뒤쪽으로 0을 채움.
#word2Vec가 실수이므로 float32로 설정
#result가 embedding_matrix
fixed_sentence_by_index = pad_sequences(sentence_by_index, maxlen=WORD_MAX, padding='post', dtype='int')
print("입력 시퀀스는", fixed_sentence_by_index.shape)
print("출력 시퀀스는", training_result_asarray.shape)
#print("index로 변경한 값은",fixed_sentence_by_index)
#print("embedding vector는", model.wv.vectors)

#keras 모델 설정.
model2= Sequential()
model2.add(Embedding(input_dim=MAX_VOCAB, output_dim=WV_SIZE, input_length=WORD_MAX, weights=[model.wv.vectors], trainable=False))
#model2.add(Flatten())
model2.add(SimpleRNN(128, input_shape=(4,4)))
model2.add(Dense(1, activation='sigmoid'))
model2.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

#save model 경로.
weight_path = "./saved_network_weight.h5"
checkpoint = ModelCheckpoint(weight_path, monitor='acc', verbose=2, save_best_only=True, mode='auto')
callbacks_list = [checkpoint]

model2.fit(x=fixed_sentence_by_index, y=training_result_asarray, epochs=10, verbose=1, validation_split=0.2, callbacks=callbacks_list)
model2.summary()


#input_predict =model.wv.vocab.get(word[0]).index
num0 = model.wv.vocab.get("B").index
num1 = model.wv.vocab.get("180").index
num2 = model.wv.vocab.get("셔틀").index
num3 = model.wv.vocab.get("불간섭").index

input_predict = np.asarray([[num0, num1, num2, num3, 0, 0]])
#print("input_predict 는",input_predict.shape)
myPrediction = model2.predict_classes(input_predict, batch_size=10, verbose=1)
myPredictionAcc = model2.predict(input_predict, batch_size=10, verbose=1)
print("내 예상", myPrediction,  "with ", myPredictionAcc)

1,000회 하는데 4~5시간정도 걸린 듯 하다. 그러나 불행하게도 weight는 초기에 한번 업데이트하고 말아버렸다. 그래도 이렇게 간단한 구조인데도 87%를 유지하니 좀 파보면 나아질 듯 하다.

이제 입력을 받아들여 이를 판정하는 부분을 만들어 보자.

이 글 공유하기:

  • Tweet
발행일 2019-09-14글쓴이 이대원
카테고리 tensorflow 태그 konlpy, tensorflow, word2vec, 명사분석, 자연어처리, 태그분석, 한국어, 형태소분석

댓글 남기기응답 취소

이 사이트는 Akismet을 사용하여 스팸을 줄입니다. 댓글 데이터가 어떻게 처리되는지 알아보세요.

글 내비게이션

이전 글

keras로 키워드 분석(2/5)

다음 글

keras로 키워드 분석(4/5)

2025 5월
일 월 화 수 목 금 토
 123
45678910
11121314151617
18192021222324
25262728293031
4월    

최신 글

  • common mode, differential mode 2025-05-11
  • signal conditioner, 신호 처리기 2025-05-10
  • strain gage 2025-05-09
  • 칼만 필터 2025-05-01
  • positioner(I/P) 2025-04-26

카테고리

  • 산업계측제어기술사
  • 삶 자국
    • 책과 영화
    • 투자
  • 생활코딩
    • LEGO
    • ROS
    • tensorflow
  • 전기기사
  • 피아노 악보

메타

  • 로그인
  • 엔트리 피드
  • 댓글 피드
  • WordPress.org

페이지

  • 소개
  • 잔여 작업 조회
    • 작업 추가
    • 작업의 사진 조회
    • 작업 수정 페이지
  • 사진
    • GPS 입력된 사진
    • 사진 조회
  • 위치
    • 하기 휴가 방문지
    • 해외 출장

태그

android bash c docker driver FSM gps java kernel LEGO linux mysql network program opcua open62541 plc programmers python raspberry reinforcementLearning ros state space system program tensorflow transfer function 경제 미국 민수 삼국지 세계사 실기 에너지 역사 유전자 일본 임베디드 리눅스 전기기사 조선 중국 채윤 코딩 테스트 통계 한국사 한국어

팔로우하세요

  • Facebook
now0930 일지
WordPress로 제작.
 

댓글 로드중...