Python 주제 분석


수강중

13. 단어 의미의 시각화

단어들의 위치를 시각화해보자.

먼저, plot에서 글자가 겹치지 않도록 조정해주는 adjustText를 사용합니다.

아나콘다 환경에서는 다음과 같이 설치한다.

!conda install -c conda-forge -y adjusttext

pip로는 다음과 같이 설치한다.

!pip install adjusttext

시각화 준비

단어 목록을 불러온다.

import joblib
data = joblib.load('plot.pkl')
words = data['cv'].get_feature_names()

단어들의 좌표를 불러온다.

word_emb = joblib.load('lsa-word.pkl')

좌표를 Normalize 한다.

from sklearn.preprocessing import Normalizer
norm = Normalizer()
norm_emb = norm.fit_transform(word_emb)

시각화

import matplotlib.pyplot as plt
from adjustText import adjust_text

시각화할 단어 목록을 정한다.

target = ['family', 'money', 'war', 'police', 'friend',
          'king', 'queen', 'prince', 'princess', 'father',
          'mother', 'daughter', 'son']

LSA로 만들어낸 주제 중 0번과 1번을 이용해 단어들을 2차원 상에 시각화한다. 먼저 각 단어의 인덱스를 얻는다.

indices = []
for t in target:
    i = words.index(t)
    indices.append(i)

가로, 세로 좌표를 얻는다.

xs = norm_emb[indices, 0]
ys = norm_emb[indices, 1]

시각화한다.

plt.plot(xs, ys, '.')
texts = [plt.text(x, y, t) for x, y, t in zip(xs, ys, target)]
adjust_text(texts)
5

TSNE를 이용한 다차원 시각화

TSNE(t-distributed Stochastic Neighbor Embedding)를 이용하면 단어들의 부분적인 거리 관계를 보존하면서 차원 축소를 할 수 있다.

from sklearn.manifold import TSNE

2차원으로 축소하도록 설정한다.

tsne = TSNE(n_components=2)

norm_emb를 2차원으로 축소한다.

pos = tsne.fit_transform(norm_emb)

가로 세로 좌표를 다시 얻는다.

xs = pos[indices, 0]
ys = pos[indices, 1]

시각화한다.

plt.plot(xs, ys, '.')
texts = [plt.text(x, y, t) for x, y, t in zip(xs, ys, target)]
adjust_text(texts)
39