일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- COLAB
- 임베딩
- 입력층
- RNN
- 합성곱층
- KONLPY
- 클러스터링
- 순환 신경망
- 풀링층
- 딥러닝
- 생성모델
- 코딩테스트
- 카운트 벡터
- 출력층
- 망각 게이트
- 양방향 RNN
- 프로그래머스
- 합성곱 신경망
- 코랩
- 완전연결층
- 자연어 전처리
- 과적합
- 원-핫 인코딩
- 전이학습
- cnn
- 성능 최적화
- 시계열 분석
- 이미지 분류
- 텍스트 마이닝
- NLTK
Archives
- Today
- Total
Colab으로 하루에 하나씩 딥러닝
자연어 전처리_3.임베딩_5) 한국어 임베딩 본문
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)
### 단어 예측
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)
'딥러닝_개념' 카테고리의 다른 글
텍스트 마이닝_ 1. BOW 기반의 텍스트 마이닝_2)코사인 유사도 (0) | 2022.12.21 |
---|---|
텍스트 마이닝_ 1. BOW 기반의 텍스트 마이닝_1)카운트 기반/BOW의 문서 표현 (1) | 2022.12.19 |
자연어 전처리_3.임베딩_4) 횟수/예측 기반 임베딩 (1) | 2022.12.15 |
자연어 전처리_3.임베딩_3) 예측 기반 임베딩 (1) | 2022.12.14 |
자연어 전처리_3.임베딩_2) 횟수 기반 임베딩 (0) | 2022.12.13 |