Ejemplo n.º 1
0
def predict(text):
    word2idx, idx2word, vocab_len = data.load_vocabulary()
    classifier = tf.estimator.Estimator(model_fn=ml.model,
                                        model_dir=DEFINES.check_point_path,
                                        params={
                                            'hidden_size': DEFINES.hidden_size,
                                            'layer_size': DEFINES.layer_size,
                                            'learning_rate':
                                            DEFINES.learning_rate,
                                            'vocab_len': vocab_len,
                                            'embedding_size':
                                            DEFINES.embedding_size,
                                            'embedding': DEFINES.embedding,
                                            'multilayer': DEFINES.multilayer,
                                        })
    # 테스트셋 인코딩 / 디코딩 입력 / 디코딩 출력
    predic_input_enc, predic_input_enc_length = data.enc_processing([text],
                                                                    word2idx)
    predic_input_dec, predic_input_dec_length = data.dec_input_processing(
        [""], word2idx)
    predic_target_dec = data.dec_target_processing([""], word2idx)

    # 예측 실행
    predictions = classifier.predict(input_fn=lambda: data.eval_input_fn(
        predic_input_enc, predic_input_dec, predic_target_dec, DEFINES.
        batch_size))

    # 예측한 값을 텍스트로 변경하는 부분이다.
    data.pred2string(predictions, idx2word)
Ejemplo n.º 2
0
def main(self):
    data_out_path = os.path.join(os.getcwd(), DATA_OUT_PATH)
    os.makedirs(data_out_path, exist_ok=True)
    # 데이터를 통한 사전 구성 한다.
    word2idx,  idx2word, vocabulary_length = data.load_vocabulary()
	# 훈련 데이터와 테스트 데이터를 가져온다.
    train_input, train_label, eval_input, eval_label = data.load_data()

	# 훈련셋 인코딩 / 디코딩 입력 / 디코딩 출력 만드는 부분이다.
    train_input_enc, train_input_enc_length = data.enc_processing(train_input, word2idx)
    train_input_dec, train_input_dec_length = data.dec_input_processing(train_label, word2idx)
    train_target_dec = data.dec_target_processing(train_label, word2idx)
	
	# 평가셋 인코딩 / 디코딩 입력 / 디코딩 출력 만드는 부분이다.
    eval_input_enc, eval_input_enc_length = data.enc_processing(eval_input,word2idx)
    eval_input_dec, eval_input_dec_length = data.dec_input_processing(eval_label, word2idx)
    eval_target_dec = data.dec_target_processing(eval_label, word2idx)

    # 현재 경로'./'에 현재 경로 하부에 체크 포인트를 저장한 디렉토리를 설정한다.
    check_point_path = os.path.join(os.getcwd(), DEFINES.check_point_path)
    os.makedirs(check_point_path, exist_ok=True)

	# 에스티메이터 구성한다.
    classifier = tf.estimator.Estimator(
            model_fn=ml.model, # 모델 등록한다.
            model_dir=DEFINES.check_point_path, 
            params={
                'hidden_size': DEFINES.hidden_size, 
                'layer_size': DEFINES.layer_size, 
                'learning_rate': DEFINES.learning_rate, 
                'vocabulary_length': vocabulary_length, 
                'embedding_size': DEFINES.embedding_size, 
                'embedding': DEFINES.embedding, 
                'multilayer': DEFINES.multilayer,
            })

	# 학습 실행
    classifier.train(input_fn=lambda:data.train_input_fn(
        train_input_enc, train_input_dec, train_target_dec,  DEFINES.batch_size), steps=DEFINES.train_steps)
    
    # 평가 실행
    eval_result = classifier.evaluate(input_fn=lambda:data.eval_input_fn(
        eval_input_enc, eval_input_dec, eval_target_dec,  DEFINES.batch_size))
    print('\nEVAL set accuracy: {accuracy:0.3f}\n'.format(**eval_result))


	# 테스트셋 인코딩 / 디코딩 입력 / 디코딩 출력 만드는 부분이다.
    predic_input_enc, predic_input_enc_length = data.enc_processing(["가끔 궁금해"], word2idx)
    predic_input_dec, predic_input_dec_length = data.dec_input_processing([""], word2idx)       
    predic_target_dec = data.dec_target_processing([""], word2idx)      

    # 예측 실행
    predictions = classifier.predict(
        input_fn=lambda:data.eval_input_fn(predic_input_enc, predic_input_dec, predic_target_dec, DEFINES.batch_size))
    
    # 예측한 값을 텍스트로 변경하는 부분이다.
    data.pred2string(predictions, idx2word)
