원-핫 인코딩은 문자를 숫자로 바꾸는 기법 중 가장 기본적인 방법으로, 서로 다른 단어들의 집합(vocabulary)을 벡터의 차원으로 만들어 인덱스를 부여하고, 표현하고 싶은 단어의 인덱스에 1, 나머지는 0을 부여하는 벡터 표현 방식이다.
원-핫 인코딩 순서
- 문서나 문장에서 중복 단어 제거.
- 각 단어에 고유 인덱스 부여.(정수 인코딩)
- 표현할 단어에 인덱스 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 = "나랑 점심 먹으러 갈래 점심 메뉴는 햄버거 갈래 갈래 햄버거 최고야" t = 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
- 손가락귀신
정신 못차리면, 벌 받는다.
,