단어 집합(vocabulary)
단어 집합이란 서로 다른 단어들의 집합이다.
book과 books와 같이 단어의 변형 형태도 다른 단어로 간주한다.
텍스트의 모든 단어를 중복 허용하지 않고 모아놓은 것을 단어 집합이라고 한다.
원-핫 인코딩 (One-Hot Encoding)
원-핫 인코딩은 단어 집합의 크기를 벡터 차원으로 하고, 원하는 단어의 인덱스 값을 1, 나머지를 0으로 처리한다.
이렇게 표현된 벡터를 원-핫 벡터(One-Hot vector) 라고 한다.
- 정수 인코딩: 각 단어에 고유한 정수 부여
- 표현하고 싶은 단어의 고유한 정수를 인덱스로 간주, 해당 위치에 1, 나머지에 0 부여
우선 정수 인코딩을 진행한다.
from konlpy.tag import Okt
okt = Okt()
tokens = okt.morphs("나는 자연어 처리를 배운다")
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이므로 원-핫 벡터의 인덱스 2번만 1의 값을 가진다.
케라스 원-핫 인코딩
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의 원-핫 벡터
'''
그러나 이런 원-핫 인코딩은 단어의 개수가 늘어날 수록 벡터를 저장하기 위한 공간이 많이 필요하다.
또, 단어의 유사도를 표현할 수 없다. 단어 간의 유사성을 알 수 없다는 건 검색 시스템에서 문제가 될 수 있다.
이 문제를 해결하기 위해서 다차원 공간에 벡터화하는 기법이 있다.
- 카운트 기반의 벡터화 (LSA, HAL 등)
- 예측 기반으로 벡터화 (NNLM, RNNLM, Word2Vec 등)
- 두 가지 방법을 모두 사용하는 GloVe
'AI > NLP' 카테고리의 다른 글
[Wiki] 언어 모델 (1) | 2024.06.02 |
---|---|
[Wiki] 한국어 전처리 패키지 (1) | 2024.06.02 |
[Wiki] 패딩 (0) | 2024.06.01 |
[Wiki] 정수 인코딩 (0) | 2024.06.01 |
[Wiki] 불용어 (0) | 2024.06.01 |