Ejemplo n.º 3
0
def main(self):
    data_out_path = os.path.join(os.getcwd(), DATA_OUT_PATH)
    os.makedirs(data_out_path, exist_ok=True)

    word2idx, idxword, vocabulary_length = data.load_vocabulary()
    train_input, train_label, eval_input, eval_label = data.load_data()
    train_input_enc, train_input_enc_length = data.enc_processing(
        train_input, word2idx)
    train_input_dec, train_input_dec_length = data.dec_input_processing(
        train_label, word2idx)
    train_target_dec = data.dec_target_processing(train_label, word2idx)

    eval_input_enc, eval_input_enc_length = data.enc_processing(
        eval_input, word2idx)
    eval_input_dec, eval_input_dec_length = data.dec_input_processing(
        eval_label, word2idx)
    eval_target_dec = data.dec_target_processing(eval_label, word2idx)

    check_point_path = os.path.join(os.getcwd(), DEFINES.check_point_path)
    os.makedirs(check_point_path, exist_ok=True)

    classifier = tf.estimator.Estimator(model_fn=ml.model,
                                        model_dir=DEFINES.check_point_path,
                                        params={
                                            'hidden_size': DEFINES.hidden_size,
                                            'layer_size': DEFINES.layer_size,
                                            'learning_rate':
                                            DEFINES.learning_rate,
                                            'vocabulary_length':
                                            vocabulary_length,
                                            'embedding_size':
                                            DEFINES.embedding_size,
                                            'embedding': DEFINES.embedding,
                                            'multilayer': DEFINES.multilayer,
                                        })

    classifier.train(input_fn=lambda: data.train_input_fn(
        train_input_enc, train_input_dec, train_target_dec, DEFINES.batch_size
    ),
                     steps=DEFINES.train_steps)

    eval_result = classifier.evaluate(input_fn=lambda: data.eval_input_fn(
        eval_input_enc, eval_input_dec, eval_target_dec, DEFINES.batch_size))
    print('\nEVAL set accuracy: {accuracy:0.3f}\n'.format(**eval_result))

    predic_input_enc, predic_input_enc_length = data.enc_processing(["가끔 궁금해"],
                                                                    word2idx)
    predic_input_dec, predic_input_decLength = data.dec_input_processing(
        [""], word2idx)
    predic_target_dec = data.dec_target_processing([""], word2idx)

    predictions = classifier.predict(input_fn=lambda: data.eval_input_fn(
        predic_input_enc, predic_input_dec, predic_target_dec, DEFINES.
        batch_size))

    data.pred2string(predictions, idx2word)
Ejemplo n.º 4
0
        classifier = tf.estimator.Estimator(
            model_fn=ml.Model,  # 모델 등록
            model_dir=DEFINES.check_point_path,  # 체크포인트 위치 등록
            params={  # 모델쪽으로 파라미터 전달
                'hidden_size': DEFINES.hidden_size,  # 가중치 크기 설정,
                'layer_size': DEFINES.layer_size,  # 멀티레이어 층 개수 설정
                'learning_rate': DEFINES.learning_rate,  # 학습률 설정}
                'teacher_forcing_rate':
                DEFINES.teacher_forcing_rate,  # 학습시 디코더 인풋 정답 지원율 설정
                'vocabulary_length': vocabulary_length,  # 딕셔너리 크기를 설정
                'embedding': DEFINES.embedding_size,  # 임베딩 사용 여부를 결정
                'multilayer': DEFINES.multilayer,  # 멀리 레이어 사용 여부를 설정
                'attention': DEFINES.attention,  # 어텐션 지원 여부를 설정
                'teacher_forcing':
                DEFINES.teacher_forcing,  # 학습시 디코더 인풋 정답 지원 여부 설정
                'loss_mask': DEFINES.loss_mask,  # PAD에 대한 마스크를 통한 loss를 제한
                'serving': DEFINES.serving  # 모델 저장 및 serving 여부를 위한 설정
            })
    if DEFINES.serving == True:
        predictions = predictor_fn({
            'input': predic_input_enc,
            'output': predic_target_dec
        })
        data.pred2string(predictions, idx2char)
    else:
        # 예측을 하는 부분
        predictions = classifier.predict(input_fn=lambda: data.eval_input_fn(
            predic_input_enc, predic_target_dec, DEFINES.batch_size))
        # 예측한 값을 인지할 수 있도록 텍스트로 변경하는 부분
        data.pre2string(predictions, idx2char)
