원-핫 인코딩은 문자를 숫자로 바꾸는 기법 중 가장 기본적인 방법으로, 서로 다른 단어들의 집합(vocabulary)을 벡터의 차원으로 만들어 인덱스를 부여하고, 표현하고 싶은 단어의 인덱스에 1, 나머지는 0을 부여하는 벡터 표현 방식이다. 


원-핫 인코딩 순서

  1. 문서나 문장에서 중복 단어 제거.
  2. 각 단어에 고유 인덱스 부여.(정수 인코딩)
  3. 표현할 단어에 인덱스 1 부여, 나머지 0 부여.


from konlpy.tag import Okt
 
okt = Okt()
token = okt.morphs("이것이 원 핫 인코딩이다")
 
word2index = {}
for voca in token:
    if voca not in word2index.keys():
        word2index[voca] = len(word2index)
print(word2index)  
# {'이': 0, '것': 1, '원': 2, '핫': 3, '인코딩': 4, '이다': 5}
 
def onehot_encoding(word, dic):
    onehot_vector = [0* (len(dic))
    index = dic[word]
    onehot_vector[index] = 1
    return onehot_vector
 
print(onehot_encoding("인코딩", word2index)) 
# 원-핫 인코딩 [0, 0, 0, 0, 1, 0]
cs



Keras 원-핫 인코딩


from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.utils import to_categorical
 
text = "나랑 점심 먹으러 갈래 점심 메뉴는 햄버거 갈래 갈래 햄버거 최고야"
 
= Tokenizer()
t.fit_on_texts([text])
print(t.word_index)
# {'갈래': 1, '점심': 2, '햄버거': 3, '나랑': 4, '먹으러': 5, '메뉴는': 6, '최고야': 7}
 
sub_text = "점심 먹으러 갈래 메뉴는 햄버거 최고야"
encoded = t.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.]
 [0. 0. 0. 0. 0. 1. 0. 0.]
 [0. 1. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 1. 0.]
 [0. 0. 0. 1. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 1.]]
'''
cs


원-핫 인코딩은 저장 공간 측면에서 비효율적이며 단어간 유사도를 표현할 수 없는 한계가 있지만, 다음 기법들로 다차원 공간에 유사도를 표현할 수 있다.

  • 카운트 기반의 벡터화 방법 : LSA, HAL
  • 예측 기반의 벡터화 방법 : NNLM, RNNLM, Word2Vec, FastText
  • 카운트와 예측 기반의 벡터화 방법 : GloVe




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,