Colab으로 하루에 하나씩 딥러닝

자연어 전처리_3.임베딩_5) 한국어 임베딩 본문

딥러닝_개념

자연어 전처리_3.임베딩_5) 한국어 임베딩

Elleik 2022. 12. 16. 23:06
728x90

한국어 임베딩

  • 한국어도 영어와 동일하게 임베딩을 진행

한국어 임베딩 진행 코드

### 예제를 진행할 텍스트 생성

import numpy as np
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences

text = """과일 가게에 사과가 많이 진열되어 있다
그녀가 나에세 사과한 후, 우리는 친해졌다
애플은 사과 모양을 로고로 사용한다\n"""
### 텍스트 토큰화

tok = Tokenizer() # Tokenizer 객체 생성
tok.fit_on_texts([text])

vocSize = len(tok.word_index) + 1

seqs = list()
for word in text.split("\n"):
  encoded = tok.texts_to_sequences([word])[0] # 텍스트를 숫자로 변환
  for i in range(1, len(encoded)):
    seq = encoded[:i+1]
    seqs.append(seq)

maxLen = max(len(i) for i in seqs)

seqs = pad_sequences(seqs, maxlen=maxLen, padding="pre")  # 패딩을 이용하여 샘플 길이를 동일하게 지정
seqs

텍스트 토큰화 출력 결과

### x 값에 대한 정의

seqs = np.array(seqs) # seqs를 배열로 변환한 후 seqs에 저장
x = seqs[:,:-1] # 마지막 열을 제외한 모든 행과 열을 가져옴
### y값에 대한 정의

from tensorflow.keras.utils import to_categorical
y = seqs[:,-1]  # 모든 행과 마지막 열만 취함(-1은 마지막 열을 의미)
y = to_categorical(y, num_classes=vocSize)  # 케라스에서 제공하는 to_categorical()을 사용하여 원-핫 인코딩 적용
### 모델 생성 및 훈련

from tensorflow.keras.layers import LSTM 
from tensorflow.keras.models import Sequential, Model
from tensorflow.keras.layers import Flatten, Dense
from tensorflow.keras.layers import Embedding

model = Sequential()  # 모델 생성
model.add(Embedding(vocSize, 10, input_length=maxLen-1,))
model.add(LSTM(32))
model.add(Dense(vocSize, activation="softmax")) # 각 단어의 임베딩 백터가 10차원
model.compile(loss="categorical_crossentropy", metrics=["accuracy"], optimizer="adam")
model.fit(x, y, epochs=200)

정확도는 100%이고 loss는 epoch마다 줄어들고 있음

### 단어 예측

def sentGen(model, tok, word, n): # 모델, 토크나이저, 입력 단어, 예측 단어 개수를 파라미터로 사용
  sent = ""
  word2 = word
  for _ in range(n):  # 2회 반복
    encoded = tok.texts_to_sequences([word])[0]
    encoded = pad_sequences([encoded], maxlen=7, padding="pre")
    res = (model.predict(x) > 0.5).astype('int32')

    for w, i in tok.word_index.items():
      if i == res.all():  # 예측 단어와 인덱스 단어가 동일한 경우 if문 수행
        break
    word = word + " " + w
    sent = sent + " " + w
  sent = word2 + sent
  return sent
### '과일' 이후의 예측 단어

print(sentGen(model, tok, "과일", 10)) # '과일' 뒤에 등장하는 단어 열개를 예측

'과일' 이후에 동일한 '과일'이 등장함(※ 네트워크가 랜덤으로 초기화 되기 때문에 해당 값과 동일하지 않을 수 있음)

참고: 출처: 서지영, 『딥러닝 텐서플로 교과서』, 길벗(2022)