Ejemplo n.º 5
0
def main(self):
    # 데이터를 통한 사전 구성 한다.
    char2idx,  idx2char, vocabularyLength = data.loadVocabulary()
	# 훈련 데이터와 테스트 데이터를 가져온다.
    xTrain, yTrain, xTest, yTest = data.loadData()

	# 훈련셋 인코딩 만드는 부분이다.
    inputTrainEnc, inputTrainEncLength = data.encProcessing(xTrain, char2idx)
	# 훈련셋 디코딩 입력 부분 만드는 부분이다.
    outputTrainDec, outputTrainDecLength = data.decOutputProcessing(yTrain, char2idx)
	# 훈련셋 디코딩 출력 부분 만드는 부분이다.
    targetTrainDec = data.decTargetProcessing(yTrain, char2idx)
	
    inputTestEnc, inputTestEncLength = data.encProcessing(xTest,char2idx)
    outputTestDec, outputTestDecLength = data.decOutputProcessing(yTest, char2idx)
    targetTestDec = data.decTargetProcessing(yTest, char2idx)

    # 현재 경로'./'에 현재 경로 하부에 
    # 체크 포인트를 저장한 디렉토리를 설정한다.
    checkPointPath = os.path.join(os.getcwd(), DEFINES.checkPointPath)
    # 디렉토리를 만드는 함수이며 두번째 인자 exist_ok가 
    # True이면 디렉토리가 이미 존재해도 OSError가 
    # 발생하지 않는다.
    # exist_ok가 False이면 이미 존재하면 
    # OSError가 발생한다.
    os.makedirs(checkPointPath, exist_ok=True)

	# 에스티메이터 구성한다.
    classifier = tf.estimator.Estimator(
            model_fn=ml.Model, # 모델 등록한다.
            model_dir=DEFINES.checkPointPath, # 체크포인트 위치 등록한다.
            params={ # 모델 쪽으로 파라메터 전달한다.
                'hiddenSize': DEFINES.hiddenSize, # 가중치 크기 설정한다.
                'layerSize': DEFINES.layerSize, # 멀티 레이어 층 개수를 설정한다.
                'learningRate': DEFINES.learningRate, # 학습율 설정한다. 
                'vocabularyLength': vocabularyLength, # 딕셔너리 크기를 설정한다.
                'embeddingSize': DEFINES.embeddingSize, # 임베딩 크기를 설정한다.
                'embedding': DEFINES.embedding, # 임베딩 사용 유무를 설정한다.
                'multilayer': DEFINES.multilayer, # 멀티 레이어 사용 유무를 설정한다.
            })

	# 학습 실행
    print(inputTrainEnc.shape, outputTrainDec.shape, targetTrainDec.shape)
    classifier.train(input_fn=lambda:data.trainInputFn(
        inputTrainEnc, outputTrainDec, targetTrainDec,  DEFINES.batchSize), steps=DEFINES.trainSteps)

    evalResult = classifier.evaluate(input_fn=lambda:data.evalInputFn(
        inputTestEnc, outputTestDec, targetTestDec,  DEFINES.batchSize))
    print('\nTest set accuracy: {accuracy:0.3f}\n'.format(**evalResult))


	# 테스트용 데이터 만드는 부분이다.
    # 인코딩 부분 만든다.
    inputPredicEnc, inputPredicEncLength = data.encProcessing(["가끔 궁금해"], char2idx)
    # 학습 과정이 아니므로 디코딩 입력은 
    # 존재하지 않는다.(구조를 맞추기 위해 넣는다.)
    outputPredicDec, outputPredicDecLength = data.decOutputProcessing([""], char2idx)       
    # 학습 과정이 아니므로 디코딩 출력 부분도 
    # 존재하지 않는다.(구조를 맞추기 위해 넣는다.)
    targetPredicDec = data.decTargetProcessing([""], char2idx)      

    # 예측을 하는 부분이다.
    predictions = classifier.predict(
        input_fn=lambda:data.evalInputFn(inputPredicEnc, outputPredicDec, targetPredicDec, DEFINES.batchSize))
    
    # 예측한 값을 인지 할 수 있도록 
    # 텍스트로 변경하는 부분이다.
    data.pred2string(predictions, idx2char)
