참조: https://wikidocs.net/22660 / https://brunch.co.kr/@goodvc78/16
02) 워드투벡터(Word2Vec)
앞서 원-핫 벡터는 단어 벡터 간 유의미한 유사도를 계산할 수 없다는 단점이 있음을 언급한 적이 있습니다. 그래서 단어 벡터 간 유의미한 유사도를 반영할 수 있도록 단어의 ...
wikidocs.net
Word2Vec 그리고 추천 시스템의 Item2Vec
마이크로소프웨어 AI특집 복간호 기고글 | 개발자들의 마소(마이크로 소프트웨어 잡지)가 다시 발간되었다. 우연히 기회가 되어 재 발간되는 마소에 나의 글을 기고할 수 있게 된 것은 가문의
brunch.co.kr
Word2Vec
원-핫 벡터는 단어 벡터 간 유의미한 유사도를 계산할 수 없다
단어 벡터 간 유의미한 유사도를 반영할 수 있도록 단어의 의미를 수치화 할 수 있는 방법
단어의 의미를 다차원 공간에 벡터화하는 방법 (분산 표현, distributed representation) 활용
단어 벡터화 방식
1. 희소 표현 (Sparse Representation)
- One-Hot Encoding
2. 밀집 표현 (Dense Representation)
분산 표현 (Distributed Representation)
'비슷한 문맥에서 등장하는 단어들은 비슷한 의미를 가진다' 라는 가정
희소 표현이 고차원에 각 차원이 분리된 표현 방법이었다면, 분산 표현은 저차원에 단어의 의미를 여러 차원에다가 분산 하여 표현
-> 이런 표현 방법을 사용하여 단어 벡터 간 유의미한 유사도를 계산
대표적인 학습 방법: Word2Vec
CBOW(continuous bag-of-words)와 skip-gram 이라는 2가지의 모델로 제안이 되었다.
1. CBOW
Continuous Bag-Of-Words
CBOW 모델의 경우 context words라는 주변의 단어들을 이용해서 target word를 예측하는 모델
"나는 대한민국 국민이다"라는 문장이 있다고 가정을 해보자. Input은 "나는", "대한민국", "국민이다"라는 것들이 되며 이 문장들을 학습하여 "나는 ~ 국민이다" 안에 들어갈 단어를 예측해 낼 수 있다.
이때 주변 단어를 몇개 쓸 것인지 학습을 할 때 선택할 수 있는데 이를 윈도우 크기(Window size)라 한다. 예를 들어 윈도우 크기를 2로 할 경우 학습 시 앞뒤 단어 2개를 사용하여 중간에 있는 단어를 예측하게 된다.
2. Skip-Gram
주변의 단어들의 문맥(context)를 학습하여 단어를 예측하는 것이 CBOW라고 한다면 Skip-Gram은 이와 반대되는 개념
"~ 대한민국 ~"의 문장이 있을 경우, 대한민국의 주변 단어들을 예측하는 모델
Skip-Gram도 CBOW 처럼 윈도우 개념을 사용하며 하나의 단어를 기반으로 주변의 단어를 몇개까지 예측하는지를 역시 Window로 표현한다. 1일 경우 앞뒤 한개씩, 2일 경우 앞뒤 2개씩을 학습하며 예측한다.
대충 성능은 CBOW가 더 좋을거라 예측할 수 있어서 Skip-Gram은 왜 쓰는 것일까 생각할 수 있지만 분산 표현력은 Skip-Gram이 더 우수하며 CBOW는 학습 속도가 빠른 장단점들을 각각 가지고 있다.
+실제 현업에서는 CBOW보다는 Skip-Gram 알고리즘을 많이 사용합니다. 그 이유는 일단 성능적인 측면이 큽니다. Skip-Gram은 CBOW 보다 좀 더 어려운 테스크를 수행하고, 하나의 문장에서 더 많인 데이터가 나옵니다.
+일반적으로 데이터 집합이 클 경우 Skip-gram 모델 구조가 우수한 정확도 등의 측면을 보이는 것으로 알려져 있다(Mikolov et al., 2013; 심영석 & 김홍범, 2018).
간단한 코드 구현:
# Word2Vec
import gensim
from gensim.models import Word2Vec
# Word2Vec 모델 학습(학습 방식 = CBOW)
model_cbow = gensim.models.Word2Vec(sentences=df['Text_token'], size=100, window=3, min_count=0,workers=4,sg=0)
# 완성된 임베딩 매트릭스의 크기 확인(cbow)
model_cbow.wv.vectors.shape #>(7131, 100)
# 단어 유사도 확인
print(model_cbow.wv.most_similar("삼겹살"))
'멋쟁이 사자처럼 AI SCHOOL 5기 > Today I Learned' 카테고리의 다른 글
[6주차 총정리] Kakao API 활용하여 스크래핑하기 (항상 스크래핑 전 API 있는지 먼저 확인) (0) | 2022.04.26 |
---|---|
[6주차 총정리] t-SNE 개념 정리 (0) | 2022.04.26 |
[6주차 총정리] pd.Series 특정 문자 포함 여부 확인/ 개수 Count (pd.Series.str.contains()/ str.count()) (0) | 2022.04.26 |
[6주차 총정리] Matplotlib 트리맵으로 계층적 데이터 시각화 (Squarify) (0) | 2022.04.26 |
[6주차 총정리] Streamlit으로 간단한 웹어플리케이션 구현하기 (0) | 2022.04.26 |