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