検索結果スクレイピング&doc2vecで企業の業種分類(3)


検索結果スクレイピング&doc2vecで企業の業種分類(1)
検索結果スクレイピング&doc2vecで企業の業種分類(2)
の最終回です。今回は作成したモデルをクラスタリングすべく、デンドログラムを書きます。

今回の構成

gensimのword2vecで語のベクトル表現を作り、その空間を試してみたいを参考にDoc2vecのモデルからベクトル部分を抜き出してグラフ化しました。
最も困ったのは、Doc2vecのモデルにそのattributionはないよ、というエラーが頻発することと、普通に変更しても画像サイズが大きくならないことでした。

ライブラリの読み込み

matplotlibとscipyを使います。

import gensim
import sys
import scipy.spatial.distance
import scipy.cluster.hierarchy
import matplotlib.pyplot as plt
import numpy as np

モデルの読み込み

前回保存したモデルをロードします。

model = gensim.models.word2vec.Word2Vec.load('doc2vec.model')

デンドログラム作成用にデータ成形

  • タグ(ラベル):model.docvecs.doctags に入っています。
  • 中身(ベクトル):model.docvecs['任意のタグ名']で引いてこれます。
  • 単語リスト:model.wv.vocab

ここまでわかればほとんど完成です。
タグのリストを作って、そのリストを元にモデルからベクトルを引き抜いて渡します。

vocnew = list(map(lambda x: x, model.docvecs.doctags))
voc = scipy.cluster.hierarchy.linkage(model.docvecs[vocnew])

出力

scipy.cluster.hierarchy.dendrogram(voc, labels=vocnew, ax=axes[0])
plt.show()

画像サイズの変更

小さすぎて読めないので、画像を大きくしたいですよね。
窓分割してサイズ指定することはできたので以下にコードを書いておきます。他の方法があったら教えてください。

ig, axes = plt.subplots(2, 1, figsize=(30, 15))

size*100ピクセルで画像が出力されます。あまり大きいと重くなるので注意。

おわりに

今回は体系的にまとめたかったのでデンドログラムを使いましたが、このままk-meansに適用することもできます。
企業を表すための変数としても使えるのではないかと思います。そうすると、企業名を明らかにしないままこの企業に紐づく別の変数を利用してモデルを作ったりすることができるようになります。
また何か面白い利用があったらシェアしたいと思います。