딥러닝(AI학습 45)

이유진·2024년 7월 8일

--27.Word2Vec.ipynb--

Word2Vec

단어의 '의미' 나 '연관성' 을 벡터로 표현

단어의 '의미'를 '벡터'로 표현하면,

연관된 단어를 추출하거나, 단어와 단어의 유사도를 확인할수 있다.

또한 의미를 선형계산할수 있어서 "왕자 - 남성 + 여성 => 공주" 와 같은 계산을 할수 있다

Word2Vec : 문장 내부의 단어를 벡터로 변환하는 도구

단어의 연결을 기반으로 단어의 연관성을 벡터로 만들어줌

즉, 단어를 벡터로 표현해줌.

단어를 벡터로 사용하면 , 단어의 '유사도' 를 쉽게 확인할수 있다.

base_path = r'/content/drive/MyDrive/dataset'

!pip install konlpy

import codecs
from bs4 import BeautifulSoup
from konlpy.tag import Okt
from gensim.models import word2vec
import os

fp = codecs.open(os.path.join(base_path, 'BEXX0003.txt'), 'r', encoding='utf-16')
soup = BeautifulSoup(fp, 'html.parser')
body = soup.select_one("body > text")
text = body.getText()

text

어미, 조사, 구두점 제거

- 명사, 동사, 형용사 만 학습시키기 위함

- 동사, 형용사는 '기본형' 으로만 학습

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', 'Pucntuation']:
  r.append(word[0])

rl = (" ".join(r)).strip()
results.append(rl)
print(rl)

wakati_file = os.path.join(base_path, 'toji.wakati')
with open(wakati_file, 'w', encoding='utf-8') as fp:
fp.write('\n'.join(results))

Word2Vec 모델 만들기

data = word2vec.LineSentence(wakati_file) # LineSentence 객체 생성
data

딥러닝을 통한 워드벡터 모델 생성

model = word2vec.Word2Vec(data, vector_size=200, window=10, hs=1, min_count=2, sg=1)

# vector_size : 문장의 벡터의 차원
# window: 한 문장 내에서의 최대 거리값.
# hs=1 : hierarchical softmax 학습
# min_count : 발생빈도가 이보다 낮으면 무시
# sg : 학습 알고리즘 선택 1 이면 -> skip-gram 사용

model

학습한 모델 저장

model.save(os.path.join(base_path, 'toji.model'))

저장한 모델 불러오기

model = None
model = word2vec.Word2Vec.load(os.path.join(base_path, 'toji.model'))

학습된 말뭉치 (corpus) 개수

model.corpus_count

말뭉치(corpus) 내 전체 단어개수

model.corpus_total_words

model.wv.most_similar(positive=['땅'])

model.wv.most_similar(positive=['집'])

사실 소설 한두권으로는 데이터가 부족하다

조금 더 많은 데이터로 Word2Vec 을 테스트해봅시다.

위키피디아 (한국어) 내용을 사용하겠습니다. 용량이 꽤 크므로 시간이 꽤 걸리는 예제가 될겁니다. (★10시간 넘을수도★)

위키피디아 (한국어판) 데이터 다운로드

https://dumps.wikimedia.org/kowiki/latest

위 페이지에서 kowiki-latest-pages-articles.xml.bz2 파일을 다운 받아서 압축을 풉니다.

model = word2vec.Word2Vec.load(os.path.join(base_path, 'wiki.model'))

model.wv.most_similar(positive=['Python', '파이썬'])

아빠 - 남성 + 여성

model.wv.most_similar(positive=['아빠', '여성'], negative=['남성'])

왕자 - 남성 + 여성

model.wv.most_similar(positive=['왕자', '여성'], negative=['남성'])

한국에서 서울에 해다아하는 곳이 일본에서는 어디일까요?

model.wv.most_similar(positive=['서울', '일본'], negative=['한국'])

model.wv.most_similar(positive=['서울', '중국'], negative=['한국'])

model.wv.most_similar(positive=['서울','맛집'])

model.wv['고양이']

profile
독해지자

0개의 댓글