목차
단어임베딩(Word Embedding)이란?
- 단어 간의 관계를 반영하기 위해 단어를 벡터로 매핑하는 것을 말한다.
- 대표적인 모델 : word2vec, GloVe, FastText
Word2Vec 이란?
- word2vec은 단어 임베딩 모델 중 하나이다. word2vec에서 가장 중요한 아이디어는 비슷한 분포를 가진 단어들은 비슷한 의미를 가진다는 것이다.
- word2vec에서 사용하는 2가지 알고리즘 : CBOW(Continuous bag of words), Skip-gram
① CBOW : 주변 단어(맥락)로 타겟 단어를 예측하는 방식
- 크기가 작은 데이터셋에 적합하다.
② Skip-gram : CBOW와 정반대 방식으로 타겟 단어로 주변 단어(맥락)를 예측하는 방식
- 크기가 큰 데이터셋에 적합하다.
[실습1 - '토지'를 활용해 word2vec 사용법 간단히 알아보기]
import codecs
from bs4 import BeautifulSoup
from konlpy.tag import Okt
from gensim.models import word2vec
fp = codecs.open("BEXX0003.txt", "r", encoding="utf-16")
soup = BeautifulSoup(fp, "html.parser")
text = soup.select_one('body').text #body 태그 안의 텍스트 추출(텍스트가 태그 안에 존재하기 때문)
okt=Okt()
results=[]
lines=text.split("\n")
for line in lines:
malist=okt.pos(line, norm=True, stem=True)
r=[]
for word in malist:
if not word[1] in ["Josa", "Eomi", "Punctuation"]:
r.append(word[0])
rl=(" ".join(r)).strip()
results.append(rl)
#print(rl)
gubun_file='toji.gubun'
with open(gubun_file, 'w', encoding='utf-8') as fp:
fp.write("\n".join(results))
data=word2vec.LineSentence(gubun_file)
model=word2vec.Word2Vec(data, size=200, window=10, hs=1, min_count=2, sg=1)
model.save("toji.model")
print("ok")
1. word2vec에서 사용할 수 있게 토지 파일 전처리 작업을 한다.
- 단어는 기본형만 사용
- 형태소에서 조사·어미·구두점은 제외한다.
2. 'toji.gubun'이라는 파일에 처리결과를 저장한다.
3. 모델 생성 : word2vec.Word2Vec(data, size=200, window=10, hs=1, min_count=2, sg=1)
- size=200 : 200차원의 벡터로 바꿔라
- window=10 : 주변 단어는 앞뒤로 10개까지 봐라
- hs=1 : 기본 값은 0, 값이 1이면 소프트맥수 함수를 사용한다는 뜻. 음수면 음수샘플링 사용.
- min_count=2 : 빈도수가 2보다 작으면 해당 단어를 제거해라
- sg=1 : 알고리즘을 지정. 0이 기본값으로 0이면 CBOW 사용, 1이면 skip-gram 사용.
*소프트맥스(softmax) 함수란?
- 출력값을 정규화해주는 함수
- 소프트맥스 함수에 다양한 입력값을 넣으면 그 값들은 0과 1사이의 값으로 정규화된다. 그리고 모든 값들의 총합은 항상 1이된다.
생성한 모델을 사용해 유사한 단어 확인하기
from gensim.models import word2vec
model=word2vec.Word2Vec.load("toji.model")
print(model.most_similar(positive=["길"]))
길과 유사한 단어를 찾아보면 아래와 같은 결과가 나온다.
from gensim.models import word2vec
model=word2vec.Word2Vec.load("toji.model")
print(model.most_similar(positive=["땅"]))
땅과 유사한 단어를 찾아보면 아래와 같은 결과가 나온다.
- most_similar함수에서 positive 옵션은 가까운 단어를 찾고 negative 옵션을 주면 멀리있는 단어를 찾는다.
from gensim.models import word2vec
model=word2vec.Word2Vec.load("toji.model")
print(model.most_similar(negative=["땅"]))
땅과 멀리있는 단어를 찾으면 아래와 같은 결과가 나온다. (negative 옵션 사용)
참고자료
실습 : 파이썬을 이용한 머신러닝, 딥러닝 실전 개발 입문_ 쿠지라 히코우즈쿠에 저
'Study > 머신러닝' 카테고리의 다른 글
[4] MLP(Multi Layer Perceptron)로 텍스트 분류하기 (0) | 2020.07.30 |
---|---|
[3] 나이브 베이즈 분류를 사용한 텍스트 분류 (0) | 2020.07.25 |
[2-1] KoNLPy 사용해서 한국어 형태소 분석하기(자연어 처리) (0) | 2020.07.16 |
[1-2] 서포트 벡터 머신(Support Vector Machine) (0) | 2020.07.10 |
[1-1] 의사 결정 나무 (0) | 2020.07.10 |