Ejemplo n.º 6
0
def main(self):
    ## DATA_OUT_PATH가 없으면 생성, 있으면 그대로 폴더 사용
    data_out_path = os.path.join(os.getcwd(), DATA_OUT_PATH)
    os.makedirs(data_out_path, exist_ok = True)
    ## 단어 사전 불러오기
    word2idx, idx2word, vocabulary_length = data.load_vocabulary()
    ## 데이터 불러오기
    train_input, train_label, eval_input, eval_label = data.load_data()
    
    ## 인코더 입력, 디코더 입력, 디코더 타깃  훈련 데이터로 만들기
    train_input_enc, train_input_enc_length = data.enc_processing(train_input, word2idx)
    train_output_dec, train_input_dec_length = data.dec_input_processing(train_label, word2idx)
    
    train_target_dec = data.dec_target_processing(train_label, word2idx)
    
    ## 인코더 입력, 디코더 입력, 디코더 타깃  검증 데이터로 만들기
    eval_input_enc, eval_input_enc_length = data.enc_processing(eval_input, word2idx)
    eval_output_dec, eval_input_dec_length = data.dec_input_processing(eval_label, word2idx)
    
    eval_target_dec = data.dec_target_processing(eval_label, word2idx)
    
    ## 체크 포인트 설정
    ## data_out 폴더에 생성될 것
    check_point_path = os.path.join(os.getcwd(), DEFINES.check_point_path)
    os.makedirs(check_point_path, exist_ok = True)
    
    
    # Estimator 객체 생성
    classifier = tf.estimator.Estimator(model_fn = ml.model, ## 모델 불러오기
                                       model_dir = DEFINES.check_point_path,
                                       params = {
                                           'hidden_size': DEFINES.hidden_size,
                                           'layer_size': DEFINES.layer_size,
                                           'learning_rate': DEFINES.learning_rate,
                                           'vocabulary_length': vocabulary_length,
                                           'embedding_size': DEFINES.embeddding_size,
                                           'embedding': DEFINES.embedding,
                                           'multilayer': DEFINES.multilayer,
                                       })
    
    
    # Estimator로 학습 진행
    ## 필요 인자: 입력 함수, 스텝 
    classifier.train(input_fn = lambda: data.train_input_fn(
    train_input_enc, train_input_dec, train_target_dec, DEFINES.batch_size),
                    steps = DEFINES.train_steps)
    
    
    ## 검증 함수 정의
    eval_result = classifier.evaluate(input_fn = lambda: data.eval_input_fn(
    eval_input_enc, eval_input_dec, eval_target_dec, DEFINES.batch_size))
    
    ## 바로 성능 확인이 가능하도록 정확도 출력 함수 작성
    print('\nEVAL set accuracy: {accuracy:0.3f}\n'.format(**eval_result))
    
    
    # 결과 예측하기
    
    predic_input_enc, predic_input_enc_length = data.enc_processing(["Education is important"],
                                                                   word2idx)
    predic_input_dec, predic_input_dec_length = data.dec_input_processing([""], word2idx)
    predic_target_dec = data.dec_target_processing([""], word2idx)
    
    predictions = classifier.predict(
        input_fn = lambda: data.eval_input_fn(predic_input_enc, predic_input_dec,
                                             predic_target_dec, DEFINES.batch_size))
    
    data.pred2string(predictions, idx2word)
