Project/캡스톤디자인2

[NLP Project] input 값을 넣어 개체명 인식하기 - 오류 해결

sillon 2022. 11. 7. 23:44
728x90
반응형

지난번 게시글에 학습한 모델을 바탕으로 새로운 input값을 넣어 개채명을 인식해보겠습니다.

지난번 코드와 출력결과는 아래와 같습니다.

input_predict.py

from keras.preprocessing.text import text_to_word_sequence
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.models import load_model
import numpy as np
def tokenize(samples):
  tokenizer = Tokenizer()
  tokenizer.fit_on_texts(samples)
  return tokenizer

def input_predict(sentence,input_tokenizer):
    # 예측
    
    idx2word = input_tokenizer.index_word
    idx2ner =  {'-': 1, 'cvl_b': 2, 'num_b': 3, 'per_b': 4, 'org_b': 5, 'dat_b': 6, 'loc_b': 7, 'trm_b': 8, 'evt_b': 9, 'num_i': 10, 'dat_i': 11, 'anm_b': 12, 'evt_i': 13, 'per_i': 14, 'org_i': 15, 'afw_b': 16, 'cvl_i': 17, 'trm_i': 18, 'tim_b': 19, 'fld_b': 20, 'afw_i': 21, 'tim_i': 22, 'plt_b': 23, 'mat_b': 24, 'loc_i': 25, 'anm_i': 26, 'fld_i': 27, 'mat_i': 28, 'plt_i': 29}
    idx2ner = {v:k for k,v in idx2ner.items()} # 딕셔너리 뒤집기

    y_predicted = model.predict(np.array(ipt_to_vec))
    y_predicted = np.argmax(y_predicted, axis = -1) # 가장 높은 확률을 추출 (예측값)

    print("{:15}||{}".format("단어","예측값"))
    print("-"*34)

    for w, pred in zip(sentence, y_predicted[0]):
        print("{:17}|{}".format(w,idx2ner[pred].upper()))



if __name__ == "__main__":
    input = "1839년 바그너는 괴테의 파우스트을 처음 읽고 그 내용에 마음이 끌려 이를 소재로 해서 하나의 교향곡을 쓰려는 뜻을 갖는다."
    sentence = text_to_word_sequence(input)
    input_tokenizer = tokenize(sentence)
    ipt_to_vec = input_tokenizer.texts_to_sequences(sentence)
    ipt_to_vec = pad_sequences(ipt_to_vec,padding='post',maxlen=70)
    model = load_model('models/test_model.h5')
    input_predict(sentence,input_tokenizer)
단어             ||예측값
----------------------------------
1839년            |-
바그너는             |-
괴테의              |-
파우스트을            |-
처음               |-
읽고               |-
그                |-
내용에              |-
마음이              |-
끌려               |-
이를               |-
소재로              |-
해서               |-
하나의              |-
교향곡을             |-
쓰려는              |-
뜻을               |-
갖는다              |-

지난번 코드에서 수정할 부분은 다음과 같습니다.

 

문제는 토큰화하는 과정이었습니다...

토큰화 과정에서 해당 리스트 전체가 토큰화 되지 않았었습니다 ㅠ

그래서 ipt_to_vec 변수에서 sentence 를 한번 더 대괄호 쳐주어야했습니다  

    ipt_to_vec = input_tokenizer.texts_to_sequences([sentence])

그러고나서 예측값이 잘 나왔습니다...

교향곡을 이라는 단어에 왜 NUM 태그가 붙었을까요..

하나씩 밀린거 아니면 성능이 매우 떨어져서 그런 것 같습니다.

 

728x90
반응형