본문 바로가기

DEVELOPMENT/TensorFlow

[TensorFlow] 워드 임베딩

텍스트 벡터화

 

기계 학습 모델은 벡터(숫자 배열)를 입력으로 사용한다. 텍스트로 작업할 때 가장 먼저 문자열을 숫자로 변환하는 벡터화 작업이 필요하다.

 

1. One-hot encodings

설명 단어를 이진 벡터로 표현하는 방법이다. 각 단어는 고유한 인덱스에 해당하는 위치에 1을 가지고, 나머지는 0으로 채워진 벡터로 변환된다. 
장점 단어의 존재 여부를 표현하는 간단하면서도 효과적이다.
단점 단어 간의 의미적 관계나 유사성을 반영하지 못하며 벡터의 차원이 매우 크고 희소한 문제가 있다.

 

2. 각 단어를 고유 번호로 인코딩

설명 각 단어에 고유한 정수 인덱스를 할당하여 단어를 숫자로 표현하는 방식이다.
장점 단어를 효과적으로 컴퓨터가 처리할 수 있는 형태로 반환할 수 있다.
단점 단어 간의 의미적 관꼐나 유사성을 반영하지 못한다.

 

3. Word embeddings(워드 임베딩)

설명 유사한 단어가 유사한 인코딩을 갖는 효율적이고 조밀한 표현을 사용하는 방법이다.
단어들 사이의 문맥이나 의미적 관계를 학습하며, 이를 통해 비슷한 의미의 단어들이 벡터 공간에서 가깝게 위치하도록 하여 표현하는 방법이다.
장점 의미적 유사성 표현 및 단어 간 관계 학습 가능하며, 문맥을 파악하여 단어 표현이 가능하다. 
저차원의 밀집 벡터로 표현되어 메모리 사용량 감소 및 학습 속도 향상할 수 있다.
단점 Out-of-vocabulary(OOV) 문제 발생 가능하며, 단어의 다의성 처리가 어렵다. 동음이의어나 유사한 단어 간 구별이 어렵다.

 

 

Word embeddings(워드 임베딩)

 

워드 임베딩이란 단어 간 유사도 및 중요도 파악을 위해 단어를 저차원의 실수 벡터로 맵핑하여 의미적으로 비슷한 단어를 가깝게 배치하는 자연어 처리 모델링 기술이다.

워드 임베딩은 여러 알고리즘과 방법론으로 생성될 수 있다. Word2Vec, GloVe, FastText 등은 대표적인 워드 임베딩 알고리즘이다. 이러한 알고리즘들은 대규모의 텍스트 데이터를 학습하여 단어의 의미와 문맥을 반영한 임베딩 벡터를 생성한다. 이렇게 생성된 임베딩은 다양한 자연어 처리 작업에 사용되며, 텍스트 분류, 문서 유사도 측정, 기계번역 등 다양한 응용 분야에서 활용된다.

 

 

워드 임베딩을 사용하여 텍스트 분류하기

 

1. TensorFlow 설정

import io
import os
import re
import shutil
import string
import tensorflow as tf

from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense, Embedding, GlobalAveragePooling1D
from tensorflow.keras.layers import TextVectorization

 

2. IMDb 데이터셋 다운로드

url = "https://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz"

dataset = tf.keras.utils.get_file("aclImdb_v1.tar.gz", url,
                                  untar=True, cache_dir='.',
                                  cache_subdir='')

dataset_dir = os.path.join(os.path.dirname(dataset), 'aclImdb')
os.listdir(dataset_dir)

train_dir = os.path.join(dataset_dir, 'train')
os.listdir(train_dir)

remove_dir = os.path.join(train_dir, 'unsup')
shutil.rmtree(remove_dir)

batch_size = 1024
seed = 123
train_ds = tf.keras.utils.text_dataset_from_directory(
    'aclImdb/train', batch_size=batch_size, validation_split=0.2,
    subset='training', seed=seed)
val_ds = tf.keras.utils.text_dataset_from_directory(
    'aclImdb/train', batch_size=batch_size, validation_split=0.2,
    subset='validation', seed=seed)

for text_batch, label_batch in train_ds.take(1):
  for i in range(5):
    print(label_batch[i].numpy(), text_batch.numpy()[i])

 

3. 성능을 위한 데이터셋 구성

AUTOTUNE = tf.data.AUTOTUNE

train_ds = train_ds.cache().prefetch(buffer_size=AUTOTUNE)
val_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE)

 

4. 임베딩 레이어 사용

embedding_layer = tf.keras.layers.Embedding(1000, 5)

result = embedding_layer(tf.constant([1, 2, 3]))
result.numpy()

result = embedding_layer(tf.constant([[0, 1, 2], [3, 4, 5]]))
result.shape

 

5. 텍스트 전처리

def custom_standardization(input_data):
  lowercase = tf.strings.lower(input_data)
  stripped_html = tf.strings.regex_replace(lowercase, '<br />', ' ')
  return tf.strings.regex_replace(stripped_html,
                                  '[%s]' % re.escape(string.punctuation), '')

vocab_size = 10000
sequence_length = 100

vectorize_layer = TextVectorization(
    standardize=custom_standardization,
    max_tokens=vocab_size,
    output_mode='int',
    output_sequence_length=sequence_length)

text_ds = train_ds.map(lambda x, y: x)
vectorize_layer.adapt(text_ds)

 

6. 분류 모델 만들기

embedding_dim=16

model = Sequential([
  vectorize_layer,
  Embedding(vocab_size, embedding_dim, name="embedding"),
  GlobalAveragePooling1D(),
  Dense(16, activation='relu'),
  Dense(1)
])

 

7. 모델 컴파일 및 학습

tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir="logs")

model.compile(optimizer='adam',
              loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
              metrics=['accuracy'])

model.fit(
    train_ds,
    validation_data=val_ds,
    epochs=15,
    callbacks=[tensorboard_callback])

model.summary()

#docs_infra: no_execute
%load_ext tensorboard
%tensorboard --logdir logs

 

8. 훈련된 단어 임베딩을 검색하여 디스크에 저장

weights = model.get_layer('embedding').get_weights()[0]
vocab = vectorize_layer.get_vocabulary()

out_v = io.open('vectors.tsv', 'w', encoding='utf-8')
out_m = io.open('metadata.tsv', 'w', encoding='utf-8')

for index, word in enumerate(vocab):
  if index == 0:
    continue  # skip 0, it's padding.
  vec = weights[index]
  out_v.write('\t'.join([str(x) for x in vec]) + "\n")
  out_m.write(word + "\n")
out_v.close()
out_m.close()

try:
  from google.colab import files
  files.download('vectors.tsv')
  files.download('metadata.tsv')
except Exception:
  pass

 

 

 

'DEVELOPMENT > TensorFlow' 카테고리의 다른 글

[TensorFlow] 기본 텍스트 분류  (0) 2023.06.29
[TensorFlow] 기본 이미지 분류  (0) 2023.06.29
[TensorFlow] 텐서플로 2.0 시작하기  (0) 2023.06.29