본문 바로가기
AI/MachineLearning

[NLP] 임베딩(Embedding)

by TSpoons 2025. 2. 27.

원-핫 인코딩 방식에서발전된 방법으로 단어의 의미를 수치적으로 표현하여 컴퓨터가 이해하게 만드는 기법이다.

 

 

 

비교하여 설명하면

원-핫 인코딩은 '강아지'를 [0, 1, 0, 0, ...]처럼 0과 1로만 표현하지만,
임베딩은 '강아지'를 [0.1, -0.2, 0.3, ...]처럼 의미를 담은 숫자로 바꾼다.

 

이 숫자들은 단어의 느낌(귀여움, 털, 짓기 등)을 반영된 리스트(벡터)이다.

 

룩업 테이블(Lookup Table)

  • 파이썬 딕셔너리 같이 key-value를 연결하는 것처럼
  • 단어-단어의 특성을 연결해준다.

embedding_layer = model.layers[0]  # 첫 번째 레이어 (Embedding)
embedding_weights = embedding_layer.get_weights()[0]  # 룩업 테이블 가져오기
print("임베딩 룩업 테이블 크기:", embedding_weights.shape)  # (vocab_size, embedding_dim)
print(embedding_weights[:5])  # 첫 5개 단어의 임베딩 벡터 출력

 

문장의 긍정 부정 판단 모델 만들기

https://www.kaggle.com/datasets/shariphthapa/sarcasm-json-datasets

 

캐글에 있는 데이터셋인 Sarcasm을 바탕으로 기사의 헤드라인이 긍정인지 부정인지를 판별하는 모델을 설계하고자 한다.

어떤 문장을 입력으로 받으면, 긍정인지 부정인지 판별하는 모델

 

import numpy as np
import json

import tensorflow as tf
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.models import Sequential

샘플 데이터 준비(input)

sentences = [
    "I love machine learning",
    "Deep learning is fun",
    "Natural language processing rocks",
    "AI is fuxking the future"
]
labels = [1, 1, 1, 0]  # 긍정(1) / 부정(0) 레이블 예시

토큰화 및 패딩

  • 토큰화로 단어 사전을 만든다고 생각하면 된다.
# 2. 토큰화 및 패딩
vocab_size = 10000  # 사용할 최대 단어 수
max_length = 5    # 문장의 최대 길이
oov_tok = "<OOV>" # 없는 단어에 대한 토큰

# 토큰화
tokenizer = Tokenizer(num_words=vocab_size, oov_token=oov_tok)
tokenizer.fit_on_texts(sentences)
word_index = tokenizer.word_index

# 텍스트를 시퀀스로 변환
sequences = tokenizer.texts_to_sequences(sentences)

# 패딩 처리 (문장 길이 맞추기)
padded_sequences = pad_sequences(sequences, maxlen=max_length, padding='post', truncating='post')

training_padded = np.array(padded_sequences)
training_labels = np.array(labels)

임베딩 층 설계

  • Embedding layer : 5(max_length)개의 단어를 16(embedding_dim)개의 숫자로 표현
  • Flatten layer : (5,16) 배열을 (180,)으로 바꿔준다.
  • Dense layer : 80개의 입력을 가중치와 연산한 후 24개로 분류하고, 음수는 0으로
  • Dense layer 2 : 최종 답을 내놓고, 확률적으로 나타낸다.
    # 4. 임베딩을 포함한 모델 생성
    embedding_dim = 16  # 임베딩 벡터의 차원
    
    model = tf.keras.Sequential([
    tf.keras.layers.Embedding(vocab_size, embedding_dim, input_length=max_length), # 임베딩 레이어
    tf.keras.layers.Flatten(), # 임베딩 결과를 1D로 펼치기
    tf.keras.layers.Dense(24, activation='relu'), # 중간 레이어
    tf.keras.layers.Dense(1, activation='sigmoid') # 출력 레이어 (이진 분류)
    ])

 

학습 

- adam 최적화

- 이진 분류

- 정확도

- 데이터 셋 학습

model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.summary()

model.fit(training_padded, training_labels, epochs=10, verbose=1)

 

 

 

테스트

음.. Sarcasm json dataset 학습 시켰더니 비꼬는 문장으로 판단했다.

test_sentence = ["Machine learning is so great"]
test_seq = tokenizer.texts_to_sequences(test_sentence)
test_padded = pad_sequences(test_seq, maxlen=max_length, padding='post')
prediction = model.predict(test_padded)
print("예측 결과:", "긍정" if prediction[0] > 0.5 else "부정")

 

언어는 예측하기가 굉장히 어렵기 때문에 과대적합 현상이 흔하게 일어나게 된다.

그래서 과대적합 현상을 줄이기 위한 노력을 더 기울인다.

 

 

Sarcasm dataset Embedding 

 

 

 

참고

https://www.youtube.com/watch?v=my5wFNQpFO0&ab_channel=GoogleforDevelopers

https://arxiv.org/abs/1103.0398

https://medium.com/@b.terryjack/nlp-everything-about-word-embeddings-9ea21f51ccfe

https://projector.tensorflow.org/

 

'AI > MachineLearning' 카테고리의 다른 글

[ML] DCASE2023 : Mean-teacher CRNN.py  (0) 2025.03.23