<jupyter_start><jupyter_text>0. Environment Setting<jupyter_code>import pandas as pd
import numpy as np
import time
import tensorflow as tf
import tensorflow.keras as keras
from keras.models import load_model
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
start_time = time.time()
# 학습완료된 모델, 전처리 완료된 데이터 다운로드
!wget --no-check-certificate 'https://docs.google.com/uc?export=download&id=1-8A3zjgyBi3vjlWi9DX61IFxunCihb3-' -O demo_model.h5
!wget --no-check-certificate 'https://docs.google.com/uc?export=download&id=1ApkVRmC0B2DgLjYQ3l1sbF6bx2GyBttY' -O demo_sentiment.xlsx
# Mecab 설치용 스크립트 (약 3분 걸림)
!set -x \
&& pip install konlpy \
&& curl -s https://raw.githubusercontent.com/konlpy/konlpy/master/scripts/mecab.sh | bash -x
# 잘 설치되었는지 테스트
from konlpy.tag import Mecab
m = Mecab()
m.pos('아버지가방에들어가신다.')<jupyter_output><empty_output><jupyter_text>1. Data loading<jupyter_code>MAX_LEN = 50
VOCAB_SIZE = 13648
# Tokenizer 인코딩을 위한 학습용 엑셀 파일읽어들이기 약 30초 걸림.
df1 = pd.read_excel('./demo_sentiment.xlsx', sheet_name='Train')
def tokenize(s):
  return ['/'.join(t) for t in m.pos(s)]

train_docs = [tokenize(row[1]['sentence']) for row in df1.iterrows()]
tokenizer = Tokenizer(num_words = VOCAB_SIZE)
tokenizer.fit_on_texts(train_docs)
# 학습을 완료한 모델을 불러오기
loaded_model = load_model('demo_model.h5')
end_time = time.time()
print("Elapsed time for ready :", time.strftime('%H:%M:%S', time.localtime(end_time - start_time)))<jupyter_output>Elapsed time for ready : 00:01:11<jupyter_text>2. Ready to test<jupyter_code># 이용자가 알아보기 쉽게 결과를 분석해서 출력해 주는 함수들.
def sentiment_predict(sentence, log=False):
  sentences = tokenize(sentence)
  encoded = tokenizer.texts_to_sequences([sentences])
  padded = pad_sequences(encoded, maxlen=MAX_LEN)
  score = loaded_model.predict(padded)
  if log:
    print('Predict score: ', score)
  return score

def print_sentiment(lst):
  sent = ['기쁨', '불안', '당황', '슬픔', '분노', '상처']
  return sent[np.argmax(lst)]
print_sentiment(sentiment_predict('니가 어떻게 나에게 이럴수가 있어?', True))
print_sentiment(sentiment_predict('아니, 니가 어떻게 나에게 이럴수가 있어?', True))
print_sentiment(sentiment_predict('감히 니가 어떻게 나에게 이럴수가 있어?', True))
print_sentiment(sentiment_predict('그래, 너 참 잘났다.', True))
print_sentiment(sentiment_predict('너 참 잘났다.', True))
print_sentiment(sentiment_predict('잘들논다.', True))
print_sentiment(sentiment_predict('아이고, 잘들논다.', True))
print_sentiment(sentiment_predict('방금 저녁을 먹었는데 왜 또 배가고프지?', True))
print_sentiment(sentiment_predict('오늘 저녁에 내가 좋아하는 친구의 생일파티에 초대받았어', True))
print_sentiment(sentiment_predict('이번 여름은 코로나 때문에 여행을 가지 못했어.', True))
print_sentiment(sentiment_predict('다음 주에 개학인데, 나는 아직 방학숙제를 다 못했어.', True))
# 자유롭게 문장을 입력해보자.
messages = ['어제 한국과 일본이 배구경기를 했는데, 한국이 이겼어.',
            '어제 한국과 일본이 배구경기를 했는데, 한국이 이겼어. 그런데 나는 일본사람이야.',
            '어제 한국과 일본이 배구경기를 했는데, 한국이 이겼어. 그런데 나는 한국사람이야.',
            '어제 한국과 일본이 배구경기를 했는데, 한국이 이겼어. 그런데 나는 중국사람이야.',
            '하루종일 아무것도 먹지 않았더니 몸에 힘이 없어.',
            '신규확진 1823명, 열흘만에 다시 1800명 역대 세 번째 큰 규모',
            '오늘 날씨가 너무 더워서 공부하기 힘들어',
            '니가 어떻게 나에게 이럴 수가 있어?',
            '오늘 낮에 내가 황당한 스팸 문자를 받았어',
            '아니 왜 가만히 있는 우리를 괴롭히는거야?',
            '약속시간에 늦었어, 어떡하지?',
            # 아주 짧은 문장은 어떻게 될지
            '이게 되네?',
            # 엄청 긴 문장은 과연...
            '지난 7월 소비자물가 상승률이 연중 최고치인 2.6%인 것으로 확인되면서 하반기부터는 물가가 2% 이내로 안정화될 것이라는 정부 전망은 빗나갔다. 한은이 제시한 물가안정목표치(2.0%)도 훌쩍 넘길 가능성이 커지고 있다. 물가 불안이 확대되자 정부는 ‘물가 잡기’ 총력전을 펼치는 상황이다. 작황 부진과 폭염으로 인한 폐사 등으로 서민 체감이 큰 밥상 물가가 크게 오르고, 부동산 정책 실패로 집세는 천정부지인데다 수요회복으로 서비스 가격이 뛰는 등 “안오르는게 없는” 상황에 민심 역시 악화되고 있기 때문이다. 특히 지난 5월 조류독감(AI)가 종식됐는데도 가격이 내리지 않는 계란을 놓고는, 문재인 대통령이 직접 “달걀은 필수 먹거리인 만큼 소비자들에게도 피해가 갈 수 있으니 생산단계, 유통단계, 판매단계를 점검하라”고 부처들에 주문하기도 했다. 계란값 잡기에는 물가 총괄 부처인 기재부와 함께 농림부가 나섰고, 여기에 공정거래위원회까지 담합 가능성을 살펴보겠다며 가담한 상태다.'
]

for msg in messages:
  res = sentiment_predict(msg, True)
  print('입력문장: ', msg)
  print('감정상태: ', print_sentiment(res), '\n')<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.1180015064022094, 'fraction_numerical': 0.013557619884509164, 'mean_word_length': 4.023959646910466, 'pattern_counts': {'":': 0, '<': 12, '<?xml version=': 0, '>': 12, 'https://': 3, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '3', 'dir': 'jupyter-structured-clean-dedup', 'id': '667652', 'license': 'MIT', 'n_tokens_mistral': 2432, 'n_tokens_neox': 2955, 'n_words': 457, 'path': 'Demo of LSTM_Sentiment_Classification_KOR.ipynb', 'repo_name': 'yool-seoul/sentiment_analysis_lstm', 'size': '3983'}