728x90
원-핫 인코딩을 해야하는 이유?
컴퓨터는 문자보다는 숫자를 더 잘 처리 할 수 있다. 그렇기에 NLP에서는 문자를 수자로 바꾸는 여러가지 기법들이 있다. 그 중 원-핫 인코딩(One-hot Encoding)이 가장 기본적인 표현 방법이며, 머신러닝과 딥러닝을 위해서는 반드시 배워야하는 방법이다.
단어 사전(vocabulary)란 ?
단어 사전은 서로 다른 단어들의 집합이다. book 과 books는 다른 단어로 간주되며, 텍스트의 모든 단어의 중복을 허용하지 않고 모아 놓은 것이다.
텍스트에 단어가 총 5,000개가 존재한다면, 단어 사전의 크기는 5,000이 된다. 5,000개의 단어가 있는 단어 사전은 각 단어들마다 1번~5,000번까지 인덱스를 부여한다. 예를 들어, book은 150번, dog는 171번, love는 192번, books는 212번과 같이 부여할 수 있다(인덱스는 임의로 지정한 것이다)
(1) 각 단어에 고유한 인덱스를 부여합니다. (정수 인코딩)
(2) 표현하고 싶은 단어의 인덱스의 위치에 1을 부여하고, 다른 단어의 인덱스의 위치에는 0을 부여합니다.
한국어 예제
konlpy 패키지 사용
pip install konlpy
- 입력 : 나는 자연어 처리를 배운다
- 처리 1(형태소분석(Okt)) : ['나', '는', '자연어', '처리', '를', '배운다']
- 처리 2(고유한 인덱스 부여) : {'나': 0, '는': 1, '자연어': 2, '처리': 3, '를': 4, '배운다': 5}
- 결과(자연어 단어찾기) : [0, 0, 1, 0, 0, 0]
# 1. 입력 : 나는 자연어 처리를 배운다
text = '나는 자연어 처리를 배운다'
# 2. 처리 1(형태소분석(Okt)) : ['나', '는', '자연어', '처리', '를', '배운다']
from konlpy.tag import Okt
okt = Okt()
token = okt.morphs(text)
print(token) # ['나', '는', '자연어', '처리', '를', '배운다']
# 3. 처리 2(고유한 인덱스 부여) : {'나': 0, '는': 1, '자연어': 2, '처리': 3, '를': 4, '배운다': 5}
word2index = {}
for voca in token:
if voca not in word2index.keys():
word2index[voca] = len(word2index)
print(word2index) # {'나': 0, '는': 1, '자연어': 2, '처리': 3, '를': 4, '배운다': 5}
# 4. 결과(자연어 단어찾기) : [0, 0, 1, 0, 0, 0]
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]
원-핫 인코딩(One-hot encoding)의 한계
- 벡터를 저장하기 위한 필요한 공간이 계속 늘어난다
- 단어가 1,000개인 코퍼스를 가지고 원핫 벡터를 만들면 하나의 값만 1를 가지고, 999개는 0값을 가지게 됨으로써 매우 비효율적인 방법이다
- 단어의 유사도를 표현하지 못한다
- 강아지, 개, 냉장고 라는 3개의 단어가 있을 때, 강아지라는 단어가 개와 냉장고 중에 뭐가 더 유사한지 알 수 없다
- 위 단점은 검색 시스템에서 심각한 문제이다. 만약, "숙소"를 검색하면 비슷한 의미의 게스트하우스, 호텔, 모텔 등 유사 단어와 같이 검색이 되야하는데, 검색이 안된다는 것이다.
원-핫 인코딩의 단점을 보완한 것이 "워드 임베딩(Word Embedding)"이다.
출처 : https://wikidocs.net/60853
728x90
'자연어처리(NLP)' 카테고리의 다른 글
TF-IDF 해석 방법(+ 예제, 실험) (0) | 2023.01.05 |
---|---|
Skip-gram (0) | 2022.12.16 |
CBOW(Continuous Bag of Words) (2) | 2022.12.16 |
워드투벡터(Word2Vec) (0) | 2022.12.16 |
워드 임베딩(Word Embedding) (0) | 2022.12.16 |