자연어처리 개념
- 구글, 애플 siri 등이 자연어처리에 해당
- 전처리 과정
- 단어의 토큰화
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense,Flatten,Embedding
from tensorflow.keras.utils import to_categorical
from numpy import array
# 케라스의 텍스트 전처리와 관련한 함수 중 text_to_word_sequence 함수를 불러오기
from tensorflow.keras.preprocessing.text import text_to_word_sequence
# 전처리할 텍스트를 정하기
text = '해보지 않으면 해낼 수 없다'
# 해당 텍스트를 토큰화
result = text_to_word_sequence(text) # 문장을 구분해주는 함수
print("\n원문:\n", text)
print("\n토큰화:\n", result)
# 단어 빈도수 세기 -> 중요도를 알 수 있음
# 전처리하려는 세 개의 문장을 정하기
docs = ['먼저 텍스트의 각 단어를 나누어 토큰화합니다.',
'텍스트의 단어로 토큰화해야 딥러닝에서 인식됩니다.',
'토큰화한 결과는 딥러닝에서 사용할 수 있습니다.',
]
# 토큰화 함수를 이용해 전처리 하는 과정
token = Tokenizer() # 토큰화 함수 지정
token.fit_on_texts(docs) # 토큰화 함수에 문장 적용
# 단어의 빈도수를 계산한 결과를 각 옵션에 맞추어 출력
# Tokenizer()의 word_counts 함수는 순서를 기억하는 OrderedDict 클래스를 사용
print("\n단어 카운트:\n", token.word_counts)
# 출력되는 순서는 랜덤
print("\n문장 카운트: ", token.document_count)
print("\n각 단어가 몇 개의 문장에 포함되어 있는가:\n", token.word_docs)
print("\n각 단어에 매겨진 인덱스 값:\n", token.word_index)
2. 단어의 원-핫 인코
# 단어의 원-핫 인코딩
text="오랫동안 꿈꾸는 이는 그 꿈을 닮아간다"
token = Tokenizer()
token.fit_on_texts([text])
print(token.word_index)
x=token.texts_to_sequences([text])
print(x)
# 인덱스 수에 하나를 추가해서 원-핫 인코딩 배열 만들기
word_size = len(token.word_index) + 1
x = to_categorical(x, num_classes=word_size)
print(x)
3. 텍스트를 읽고 긍정, 부정 예측하기
# 텍스트 리뷰 자료를 지정합니다.
docs = ["너무 재밌네요","최고예요","참 잘 만든 영화예요","추천하고 싶은 영화입니다","한번 더 보고싶네요","글쎄요","별로예요","생각보다 지루하네요","연기가 어색해요","재미없어요"]
# 긍정 리뷰는 1, 부정 리뷰는 0으로 클래스를 지정합니다.
classes = array([1,1,1,1,1,0,0,0,0,0])
# 토큰화
token = Tokenizer() # 토큰화해서 index화하기
token.fit_on_texts(docs)
print(token.word_index)
x = token.texts_to_sequences(docs)
print("\n리뷰 텍스트, 토큰화 결과:\n", x)
# 패딩, 서로 다른 길이의 데이터를 4로 맞추어 줍니다.
padded_x = pad_sequences(x, 4)
print("\n패딩 결과:\n", padded_x)
# 임베딩에 입력될 단어의 수를 지정합니다.
word_size = len(token.word_index) +1
# 단어 임베딩을 포함하여 딥러닝 모델을 만들고 결과를 출력합니다.
model = Sequential()
model.add(Embedding(word_size, 8, input_length=4))
model.add(Flatten()) # 1차원으로 변환
model.add(Dense(1, activation='sigmoid')) # 이진분류 (긍정 vs. 부정)
model.summary()
- Embedding
- 차원수 축소
- 단어간의 유사도를 미리 학습
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.fit(padded_x, classes, epochs=20) # padding채워준 값
print("\n Accuracy: %.4f" % (model.evaluate(padded_x, classes)[1]))
RNN(Reccurent Neural Network)
- 순환 신경망
- 시계열 데이터와 같은 연속적인 정보를 처리할 때 많이 사용되는 신경망
- 과거의 정보를 "기억"하면서 새로운 정보를 처리하는 것
- e.g. 주식가격, 문장의 내용 (시간적 순서를 바탕으로 처리)
- 현재 ChatGPT 의 시초인 transformer까지 발전하게 됨
RNN 처리방식
- 입력값을 하나씩 기억해서 다음으로 넘김 (비독립적)
- 신경망이 너무 길어서 앞의 것을 기억못하는 것을 방지하기 위한 알고리즘 = LSTM(Long Short Term Memory)
LSTM 처리방 - RNN의 역전파 = BPTT(BackPropagation Through Time)
- 시간을 통한 역전파
- 손실이 줄어드는 방향으로 연결 가중치를 변화시켜가는 과정
코드 실습
- 목적: Reuters 뉴스 데이터셋을 가져와 카테고리별 뉴스 분류하기
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM, Embedding
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.preprocessing import sequence
from tensorflow.keras.datasets import reuters # 로이터 뉴스 데이터셋 불러오기
from tensorflow.keras.callbacks import EarlyStopping
import numpy as np
import matplotlib.pyplot as plt
# 데이터를 불러와 학습셋, 테스트셋으로 나눔
(X_train, y_train), (X_test, y_test) = reuters.load_data(num_words=1000, test_split=0.2)
#너무 길면 1000개까지만 가져와라
# 데이터를 확인
category = np.max(y_train) + 1 # 몇 개의 category로 이뤄져있는지
print(category, '카테고리')
print(len(X_train), '학습용 뉴스 기사')
print(len(X_test), '테스트용 뉴스 기사')
print(X_train[0]) # 첫번째 train 기사를 출력
# 단어의 수를 맞추어 줌
X_train = sequence.pad_sequences(X_train, maxlen=100) # 100개 까지만 가져와라
X_test = sequence.pad_sequences(X_test, maxlen=100)
# 원-핫 인코딩 처리
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)
# 모델의 구조를 설정
model = Sequential()
model.add(Embedding(1000, 100)) # 입력받은 값을 1000개씩 받아서 100개를 보내라
model.add(LSTM(100, activation='tanh')) # 몇 개받는지/ 활성화함수 정해주기
model.add(Dense(46, activation='softmax')) # 46개의 category 중 다중분류
# 모델의 실행 옵션 정하기
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
# 학습의 조기 중단을 설정
early_stopping_callback = EarlyStopping(monitor='val_loss', patience=5)
# 모델을 실행
history = model.fit(X_train, y_train, batch_size=20, epochs=200, validation_data=(X_test, y_test), callbacks=[early_stopping_callback])
# 테스트 정확도를 출력
print("\n Test Accuracy: %.4f" % (model.evaluate(X_test, y_test)[1]))
# 학습셋과 테스트셋의 오차를 저장
y_vloss = history.history['val_loss']
y_loss = history.history['loss']
# 그래프로 표현
x_len = np.arange(len(y_loss))
plt.plot(x_len, y_vloss, marker='.', c="red", label='Testset_loss')
plt.plot(x_len, y_loss, marker='.', c="blue", label='Trainset_loss')
# 그래프에 그리드를 주고 레이블을 표시
plt.legend(loc='upper right')
plt.grid()
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()
'TIL(2024y) > Deep learning' 카테고리의 다른 글
24.07.30 CNN 3 (0) | 2024.07.30 |
---|---|
24.07.29 CNN 2 (0) | 2024.07.29 |
24.07.08 Auto encoder (0) | 2024.07.08 |
24.07.03 CNN (0) | 2024.07.06 |
24.07.01 Deep learning (구조 및 역할) (0) | 2024.07.01 |