Ejemplo n.º 7
0
def input_data(chat):
    tf.logging.set_verbosity(tf.logging.ERROR)
    arg_length = len(chat)

    if (arg_length < 2):
        raise Exception("Don't call us. We'll call you")

    # 데이터를 통한 사전 구성 한다.
    char2idx, idx2char, vocabulary_length = data.load_vocabulary()
    # 테스트용 데이터 만드는 부분이다.
    # 인코딩 부분 만든다.
    input = ""
    for i in chat[1:]:
        input += i
        input += " "

    predic_input_enc, predic_input_enc_length = data.enc_processing([input],
                                                                    char2idx)
    # 학습 과정이 아니므로 디코딩 입력은
    # 존재하지 않는다.(구조를 맞추기 위해 넣는다.)
    # 학습 과정이 아니므로 디코딩 출력 부분도
    # 존재하지 않는다.(구조를 맞추기 위해 넣는다.)
    predic_target_dec, _ = data.dec_target_processing([""], char2idx)

    if DEFINES.serving == True:
        # 모델이 저장된 위치를 넣어 준다.  export_dir
        predictor_fn = tf.contrib.predictor.from_saved_model(
            export_dir="./data_out/model/1541575161")
    else:
        # 에스티메이터 구성한다.
        classifier = tf.estimator.Estimator(
            model_fn=ml.Model,  # 모델 등록한다.
            model_dir=DEFINES.check_point_path,  # 체크포인트 위치 등록한다.
            params={  # 모델 쪽으로 파라메터 전달한다.
                'hidden_size': DEFINES.hidden_size,  # 가중치 크기 설정한다.
                'layer_size': DEFINES.layer_size,  # 멀티 레이어 층 개수를 설정한다.
                'learning_rate': DEFINES.learning_rate,  # 학습율 설정한다.
                'teacher_forcing_rate':
                DEFINES.teacher_forcing_rate,  # 학습시 디코더 인풋 정답 지원율 설정
                'vocabulary_length': vocabulary_length,  # 딕셔너리 크기를 설정한다.
                'embedding_size': DEFINES.embedding_size,  # 임베딩 크기를 설정한다.
                'embedding': DEFINES.embedding,  # 임베딩 사용 유무를 설정한다.
                'multilayer': DEFINES.multilayer,  # 멀티 레이어 사용 유무를 설정한다.
                'attention': DEFINES.attention,  #  어텐션 지원 유무를 설정한다.
                'teacher_forcing':
                DEFINES.teacher_forcing,  # 학습시 디코더 인풋 정답 지원 유무 설정한다.
                'loss_mask': DEFINES.loss_mask,  # PAD에 대한 마스크를 통한 loss를 제한 한다.
                'serving': DEFINES.serving  # 모델 저장 및 serving 유무를 설정한다.
            })

    if DEFINES.serving == True:
        predictions = predictor_fn({
            'input': predic_input_enc,
            'output': predic_target_dec
        })
        answer = data.pred2string(predictions, idx2char)
    else:
        # 예측을 하는 부분이다.
        predictions = classifier.predict(input_fn=lambda: data.eval_input_fn(
            predic_input_enc, predic_target_dec, DEFINES.batch_size))
        # 예측한 값을 인지 할 수 있도록
        # 텍스트로 변경하는 부분이다.
        answer = data.pred2string(predictions, idx2char)
    return answer
