小説を読もうの累計ランキングをDoc2Vecで解析する その4

小説を読もうの累計ランキングをDoc2Vecで解析する その3の続き。

今回はこれまで解析した特徴を表にプロットして可視化してみる。2次元の表にプロットするために、t-SNEを使用し次元を削減する。

t-SNEによる次元圧縮

import numpy as np
import matplotlib.pyplot as plt
from gensim.models.doc2vec import Doc2Vec
from sklearn.manifold import TSNE

# 学習済みモデルを読み込む
m = Doc2Vec.load('drive/My Drive/Colab Notebooks/syosetu/doc2vec.model')
weights = []
for i in range(0, len(m.docvecs)):
  weights.append(m.docvecs[i].tolist())
weights_tuple = tuple(weights)
X = np.vstack(weights_tuple)

# t-SNEで次元圧縮する
tsne_model = TSNE(n_components=2, random_state=0, verbose=2)
np.set_printoptions(suppress=True)
t_sne = tsne_model.fit_transform(X)

# クラスタリング済みのデータを読み込む
with open('drive/My Drive/Colab Notebooks/syosetu/novel_cluster.csv', 'r') as f:
  reader = csv.reader(f)
  clustered = np.array([row for row in reader])
  clustered = clustered.astype(np.dtype(int).type)
  clustered = clustered[np.argsort(clustered[:, 0])]
  clustered = clustered.T[1]

# グラフ描画
fig, ax = plt.subplots(figsize=(10, 10), facecolor='w', edgecolor='k')

# Set Color map
cmap = plt.get_cmap('Dark2')

for i in range(t_sne.shape[0]):
  cval = cmap(clustered[i] / 4)
  ax.scatter(t_sne[i][0], t_sne[i][1], marker='.', color=cval)
  ax.annotate(i, xy=(t_sne[i][0], t_sne[i][1]), color=cval)
plt.show()

実行すると以下のようなグラフになった。満遍なく分布しているが同じクラスターの小説についてはある程度まとまって分布しているように見える。

続いて3次元のグラフを描画してくれる良いページがあるので使ってみる。

Embedding projector – visualization of high-dimensional data

上記のサイトで次元圧縮を行ってくれるので、こちらはTSV形式のデータを用意するだけで良い。

!pip install gensim torch tensorboardX

from torch import FloatTensor
from gensim.models import KeyedVectors
from tensorboardX import SummaryWriter

m = KeyedVectors.load('drive/My Drive/Colab Notebooks/syosetu/doc2vec.model')
weights = []
labels = []
for i in range(0, len(m.docvecs)):
  weights.append(m.docvecs[i].tolist())
  labels.append(m.docvecs.index_to_doctag(i))

# DEBUG: visualize vectors up to 1000
weights = weights[:1000]
labels = labels[:1000]

writer = SummaryWriter()
writer.add_embedding(FloatTensor(weights), metadata=labels)

実行すると「/content/runs/実行日付等/00000/default」にtensors.tsvとmetadata.tsvファイルが保存される。このファイルをEmbedding Projectorのページにアップロードする。
このままではどの点がどの小説を表しているかわかりずらいので、metadata.tsvを加工してタイトルが表示されるようにする。

とても見やすいけれども、第1から第3主成分までの累積寄与率が14%ほどしかないので、PCAにて次元圧縮したこのグラフは残念ながら殆どあてにならない。PCA以外にも先ほど使用したt-SNEを使用することも可能。

まとめ

もう少しきれいなグラフが描けるように、ライブラリの使い方から勉強しなおす。

小説を読もうの累計ランキングをDoc2Vecで解析する その5へ続く。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です