[Deep Learning - NLP] Distributed Representation

2022. 5. 6. 23:28AI/Codestates

728x90
반응형

원핫 인코딩이란?

전체 단어의 크기만큼의 차원을 가지고 해당되는 단어 1 아니면 0 으로 표현하는 인코딩 방법

▶ 단점 

단어간의 유사성을 알 수 없음

임베딩 ( Embedding ) 이란?

길이가 고정된 연속적인 값을 갖는 벡터로 변환하는 것

▶ Word2Vec

→ CBoW 

주변단어에서 중심단어를 예측

→ Skip - gram  

중심단어에서 주변단어를 예측

  • 입력 : 원핫 인코딩 된 단어 벡터
  • 은닉층 : 임베딩 벡터의 차원 수 만큼 노드로 구성된 은닉층 1개
  • 출력층 : 활성화 함수, 소프트 맥스 함수 사용

→ 단어

OOV ( Out-Of-Vocabulary ) 문제 : 모르는 단어로 인해 문제를 푸는 것이 까다로워지는 상황

→ 임베딩한 단어 벡터의 특징

  • man-woman 관계와 king-queen의 관계 → 의미적 관계를 표현 할 수 있음
  • wallking-walked 관계와 swimming-swam의 관계 → 문법적, 구조적 관계 표현 가능

▶ Word2Vec 코드

import gensim.downloader as api
import numpy as np
import pandas as pd
import tensorflow as tf
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder

from keras.preprocessing import sequence
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Embedding, GlobalAveragePooling1D
from tensorflow.keras.preprocessing.text import Tokenizer

wv = api.load('word2vec-google-news-300')
tokenizer = Tokenizer(num_words = 1000)
tokenizer.fit_on_texts(X_train)

X_train_encoded = tokenizer.texts_to_sequences(X_train)
X_test_encoded = tokenizer.texts_to_sequences(X_test)

vocab_size = len(tokenizer.word_index) + 1
X_train = pad_sequences(X_encoded, maxlen=150, padding = 'post')

embedding_matrix = np.zeros((vocab_size, 300))
def get_vector(word):
    """
    해당 word가 word2vec에 있는 단어일 경우 임베딩 벡터를 반환
    """
    if word in wv:
        return wv[word]
    else:
        return None

for word, i in tokenizer.word_index.items():
    temp = get_vector(word)
    if temp is not None:
        embedding_matrix[i] = temp
model = Sequential([
                    Embedding(vocab_size, 300, weights = [embedding_matrix], input_length = 150, trainable = False),
                    GlobalAveragePooling1D(),
                    Dense(1, activation = 'sigmoid')
])

model.compile(loss = 'binary_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
model.fit(X_train, y_train, batch_size = 64, epochs = 10, validation_split = 0.2)
model.evaluate(X_test, y_test, verbose=2)

▶ 케라스 기본 임베딩 벡터

embedding_dim = 200

model2 = Sequential([
                     Embedding(vocab_size, embedding_dim, input_length = 150),
                     GlobalAveragePooling1D(),
                     Dense(1, activation = 'sigmoid')
])


model2.compile(loss = 'binary_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
model2.fit(X_train, y_train, batch_size = 64, epochs = 10, validation_split = 0.2)
model2.evaluate(X_test, y_test, verbose=2)

 

728x90
반응형