22.word2vec Modeling 실습
22강 word2vec Modeling 실습
01. 패키지 및 데이터 불러오기
import pandas as pd #데이터처리
import re #정규표현식
#전처리 패키지
from nltk.tokenize import word_tokenize #토큰화
from nltk.corpus import stopwords #불용어
from nltk.stem import PorterStemmer #어간추출
#모델링, 시각화 패키지
from gensim.models import Word2Vec #word2vec
import matplotlib.pyplot as plt #plot
from sklearn.manifold import TSNE #word2vec시각화
이번 실습에 사용할 패키지를 불러온다.
TSNE를 통해 그림을 그려보는데 일반적으로 PCA라는 방법론을 활용해서 지각도를 그린다. 그런데, PCA의 일반적인 방법은 직교이다. 90도로 서로 나눠지게끔 하는데 이 모습을 좌표평면에서 확인해보면 PCA는 단어들의 모임이 한 곳에 모이게 된다. 겉으로 보기엔 분명히 나눠져보이지만 실제 값은 원래 값보다 과도하게 구분되는 경향이있다. 그래서 고안된 방법이 TSNE 방법론이다.
T 분포를 이용해서 근처에 있는 값을 지각도로 표현해 낸 것이 TSNE 방법론이다. 특징으로는 골고루 유사한 정도에 따라 묶이게 되는데 한쪽으로 쏠리지 않는 것이다. 그래서 대용량의 데이터는 PCA보다 TSNE를 사용하는 것이 실제 분포에 가까운 지각도를 그릴 수 있다.
en_data=pd.read_csv('wos_ai_.csv', encoding='euc-kr')
en_data_abstract = en_data['ABSTRACT']
실습파일에 해당하는 부분 중 초록에 해당되는 열만 en_data_abstract에 저장해준다.
02. 데이터 전처리
en_doc = []
en_word_joined = []
en_word = []
단어, 조인한 단어, 조인되지 않은 단어를 저장할 공간을 만들어 준다.
for doc in en_data_abstract:
if type(doc) != float:
en_doc.append(doc.replace("-", " "))
이제 저장했던 초록 데이터에서 숫자를 제외한 모든 단어를 en_doc에 “-“를 공백으로 바꿔서 저장해준다.
en_stopwords = set(stopwords.words("english"))
en_stemmer = PorterStemmer()
불용어 사전을 준비해주고, 어간추출을 위한 명령어를 준비해준다.
for doc in en_doc:
en_alphabet = re.sub(r"[^a-zA-Z]+", " ", str(doc))
en_tokenized = word_tokenize(en_alphabet.lower())
en_stopped = [w for w in en_tokenized if w not in en_stopwords]
en_stemmed = [en_stemmer.stem(w) for w in en_stopped]
en_word_joined.append(' '.join(en_stemmed))
en_word.append(en_stemmed)
전처리 과정을 거친다. 해당 전처리 부분은 12강에서 다뤘으므로 자세한 설명은 해당 링크를 통해 살펴볼 수 있다.
03. word2vec 분석 및 word 좌표 확인
# en_w2v_model = Word2Vec(en_word,size=300, window=20, min_count=10, workers=4)
en_w2v_model = Word2Vec(en_word, vector_size=300, window=20, min_count=10, workers=4)
size로 설정값을 부여했던 것을 업데이트 이후 vector_size로 변경되어 수정하였다.
[참고) models.word2vec - Word2Vec 임베딩 ]
구글에서 이 방법을 제안할때 단어간 문서간 300~500개 정도의 차원으로 구성해야 분명하게 구분이 된다고 제안을 했다. 해서 size를 300으로 정해서 모델링해보자.
300차원으로 한다고 해도 단어가 구분이 되는 기준은 300개가 아니라 20~30개만 쓰일 수도 있다. x축 y축에서 x축에 의해 결정되면 y축은 큰 의미가 없어지는 것이다.
window는 단어의 연계를 20으로 두고, 최소 count는 10으로 둔다.
자세한 옵션들에 대한 값들은 공부를 해보아야 할 필요가 있다. 위의 참고)models.word2vec의 링크를 참고하자.
print(en_w2v_model.wv['algorithm'])
위의 [‘단어’]에 단어를 넣으면 300차원의 값을 확인해볼 수 있다.
여기에선 algorithm의 300차원의 값을 확인 가능하다.
차원 뿐 아니라 단어와 가장 비슷한 단어가 무엇인지 확인해볼 수 있다.
en_w2v_model.wv.most_similar 명령어를 통해서 learn과 가장 유사한 단어가 무엇인지 살펴보았다.
가장 유사도가 높은 것은 거의 1에 가깝다. intelling , model, provid 등과 같이 많이 쓰였다는 의미이다.
유사한 단어들의 조합으로도 살펴볼 수 있다.
learn과 deep 2단어와 가장 가까운 위치의 단어들이 나오는 것을 확인할 수 있다.
두 단어의 유사도를 살펴보기 위해선 similarity 명령어를 사용해서 두 단어 사이의 유사도가 어떻게 되는지 확인해볼 수 있다.
04. tsne로 시각화
# TSNE Visualization
def tsne_plot(model):
labels = []
tokens = []
for word in model.wv.key_to_index:
tokens.append(model.wv[word])
labels.append(word)
tsne_model = TSNE(perplexity=30, n_components=2, init='random', n_iter=250, random_state=23)
new_values = tsne_model.fit_transform(tokens)
x = []
y = []
for value in new_values:
x.append(value[0])
y.append(value[1])
plt.figure(figsize=(16, 16))
for i in range(len(x)):
plt.scatter(x[i], y[i])
plt.annotate(labels[i],
xy=(x[i], y[i]),
xytext=(5, 2),
textcoords='offset points',
ha='right',
va='bottom')
plt.show()
단어의 이름을 저장하는 labels, 단어의 값을 tokens에 저장하도록 변수를 정해주었다.
모델링한 값을 token에 넣어주고 단어는 labels에 넣어주도록 하는 반복문을 거친다.
이후 TSNE 명령어를 통해서 시각화를 모델링이 되는데 자세한 설명은 아래의 링크를 참고하자.
tsne_plot(en_w2v_model)
모델 결과를 확인해보면 이러한 좌표가 나오게 된다. 2차원에 의해서 몰려있게 보이게 된다. 좀 떨어진 데이터들은 특정한 논문에서 쓰이는 단어라는 것을 확인 할 수 있다.
수십만개의 데이터라면 전체적으로 퍼져있는 값으로 확인이 될 것이다.
tsne_model = TSNE(perplexity=30, n_components=2, init=’random’, n_iter=250, random_state=23)
위의 코드 중에서 해당 부분의 n_iter 값을 250에서 1000으로 바꾸고 한번더 확인해보자.
이런 식으로 학습을 반복을 하면서 관계가 더 강하게 그려진다. 그리고 데이터가 작기 때문에 더 편향적인 형태를 띄게 된다.
해서 연구자는 다양한 옵션 값들을 바꿔가면서 확인해볼 필요가 있다.
댓글남기기