+ 개발

Word2Vec 모델 만들기

AI.Logger 2024. 9. 16. 00:07
  • 수업 내용 리마인드 및 아카이빙 목적의 업로드


1. 영어 Word2Vec 만들기

1) 필요 모듈 로드

먼저 Word2Vec 학습을 위해 필요한 라이브러리를 불러옵니다.

import re
import urllib.request
import zipfile
from lxml import etree
from nltk.tokenize import word_tokenize, sent_tokenize
import nltk
nltk.download("punkt")

 

2) 데이터 로드

데이터는 TED 강연 텍스트로, XML 형식으로 제공됩니다. content 태그 사이의 내용을 추출합니다.

# 데이터 다운로드
urllib.request.urlretrieve("https://raw.githubusercontent.com/ukairia777/tensorflow-nlp-tutorial/main/09.%20Word%20Embedding/dataset/ted_en-20160408.xml", filename="ted_en-20160408.xml")

# XML 파싱 및 내용 추출
targetXML = open('ted_en-20160408.xml', 'r', encoding='UTF8')
target_text = etree.parse(targetXML)
parse_text = '\n'.join(target_text.xpath('//content/text()'))
print(parse_text[:1000])

 

3) 데이터 전처리

강연 텍스트에서 배경음을 나타내는 (Laughter), (Applause)와 같은 불필요한 부분을 제거한 후, 문장 및 단어 토큰화를 진행합니다.

# 정규 표현식을 사용해 배경음을 제거
content_text = re.sub(r'\([^)]*\)', '', parse_text)

# 문장 토큰화
sent_text = sent_tokenize(content_text)

# 단어 토큰화 및 소문자 변환
normalized_text = [re.sub(r"[^a-z0-9]+", " ", string.lower()) for string in sent_text]
result = [word_tokenize(sentence) for sentence in normalized_text]
print('총 샘플의 개수 : {}'.format(len(result)))

 

4) Word2Vec 학습

Word2Vec 모델을 학습합니다. 이번 예제에서는 CBOW 모델을 사용하여 단어 벡터를 학습합니다.

from gensim.models import Word2Vec

# Word2Vec 학습
model = Word2Vec(sentences=result, vector_size=100, window=5, min_count=5, workers=4, sg=0)
model_result = model.wv.most_similar("companies")
print(model_result)

모델 주요 기능:

  • 유사 단어 찾기: model.wv.most_similar(positive=["king", "woman"], negative=["man"], topn=10)
  • 단어 간 유사도 계산: model.wv.similarity("organizations", "governments")
  • 이질적인 단어 찾기: model.wv.doesnt_match(["breakfast", "lunch", "dinner", "banana"])

5) 모델 저장 및 로드

학습된 Word2Vec 모델을 저장하고, 나중에 불러와 사용할 수 있습니다.

# 모델 저장
model.save("word2vec.model")

# 모델 로드
new_model = Word2Vec.load("word2vec.model")
print(new_model.wv.most_similar("companies"))

 

2. 한국어 Word2Vec 만들기

한국어 데이터를 사용한 Word2Vec 모델을 학습해봅니다. Naver 영화 리뷰 데이터를 사용합니다.

 

1) 필요 모듈 로드

!pip install konlpy
import pandas as pd
import urllib.request
from gensim.models import Word2Vec
from konlpy.tag import Okt
from tqdm import tqdm

 

2) 데이터 로드

# 데이터 다운로드
urllib.request.urlretrieve("https://raw.githubusercontent.com/e9t/nsmc/master/ratings.txt", filename="ratings.txt")

# 데이터 로드
train_data = pd.read_table('ratings.txt')
print(train_data[:5])

 

3) 데이터 전처리

한글 외의 문자는 제거하고, 불용어를 정의하여 데이터에서 제거합니다. 이후 형태소 분석기를 사용해 데이터를 토큰화합니다.

# 정규 표현식을 통한 한글 외 문자 제거
train_data['document'] = train_data['document'].str.replace("[^ㄱ-ㅎㅏ-ㅣ가-힣 ]", "", regex=True)

# 형태소 분석기를 사용한 토큰화 및 불용어 제거
okt = Okt()
stopwords = ['의','가','이','은','들','는','좀','잘','걍','과','도','를','으로','자','에','와','한','하다']
tokenized_data = []
for sentence in tqdm(train_data['document']):
    tokenized_sentence = okt.morphs(sentence, stem=True)
    stopwords_removed_sentence = [word for word in tokenized_sentence if not word in stopwords]
    tokenized_data.append(stopwords_removed_sentence)

 

4) Word2Vec 학습

# Word2Vec 학습
model = Word2Vec(sentences=tokenized_data, vector_size=100, window=5, min_count=5, workers=4, sg=0)
print(model.wv.most_similar("히어로"))

 

3. 학습된 Word2Vec 활용

1) 모델 로드

구글의 사전 학습된 Word2Vec 모델을 로드하고 활용합니다.

import gdown
import gensim

# 모델 다운로드
file_id = "0B7XkCwpI5KDYNlNUTTlSS21pQmM"
download_url = f"https://drive.google.com/uc?id={file_id}&export=download"
output = "GoogleNews-vectors-negative300.bin.gz"
gdown.download(download_url, output, quiet=False)

# 모델 로드
word2vec_model = gensim.models.KeyedVectors.load_word2vec_format(output, binary=True)
print(word2vec_model.most_similar("book"))

 

2) 유사도 확인

# 유사도 계산
print(word2vec_model.similarity('king', 'queen'))

 

4. Word2Vec 시각화

Word2Vec 모델을 학습한 후에는 임베딩 벡터를 시각화하여 단어 간의 관계를 확인할 수 있습니다. 이를 위해 Tensorflow Embedding Projector를 사용할 수 있습니다.

!python -m gensim.scripts.word2vec2tensor --input eng_w2v --output eng_w2v

 

 

 

https://projector.tensorflow.org/

 

Embedding projector - visualization of high-dimensional data

Visualize high dimensional data.

projector.tensorflow.org