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

김규리·2022년 6월 21일
0

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개의 댓글