[NLP] 텍스트 전처리 - (8) 원-핫 인코딩(One-Hot Encoding)

김규리·2022년 6월 21일

NLP

목록 보기
8/33
post-thumbnail
  • 단어 집합(vocabulary)
    텍스트의 모든 단어를 중복을 허용하지 않고 모아놓은 집합

1. 원-핫 인코딩(One-Hot Encoding)이란?

단어 집합의 크기를 벡터의 차원으로 하고, 표현하고 싶은 단어의 인덱스에 1의 값을 부여하고, 다른 인덱스에는 0을 부여하는 단어의 벡터 표현 방식
ㅤ
1) 정수 인코딩 수행
2) 표현하고 싶은 단어의 고유한 정수를 인덱스로 간주하고 해당 위치에 1 부여, 다른 단어의 인덱스 위치에 0 부여

  • 한국어 문장 예제: "나는 자연어 처리를 배운다"
from konlpy.tag import Okt  

okt = Okt()  
tokens = okt.morphs("나는 자연어 처리를 배운다")  
print(tokens)
['나', '는', '자연어', '처리', '를', '배운다']

word_to_index = {word : index for index, word in enumerate(tokens)}
print('단어 집합 :',word_to_index)
단어 집합 : {'나': 0, '는': 1, '자연어': 2, '처리': 3, '를': 4, '배운다': 5}

# 토큰을 입력하면 해당 토큰에 대한 원-핫 벡터를 만드는 함수
def one_hot_encoding(word, word_to_index):
  one_hot_vector = [0]*(len(word_to_index))
  index = word_to_index[word]
  one_hot_vector[index] = 1
  return one_hot_vector
  
one_hot_encoding("자연어", word_to_index)
[0, 0, 1, 0, 0, 0]

2. 케라스(Keras)를 이용한 원-핫 인코딩(One-Hot Encoding)

  • to_categorical()
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.utils import to_categorical

text = "나랑 점심 먹으러 갈래 점심 메뉴는 햄버거 갈래 갈래 햄버거 최고야"

tokenizer = Tokenizer()
tokenizer.fit_on_texts([text])
print('단어 집합 :',tokenizer.word_index)
단어 집합 : {'갈래': 1, '점심': 2, '햄버거': 3, '나랑': 4, '먹으러': 5, '메뉴는': 6, '최고야': 7}

sub_text = "점심 먹으러 갈래 메뉴는 햄버거 최고야"
encoded = tokenizer.texts_to_sequences([sub_text])[0]
print(encoded)
[2, 5, 1, 6, 3, 7]

# 원-핫 인코딩
one_hot = to_categorical(encoded)
print(one_hot)
[[0. 0. 1. 0. 0. 0. 0. 0.] # 인덱스 2의 원-핫 벡터
 [0. 0. 0. 0. 0. 1. 0. 0.] # 인덱스 5의 원-핫 벡터
 [0. 1. 0. 0. 0. 0. 0. 0.] # 인덱스 1의 원-핫 벡터
 [0. 0. 0. 0. 0. 0. 1. 0.] # 인덱스 6의 원-핫 벡터
 [0. 0. 0. 1. 0. 0. 0. 0.] # 인덱스 3의 원-핫 벡터
 [0. 0. 0. 0. 0. 0. 0. 1.]] # 인덱스 7의 원-핫 벡터

3. 원-핫 인코딩(One-Hot Encoding)의 한계

  • 벡터를 저장하기 위해 필요한 공간이 계속 증가 (벡터의 차원 증가)
  • 단어의 유사도 표현 불가 (검색 시스템 등에서 문제)
    ㅤ
    [해결방법]
    : 단어의 잠재 의미를 반영하여 다차원 공간에 벡터화 하는 기법
    1) 카운트 기반의 벡터화 방법인 LSA(잠재 의미 분석), HAL
    2) 예측 기반으로 벡터화 NNLM, RNNLM, Word2Vec, FastText 등
    3) 카운트 기반 + 예측 기반 모두 사용하는 방법인 GloVe
profile
connecting the dots

0개의 댓글