- Word2Vec
- 문자를 수치형으로 변환시켜주는 딥러닝 기반의 임베딩 기술
- 매개변수(parameter)
- sentences
- 기본값 : None -> 학습을 시킬 수 있다.
- 토큰화가 된 문장 데이터 (2차원 데이터)
- vector_size
- 기본값 : 100
- 임베딩 벡터 차원의 개수 (feature의 수)
- window
- 기본값 : 5
- 예측 시 고려할 주변 단어와의 거리 (문맥의 크기)
- sg
- 기본값 : 0
- 0인 경우 : CBOW 방식 (주변 단어들을 이용하여 중심 단어를 예측)
- 1인 경우 : Skip_gram 방식 (중심 단어를 이용하여 주변 단어를 예측)
- min_count
- 기본값 : 5
- 최소 등장 빈도의 수
- 적게 등장한 단어들을 제외
- hs
- 기본값 : 0
- 계산의 방식 지정
- 0 : Negative Sampling (계산량 적음)
- 1 : Hierarchical Softmax (계산량 많음)
- epochs
- max_vocab_size
- 기본값 : None
- 메모리 제한 사용할 최대 단어의 수
- 속성
- wv
- 학습된 단어 벡터 (class 형태로 출력)
- 예 : model.wv['단어']
- wv.index_to_key
- 단어의 리스트 (학습이 된 단어의 개수) -> 최소 등장 횟수에 영향을 줌
- 등장 빈도 수에 따라 자동 결정
- ww.key_to_index
- 단어 -> 인덱스로 매칭
- 특정 단어가 인덱스 몇에 위치하는가
- corpus_total_word : 전체 학습이 된 단어의 개수
- epochs : 학습의 epoch 수
- vector_size : 벡터 차원의 수
- 메서드
- wv.most_similar(word, topn=10)
- 특정 단어와 유사한 단어를 출력
- topn은 유사한 단어의 개수를 출력
- wv.similarity(word1, word2) : 두 단어 간의 코사인 유사도
- wv.get_vector(word) : 특정 단어를 벡터로 변환
- train() : 추가 데이터로 학습
- save() : 학습된 모델을 저장
- Word2Vec.load() : 저장되어있는 모델을 로드
- FastText
- Word2Vec에서 OOV(Out Of Voca) 문제를 해결하기 위한 모델
- Word2Vec은 '강아지'와 '강아지들'의 두 단어를 다른 단어로 인식
- FastText는 기존의 Word2Vec 학습 방식은 동잉ㄹ하지만 기준이 되는 문자가 다름
- Word2Vec는 단어를 기준으로 하고, FastText는 글자를 기준으로 함
- FastText : '강아지' -> '강', '아', '지', '강아', '아지', '강아지' (n-gram 방식)
- subword를 기준으로 문자들을 벡터화
- Word2Vec의 매개변수들을 이용하지만 추가적으로 subword 관련한 매개변수들이 사용됨
- 최소 길이의 subword : min_n (기본값은 3)
- 최대 길이의 subword : max_n (기본값은 6)
- min_n=1, max_n=1로 설정을 하면 subword 사용 금지 -> Word2Vec 방식을 이용
- min_n이 max-n보다 작거나 같게 설정
- bucket 매개변수는 단어(subword) 사전에 개수를 제한 (메모리 과부하 방지 위함)
from gensim.models import Word2Vec, FastText
sentences=[
['고양이', '고양이들', '귀엽다', '동물', '반려동물'],
['강아지', '강아지들', '귀엽다', '동물', '반려동물'],
['달리다', '달리는', '달림', '걷다', '걷는'],
['예쁘다', '예쁨', '예쁜', '매력적이다'],
['컴퓨터', '컴퓨팅', '컴퓨터들', '기계']
]
w2v=Word2Vec(
sentences=sentences,
window=3, #중심 단어와 주변 단어들의 거리 제한
min_count=1, #전체 문서에서 최소 등장 횟수 지정
sg=1, #단어 예측 방식( 0 : CBOW, 1 : skip-gram )
seed=42
)
ft=FastText(
sentences=sentences,
window=3,
min_count=1,
sg=1,
seed=42,
min_n=2
)
#단어 간의 유사도를 확인
print(
'Word2Vec 단어 간의 유사도 : ', w2v.wv.similarity('강아지', '강아지들')
)
print(
'FastText 단어 간의 유사도 : ', ft.wv.similarity('강아지', '강아지들')
)
>>> Word2Vec 단어 간의 유사도 : 0.06403736
FastText 단어 간의 유사도 : 0.4059004
#비교 대상 단어들
test_text=[
['강아지', '강아지들'],
['고양이', '고양이들'],
['달리다', '달리는'],
['예쁘다', '예쁜'],
['컴퓨터', '컴퓨팅'],
['달리다', '걷다']
]
for word1, word2 in test_text:
w2v_sim=w2v.wv.similarity(word1, word2)
ft_sim=ft.wv.similarity(word1, word2)
print(f'{word1}과 {word2}간의 유사도 : Word2Vec({w2v_sim}) / FastText({ft_sim})')
>>> 강아지과 강아지들간의 유사도 : Word2Vec(0.06403736025094986) / FastText(0.40590038895606995)
고양이과 고양이들간의 유사도 : Word2Vec(-0.07337046414613724) / FastText(0.46013206243515015)
달리다과 달리는간의 유사도 : Word2Vec(0.04628411680459976) / FastText(0.3028862476348877)
예쁘다과 예쁜간의 유사도 : Word2Vec(0.1387229710817337) / FastText(0.06622864305973053)
컴퓨터과 컴퓨팅간의 유사도 : Word2Vec(-0.05135165899991989) / FastText(0.36511483788490295)
달리다과 걷다간의 유사도 : Word2Vec(-0.06980345398187637) / FastText(-0.019979456439614296)