본문 바로가기
AI

자연어처리 : 텍스트 처리 : one-hot-encoding

by 월곡동로봇팔 2020. 3. 4.

정의

'나', '는', '자연어', '처리', '를', '배운다' 라는 단어가 있다.

이를 하나씩 {'나': 0, '는': 1, '자연어': 2, '처리': 3, '를': 4, '배운다': 5} 라고 mapping을 한 후,

자연어의 one-hot-vector는 [0, 0, 1, 0, 0, 0] 이라고 나온다.

 

즉, 실제 그 단어가 해당하는 index 위치에 1을, 나머지는 0을 취하는 작업을 one-hot-encoding 기법이라 한다.


keras를 이용한 one-hot-encoding

# Tokenizer : 언어의 빈도수, index, number 만큼 cut하는 기능까지
from tensorflow.keras.preprocessing.text import Tokenizer
# to_categorical : one-hot-encoding을 지원.
from tensorflow.keras.utils import to_categorical

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

t = Tokenizer()
# Tokenzier에는 list를 넣어서 구할 수 있음. [text] 한 것은 list를 만들어주려 한 것.
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]
"""

Tokenizer가 빈도수대로 mapping을 한대로 index를 부여한 dict를 참고해서, texts_to_sequences 는 [[2,5,1,6,3,7]]을 뱉어내기 때문에 [0] 을 붙여줘서 출력한다. index대로 단어들이 mapping이 되어있다.

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의 원-핫 벡터
"""

one-hot-encoding 의 한계

  1. 1,000개인 코퍼스를 가지고 원 핫 벡터를 만들면, 모든 단어 각각은 모두 1,000개의 차원을 가진 벡터가 됩니다. 다시 말해 모든 단어 각각은 하나의 값만 1을 가지고, 999개의 값은 0의 값을 가지는 벡터가 되는데 이는 저장 공간 측면에서는 매우 비효율적인 표현 방법입니다.
  2. 단어 간의 유사성을 우리가 알 수가 없다. 
  3. 유사성 해결 중 카운트 기반의 벡터화 : LSA, HAL
  4. 유사성 해결 중 예측 기반의 벡터화 : NNLM, RNNLM, Word2Vec, FastText

댓글