Ejemplo n.º 8
0
def main(self):
    data_out_path = os.path.join(os.getcwd(), DATA_OUT_PATH)
    os.makedirs(data_out_path, exist_ok=True)
    # 데이터를 통한 사전 구성 한다.
    char2idx, idx2char, vocabulary_length = data.load_vocabulary()
    # 훈련 데이터와 테스트 데이터를 가져온다.
    train_input, train_label, eval_input, eval_label = data.load_data()

    # 훈련셋 인코딩 만드는 부분이다.
    train_input_enc, train_input_enc_length = data.enc_processing(
        train_input, char2idx)
    # 훈련셋 디코딩 출력 부분 만드는 부분이다.
    train_target_dec, train_target_dec_length = data.dec_target_processing(
        train_label, char2idx)

    # 평가셋 인코딩 만드는 부분이다.
    eval_input_enc, eval_input_enc_length = data.enc_processing(
        eval_input, char2idx)
    # 평가셋 디코딩 출력 부분 만드는 부분이다.
    eval_target_dec, _ = data.dec_target_processing(eval_label, char2idx)

    # 현재 경로'./'에 현재 경로 하부에
    # 체크 포인트를 저장한 디렉토리를 설정한다.
    check_point_path = os.path.join(os.getcwd(), DEFINES.check_point_path)
    save_model_path = os.path.join(os.getcwd(), DEFINES.save_model_path)
    # 디렉토리를 만드는 함수이며 두번째 인자 exist_ok가
    # True이면 디렉토리가 이미 존재해도 OSError가
    # 발생하지 않는다.
    # exist_ok가 False이면 이미 존재하면
    # OSError가 발생한다.
    os.makedirs(check_point_path, exist_ok=True)
    os.makedirs(save_model_path, exist_ok=True)

    # 에스티메이터 구성한다.
    classifier = tf.estimator.Estimator(
        model_fn=ml.Model,  # 모델 등록한다.
        model_dir=DEFINES.check_point_path,  # 체크포인트 위치 등록한다.
        params={  # 모델 쪽으로 파라메터 전달한다.
            'hidden_size': DEFINES.hidden_size,  # 가중치 크기 설정한다.
            'layer_size': DEFINES.layer_size,  # 멀티 레이어 층 개수를 설정한다.
            'learning_rate': DEFINES.learning_rate,  # 학습율 설정한다.
            'teacher_forcing_rate':
            DEFINES.teacher_forcing_rate,  # 학습시 디코더 인풋 정답 지원율 설정
            'vocabulary_length': vocabulary_length,  # 딕셔너리 크기를 설정한다.
            'embedding_size': DEFINES.embedding_size,  # 임베딩 크기를 설정한다.
            'embedding': DEFINES.embedding,  # 임베딩 사용 유무를 설정한다.
            'multilayer': DEFINES.multilayer,  # 멀티 레이어 사용 유무를 설정한다.
            'attention': DEFINES.attention,  #  어텐션 지원 유무를 설정한다.
            'teacher_forcing':
            DEFINES.teacher_forcing,  # 학습시 디코더 인풋 정답 지원 유무 설정한다.
            'loss_mask': DEFINES.loss_mask,  # PAD에 대한 마스크를 통한 loss를 제한 한다.
            'serving': DEFINES.serving  # 모델 저장 및 serving 유무를 설정한다.
        })

    # 학습 실행
    classifier.train(input_fn=lambda: data.train_input_fn(
        train_input_enc, train_target_dec_length, train_target_dec, DEFINES.
        batch_size),
                     steps=DEFINES.train_steps)
    # 서빙 기능 유무에 따라 모델을 Save 한다.
    if DEFINES.serving == True:
        save_model_path = classifier.export_savedmodel(
            export_dir_base=DEFINES.save_model_path,
            serving_input_receiver_fn=serving_input_receiver_fn)

    # 평가 실행
    eval_result = classifier.evaluate(input_fn=lambda: data.eval_input_fn(
        eval_input_enc, eval_target_dec, DEFINES.batch_size))
    print('\nEVAL set accuracy: {accuracy:0.3f}\n'.format(**eval_result))

    predic_input_enc, predic_input_enc_length = data.enc_processing(["가끔 궁금해"],
                                                                    char2idx)
    # 학습 과정이 아니므로 디코딩 입력은
    # 존재하지 않는다.(구조를 맞추기 위해 넣는다.)
    # 학습 과정이 아니므로 디코딩 출력 부분도
    # 존재하지 않는다.(구조를 맞추기 위해 넣는다.)
    predic_target_dec, _ = data.dec_target_processing([""], char2idx)

    # 예측을 하는 부분이다.
    predictions = classifier.predict(input_fn=lambda: data.eval_input_fn(
        predic_input_enc, predic_target_dec, DEFINES.batch_size))
    # 예측한 값을 인지 할 수 있도록
    # 텍스트로 변경하는 부분이다.
    answer = data.pred2string(predictions, idx2char)

    print("Bleu score: ", bleu_compute("그 사람도 그럴 거예요.", answer))
    print("Rouge score: ", rouge_compute("그 사람도 그럴 거예요.", answer))
