1. 원-핫 인코딩(One-hot encoding)이란?
자연어 처리에서는 문자를 숫자로 바꾸는 여러 가지 기법들이 있습니다. 그중에서도 가장 기본적인 표현방법이 바로 원-핫 인코딩이라는 표현방법이다.
단어 집합의 크기를 벡터으 차원으로 하고, 표현하고 싶은 단어의 인덱스에 1의 값을 부여하고, 다른 인덱스에는 0을 부여하는 단어의 벡터 표현 방식이다. 이렇게 표현된 벡터를 원-핫 벡터(One-hot vector)라고 한다.
원-핫 인코딩의 두 가지 과정
(1) 각 단어에 고유한 인덱스를 부여합니다. (정수 인코딩)
(2) 표현하고 싶은 단어의 인덱스의 위치에 1을 부여하고, 다른 단어의 인덱스의 위치에는 0을 부여한다.
※예시※
문장: 나는 자연어 처리를 배운다
from konlpy.tag import Okt
okt=Okt()
token=okt.morphs("나는 자연어 처리를 배운다")
print(token)
['나', '는', '자연어', '처리', '를', '배운다']
konlpy의 okt 형태소 분석기를 통해서 문장 토큰화
word2index={}
for voca in token:
if voca not in word2index.keys():
word2index[voca]=len(word2index)
print(word2index)
{'나': 0, '는': 1, '자연어': 2, '처리': 3, '를': 4, '배운다': 5}
각 토큰에 대하여 고유 인덱스 부여 (빈도수 고려 X)
def one_hot_encoding(word, word2index):
one_hot_vector = [0]*(len(word2index))
index=word2index[word]
one_hot_vector[index]=1
return one_hot_vector
one_hot_encoding("자연어",word2index)
[0, 0, 1, 0, 0, 0]
'자연어'라는 토큰을 입력으로 넣어봤더니 [0,0,1,0,0,0]라는 벡터가 나왔다. 단어의 집합에서 인덱스가 2이므로, 자연어를 표현하는 원-핫 벡터는 인덱스 2의 값이 1이며, 나머지 값은 0인 벡터가 나온다.
2. 케라스(Keras)를 이용한 원-핫 인코딩(One-hot encoding)
위에서는 파이썬으로 직접 코드를 작성하였지만, 케라스는 원-핫 인코딩을 수행하는 유용한 도구 to_categorical()을 지원하기 때문에 케라스를 이용하여 정수 인코딩과 원-핫 인코딩을 순차적으로 진행해보도록 하겠다.
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}
위와 같이 생성된 단어 집합(Vocabulary)에 있는 단어들로만 구성된 텍스가 있다면, texts_to_sequences()를 통해서 정수 시퀀스로 변환 가능하다. 단어 집합 내의 일부 단어들로만 구성된 서브 텍스트인 sub_text를 만들어 확인할 것이다.
sub_text="점심 먹으러 갈래 메뉴는 햄버거 최고야"
encoded= t.texts_to_sequences([sub_text])[0]
print(encoded)
[2, 5, 1, 6, 3, 7]
이제 정수 인코딩을 하여 나온 결과를 가지고 원-핫 인코딩을 할 것이다. 케라스에서 지원하는 to_categorical()을 통해 해 볼 것이다.
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의 원-핫 벡터
위의 결과는 "점심 먹으러 갈래 메뉴는 햄버거 최고야"라는 문장이 [2, 5, 1, 6, 3, 7]로 정수 인코딩이 되고 나서, 각각의 인코딩 된 결과를 인덱스로 원-핫 인코딩이 수행된 모습을 보여준다.
'머신러닝 > 딥러닝을 이용한 자연어처리 입문' 카테고리의 다른 글
Bag of Words(BoW) (0) | 2020.03.30 |
---|---|
RNN(Recurrent Neural Network) (0) | 2020.01.02 |
데이터의 분리(Splitting Data) (0) | 2019.11.19 |
불용어(Stopword) (0) | 2019.11.11 |
어간 추출(Stemming) and 표제어 추출(Lemmatization) (0) | 2019.11.01 |