<jupyter_start><jupyter_text>네이버영화 리뷰 데이터 curl : 리눅스 명령어, 파일을 다운로드할 때 사용.<jupyter_code>!curl -O https://raw.githubusercontent.com/e9t/nsmc/master/ratings_test.txt
!curl -O https://raw.githubusercontent.com/e9t/nsmc/master/ratings_train.txt
import pandas as pd
train_data = pd.read_table('./ratings_train.txt')
train_data.info()
train_data.head(3)
train_data.dropna(inplace=True)   # null 데이터를 없앤다. 
train_data.info()
  train_data['label'].value_counts()  # label을 기준으로 어떤 값이 분포되어 있는지 보자. 데이터가 한쪽으로 쏠려 있으면 큰 쪽으로 맞춰줘야 한다. 언더 또는 오버로 맞춰줘야 한다. 과대표집이 더 좋다.<jupyter_output><empty_output><jupyter_text>x데이터와 y데이타로 나눠준다.<jupyter_code>!python -m pip install konlpy
import konlpy
stopwords = ['의','가','이','은','들','는','좀','잘','걍','과','도','를','으로','자','에','와','한','하다']
okt = konlpy.tag.Okt()     # Okt() : 분류기
okt.morphs('와 이런 것도 영화라고 차라리 뮤직비디오를 만드는 게 나을 뻔', stem=True)
train_data_small = train_data[0:300]
Y_train = train_data['label'][0:300]
Y_train
x_train = list()
okt = konlpy.tag.Okt()
for sentence in train_data_small['document']:
  temp_x = okt.morphs(sentence, stem=True)                     # Okt.morphs() : 토큰화를 하면서 어간 추출하는 기능까지 한꺼번에 한다. 불용어 제거 기능은 없다
  words = list()
  for tok in temp_x:
    if tok not in stopwords:                               # 불용어 처리를 임의로 넣어본다. stopwords에 추가하거나 삭제해도 된다. 
      words.append(tok)
  x_train.append(words)                                                        
x_train[3:5]<jupyter_output><empty_output><jupyter_text>사전 만들기<jupyter_code>import tensorflow as tf
tokenizer = tf.keras.preprocessing.text.Tokenizer()
tokenizer.fit_on_texts(x_train)
print(tokenizer.word_index)
len(tokenizer.word_index)<jupyter_output><empty_output><jupyter_text>사전 기반 숫자화<jupyter_code>X_train= tokenizer.texts_to_sequences(x_train)
print(X_train[3:5])<jupyter_output>[[523, 146, 524, 4, 188, 80, 6, 4, 44, 525], [526, 527, 38, 528, 15, 292, 2, 16, 529, 28, 530, 118, 531, 532, 293, 189, 118]]<jupyter_text>X_train를 pading하는데 참고하기 위해 그래프를 그려본다.<jupyter_code>len(X_train[0]), len(X_train[1])
hist = list()
for sent in X_train:
  # print(len(sent))
  hist.append(len(sent))
print(hist)
import matplotlib.pyplot as plt
plt.hist(hist)
X_train = tf.keras.preprocessing.sequence.pad_sequences(X_train, maxlen=50)
X_train[3:5]
X_train.shape, Y_train.shape
import numpy as np
np.unique(Y_train)
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Embedding(1572, 50)) # input layer

model.add(tf.keras.layers.LSTM(64, activation='tanh')) # hidden layer
model.add(tf.keras.layers.Dense(1, activation='sigmoid')) # output layer

model.compile(optimizer='adam', loss='binary crossentropy')
model.fit(X_train, Y_train)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.14752252252252251, 'fraction_numerical': 0.03641141141141141, 'mean_word_length': 4.706638115631692, 'pattern_counts': {'":': 0, '<': 20, '<?xml version=': 0, '>': 20, 'https://': 2, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 3, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '5', 'dir': 'jupyter-structured-clean-dedup', 'id': '137539', 'license': 'Apache-2.0', 'n_tokens_mistral': 1347, 'n_tokens_neox': 1415, 'n_words': 216, 'path': 'NaverSentimentAnalysis_LSTM.ipynb', 'repo_name': 'victoria2012/test_deeplearning', 'size': '2664'}