Ejemplo n.º 9
0
def main():
    """Run the bot."""
    global update_id

    # Telegram Bot Authorization Token
    bot = telegram.Bot('auth')
    URL = "https://unopenedbox.com/develop/square/api.php"
    last_message = ""
    bootcount = 0
    lcount = 0
    readingold = False
    readingold_lastcount = 0
    now = datetime.datetime.now()
    # get the first pending update_id, this is so we can skip over it in case
    # we get an "Unauthorized" exception.

    # 데이터를 통한 사전 구성 한다.
    char2idx, idx2char, vocabulary_length = data.load_vocabulary()

    # 에스티메이터 구성한다.
    classifier = tf.estimator.Estimator(
        model_fn=ml.Model,  # 모델 등록한다.
        model_dir=DEFINES.check_point_path,  # 체크포인트 위치 등록한다.
        params={  # 모델 쪽으로 파라메터 전달한다.
            'hidden_size': DEFINES.hidden_size,  # 가중치 크기 설정한다.
            'layer_size': DEFINES.layer_size,  # 멀티 레이어 층 개수를 설정한다.
            'learning_rate': DEFINES.learning_rate,  # 학습율 설정한다.
            'teacher_forcing_rate':
            DEFINES.teacher_forcing_rate,  # 학습시 디코더 인풋 정답 지원율 설정
            'vocabulary_length': vocabulary_length,  # 딕셔너리 크기를 설정한다.
            'embedding_size': DEFINES.embedding_size,  # 임베딩 크기를 설정한다.
            'embedding': DEFINES.embedding,  # 임베딩 사용 유무를 설정한다.
            'multilayer': DEFINES.multilayer,  # 멀티 레이어 사용 유무를 설정한다.
            'attention': DEFINES.attention,  #  어텐션 지원 유무를 설정한다.
            'teacher_forcing':
            DEFINES.teacher_forcing,  # 학습시 디코더 인풋 정답 지원 유무 설정한다.
            'loss_mask': DEFINES.loss_mask,  # PAD에 대한 마스크를 통한 loss를 제한 한다.
            'serving': DEFINES.serving  # 모델 저장 및 serving 유무를 설정한다.
        })

    while 1:
        sleep(3)
        now = datetime.datetime.now()
        bootcount = bootcount + 1
        lcount = lcount + 1

        try:
            #data = {'a': 'penta_check', 'auth': 'a1s2d3f4g5h6j7k8l9', 'start_num' : '0', 'number' : '15'}
            #res = requests.post(URL, data=data)
            #answer = "[보고]" + res.json()[0]['description'];
            answer = ""

            if bootcount == 1:
                #answer = "다시 시작했습니다. Penta 버전 1.0.625 밀린 채팅을 읽는 중 입니다..."
                readingold = True
                readingold_lastcount = bootcount
            if readingold_lastcount < bootcount and readingold is True:
                readingold = False
                #bot.send_message(chat_id = -116418298, text="이전글 읽기 완료.")
            if last_message != answer and answer != "":
                bot.send_message(chat_id=-116418298, text=answer)
                last_message = answer
            if last_message == answer:
                tlm = ""
                last_user = 0
                last_talk = ""
                updates = bot.get_updates(offset=update_id)
                for i in updates:
                    if i.message:
                        if last_user != i.message.from_user.id:
                            last_talk = tlm
                            tlm = ""
                            last_user = i.message.from_user.id
                            # with open("./data_in/ChatBotData.csv", "a") as myfile:
                            #   myfile.write("\n")

                        if i.message.text is not None and tlm != "":
                            tlm = tlm + " " + i.message.text
                        # with open("./data_in/ChatBotData.csv", "a") as myfile:
                        #    myfile.write(" " + i.message.text)
                        if i.message.text is not None and tlm == "":
                            tlm = i.message.text
                            # with open("./data_in/ChatBotData.csv", "a") as myfile:
                            #  myfile.write(i.message.text)
                        update_id = i.update_id + 1
                        now_last_id = updates[-1].update_id

                        if tlm != "" and tlm is not None and now_last_id + 1 <= update_id:
                            readingold_lastcount = readingold_lastcount + 1
                            lcount = 0
                            if not readingold:

                                predic_input_enc, predic_input_enc_length = data.enc_processing(
                                    [tlm], char2idx)
                                predic_target_dec, _ = data.dec_target_processing(
                                    [""], char2idx)
                                # 예측을 하는 부분이다.
                                predictions = classifier.predict(
                                    input_fn=lambda: data.eval_input_fn(
                                        predic_input_enc, predic_target_dec,
                                        DEFINES.batch_size))
                                # 예측한 값을 인지 할 수 있도록
                                # 텍스트로 변경하는 부분이다.

                                aimessage = data.pred2string(
                                    predictions, idx2char)
                                if aimessage != "":
                                    bot.send_message(chat_id=-116418298,
                                                     text=aimessage)
        except IndexError:
            update_id = None
        except:
            if last_message != traceback.format_exc(
            ) and "Message text is empty" not in traceback.format_exc():

                bot.send_message(chat_id=-11641828,
                                 text="[오류] 오류가 발생했습니다. 점검이 필요합니다. \n" +
                                 traceback.format_exc())
                last_message = traceback.format_exc()

        logging.basicConfig(
            format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
Ejemplo n.º 10
0
def predict(sentence):

    tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR)
    arg_length = len(sys.argv)

    # if (arg_length < 2):
    #     raise Exception("문장을 입력해주세요")

    # 데이터를 통한 사전 구성 한다.
    char2idx, idx2char, vocabulary_length = data.load_vocabulary()

    # 테스트용 데이터 만드는 부분이다.
    # 테스트로 넣은 문장이 들어온다 인코딩 부분 만든다.
    # input = ""
    # for i in sys.argv[1:]:
    #     input += i
    #     input += " "

    print('question:' + sentence)

    predic_input_enc, predic_input_enc_length = data.enc_processing([sentence],
                                                                    char2idx)
    # 학습 과정이 아니므로 디코딩 입력은
    # 존재하지 않는다.(구조를 맞추기 위해 넣는다.)
    # predic_output_dec = data.dec_input_processing([""], char2idx)
    # 학습 과정이 아니므로 디코딩 출력 부분도
    # 존재하지 않는다.(구조를 맞추기 위해 넣는다.)
    predic_target_dec, _ = data.dec_target_processing([""], char2idx)

    # 에스티메이터 구성한다.
    # 에스티메이터 구성한다.
    classifier = tf.estimator.Estimator(
        model_fn=ml.Model,  # 모델 등록한다.
        model_dir=DEFINES.check_point_path,  # 체크포인트 위치 등록한다.
        params={  # 모델 쪽으로 파라메터 전달한다.
            'hidden_size': DEFINES.hidden_size,  # 가중치 크기 설정한다.
            'layer_size': DEFINES.layer_size,  # 멀티 레이어 층 개수를 설정한다.
            'learning_rate': DEFINES.learning_rate,  # 학습율 설정한다.
            'teacher_forcing_rate':
            DEFINES.teacher_forcing_rate,  # 학습시 디코더 인풋 정답 지원율 설정
            'vocabulary_length': vocabulary_length,  # 딕셔너리 크기를 설정한다.
            'embedding_size': DEFINES.embedding_size,  # 임베딩 크기를 설정한다.
            'embedding': DEFINES.embedding,  # 임베딩 사용 유무를 설정한다.
            'multilayer': DEFINES.multilayer,  # 멀티 레이어 사용 유무를 설정한다.
            'attention': DEFINES.attention,  #  어텐션 지원 유무를 설정한다.
            'teacher_forcing':
            DEFINES.teacher_forcing,  # 학습시 디코더 인풋 정답 지원 유무 설정한다.
            'loss_mask': DEFINES.loss_mask,  # PAD에 대한 마스크를 통한 loss를 제한 한다.
            'serving': DEFINES.serving  # 모델 저장 및 serving 유무를 설정한다.
        })

    # 예측을 하는 부분
    predictions = classifier.predict(input_fn=lambda: data.eval_input_fn(
        predic_input_enc, predic_target_dec, DEFINES.batch_size))
    # 예측한 값을 인지 할 수 있도록
    # 텍스트로 변경하는 부분이다.
    answer = data.pred2string(predictions, idx2char)

    # 예측한 값을 인지 할 수 있도록
    # 텍스트로 변경하는 부분이다.
    print("answer: ", answer)

    return answer