데이터마이닝/텍스트마이닝

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

DS지니 2021. 12. 27. 15:55
728x90
반응형
공부내용 참고사이트 : 위키독스 딥러닝을 이용한 자연어 처리 입문 
https://wikidocs.net/21698

 

컴퓨터는 텍스트보다 숫자를 더 잘 처리한다.

그렇기 때문에 텍스트 전처리와 토큰화를 진행했다면 이를 인덱스로 맵핑(mapping)시키는 작업이 필요하다.

가장 기본적인 인코딩 방법으로는 단어마다 고유의 정수를 매핑하는 정수 인코딩이 있다.

 

정수인코딩을 완료하면, 각 정수를 고유한 벡터로 바꾸는 작업이 필요한데 이 작업을 임베딩(Embedding)이라고 한다. 단어 벡터를 얻는 방법은 크게 원-핫 인코딩 워드 임베딩이 있는데, 주로 워드 임베딩이 사용된다.

 

*원본 문장 -> 전처리, 토큰화 -> 단어집합 만들기 -> 정수 인코딩(숫자) -> 원 핫 인코딩(벡터)

 

단어 벡터화 방법 중 하나인 원-핫 인코딩에 대해서 알아보자.

 

*원 핫 인코딩 : 단어 집합의 크기를 벡터의 차원으로 하고, 표현하고 싶은 단어의 인덱스에 1, 나머지 인덱스에는 0을 부여하는 단어의 벡터 표현 방식

 

 


 

 

 

1. 케라스(Keras)를 이용한 원-핫 인코딩(One-Hot Encoding)

 

케라스는 정수 인코딩 된 결과로부터 원-핫 인코딩을 수행하는 to_categoricat()을 지원한다.

인코딩을 하기 위해서는 먼저 단어집합(vocabulary)을 만들어야 한다. 

 

*단어 집합 : 텍스트의 모든 단어를 중복 없이 모아 놓은 집합

# 빈도 순 단어집합 만들기

text_for_vocab = "아 진짜 졸려. 커피 두 잔 마셨는데도 졸려 그럼 어떻게 해야해 살려줘"

from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.utils import to_categorical

tokenizer = Tokenizer()
tokenizer.fit_on_texts([text])
word_to_index = tokenizer.word_index
print("단어집합 :", word_to_index)

> 단어집합 : {'졸려': 1, '아': 2, '진짜': 3, '커피': 4, '두': 5, '잔': 6, '마셨는데도': 7, '그럼': 8, '어떻게': 9, '해야해': 10, '살려줘': 11}

 

# 정수 인코딩
sub_text = "졸려도 커피 마시면서 일했어. 살려줘 한 잔으로는 성에 안차서 두 잔 마셨어."
encoded = tokenizer.texts_to_sequences([sub_text])[0]
print(encoded)

> [4, 11, 5, 6]

 

# 원핫인코딩
one_hot = to_categorical(encoded)
print(one_hot)

> [[0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]

    [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]

    [0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]

    [0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]]

 

 

 

2. 원-핫 인코딩의 한계

 

1) 원 핫 벡터는 단어 집합의 크기가 곧 벡터의 차원 수가 된다. 그렇기 때문에 단어 집합(개수)가 늘어날 수록, 벡터를 저장하기 위해 필요한 공간(벡터의 차원)이 계속 늘어나는 단점이 있다.

ex)1000개 단어 = 단어 1개당 1000개의 차원을 가진 벡터 (하나의 값만 1이고, 999개는 0의 값을 가진 벡터)

 

2) 단어의 유사도를 표현하지 못한다. 단어의 유사성을 알지 못하는 단점은 검색 시스템 등에서는 문제가 된다.

 

*단어간 유사성을 알기 위해서는 단어의 잠재 의미를 반영해 다차원 공간에 벡터화 하는 기법을 사용하면 된다.

1) 카운트 기반 벡터화 방법 - LSA(잠재 의미 분석), HAL 등

2) 예측 기반 벡터화 방법 - NNLM, RNNLM, Word2Vec, FastText 등

3) 둘 다 사용 - GloVe

 

728x90
반응형