How to use tensorboard(Embedding Projector) to visualize/project word2vec model?
word2vec 的應用已經相當的的普及,但是該模型為向量組成,充滿了一般人腦袋不可理解的維度與空間,在應用解釋時(給老闆、業務、行銷與客戶)其實蠻困擾的。此文章將利用 Tensorboard(Embedding Projector) 將模型的向量投射到多維空間中,可以清晰地看得出詞與詞之間的相依關係,來解決上述問題。
在本範例你會學到:
- 如何使用 tensorboard
- 將 word2vec 詞向量視覺化
在本範例你需要先準備好:
- word2vec model (本篇不贅述該如何產生一個 word2vec model,若有需要的留言讓我知道)
- 注意:本範例會有一點
Tensorflow
的用法,不懂也不會影響使用。
1.套件準備
在自己喜歡的環境內使用安裝以下套件,基本上就是 tensorflow
、gensim
、numpy
,版本之間的衝突問題請依照自己環境選擇版本,網路上相關範本已經很多了:
numpy==1.17.3
tensorboard==1.15.0
tensorflow==1.15.0
tensorflow-estimator==1.15.1
gensim==3.8.1
2.載入 word2vec 模型
log_dir
: Log 要存擋的地方model_dir
: word2vec model 放置的地方(已經提前將模型放到該路徑下med250.model.bin
、med250.model.bin.trainables.syn1neg.npy
、med250.model.bin.wv.vectors.npy
)metadata_name
: 要存下模型中的字詞對照model_file
: med250.model.bin 所在位置
import numpy as np
import tensorflow as tf
import os
from gensim.models.word2vec import Word2Vec
from tensorflow.contrib.tensorboard.plugins import projector
import subprocess
log_dir = '/home/word2vec_model/embedding_log_demo'
model_dir = '/home/word2vec_model'
# 若路徑都不存在可以解開註解創立
# if not os.path.exists(log_dir):
# os.mkdir(log_dir)
# os.mkdir(model_dir)
metadata_name = 'metadata.tsv'
# load model
model_file = "/home/word2vec_model/med250.model.bin"
word2vec = Word2Vec.load(model_file)
3.處理向量與原對應字詞
- 第一部分
embedding
: 依順序存下向量 - 第二部分 : 存下每個向量原始的字詞意思(label),存入先前的
metadata_name
# create a list of vectors
embedding = np.empty((len(word2vec.wv.vocab.keys()), word2vec.vector_size), dtype=np.float32)
for i, word in enumerate(word2vec.wv.vocab.keys()):
embedding[i] = word2vec[word]
# write labels
with open(os.path.join(log_dir, metadata_name), 'w') as f:
for word in word2vec.wv.vocab.keys():
f.write(word + '\n')
4.建立 Tensorboard
- 第一部分:設置 session
- 這部分如果已經對
TensorFlow
有初步的瞭解,可以再細部微調更多的東西,如果不懂也沒關係,照抄就好。
- 這部分如果已經對
- 第二部分 : 為
projector
投射/視覺化做準備- 同上,不懂就先照貼就好,名稱與前面的參數一致就行。
# setup a TensorFlow session
tf.reset_default_graph()
sess = tf.InteractiveSession()
X = tf.Variable([0.0], name='embedding')
place = tf.placeholder(tf.float32, shape=embedding.shape)
set_x = tf.assign(X, place, validate_shape=False)
sess.run(tf.global_variables_initializer())
sess.run(set_x, feed_dict={place: embedding})
# create a TensorFlow summary writer
summary_writer = tf.summary.FileWriter(log_dir, sess.graph)
config = projector.ProjectorConfig()
embedding_conf = config.embeddings.add()
embedding_conf.tensor_name = 'embedding:0'
embedding_conf.metadata_path = os.path.join(log_dir, metadata_name)
projector.visualize_embeddings(summary_writer, config)
5.存擋
- 將前面處理好的
session
存擋,以利多次使用。
# save the model
saver = tf.train.Saver()
saver.save(sess, os.path.join(log_dir, "model.ckpt"))
6.啟動 Tensorboard
最後一步就要大功告成了,請開啟 terminal 輸入下方指令(不是在python環境喔),將 logdir
指到前面指定的位置。(可以自己的環境需求加上 --port
)
tensorboard --logdir='/home/word2vec_model/embedding_log_demo/'
Tensorboard 畫面展示
等待一下就會出現要輸入的 url
,畫面為我自己設定了port 1234
的url,請自行更改 host
。
一開始會進入我們程式建立的 graphic 畫面
選擇右上方下拉選單,點擊 projector
系統將會開始載入,這會花一些時間,如果是在本機嘗試這個專案的朋友們請注意自己機器的 memory 大小,若不夠用可以將自己的 model 切小一點來嘗試
看到一坨藍藍的點點就是成功了
維度太多其實很難看到什麼,所以可以利用右側的篩選像是 zoom in
的功能。
EX:我在 Search
輸入 新北市
且選擇 by label
後,再點擊 isolate xx point
,就可以看到新北市其相關的字詞的距離
其他相關的按鈕與功能我認為蠻直覺的,我就不特別說明了,但如果有需要解釋也請讓我知道!
參考資料
https://eliyar.biz/using-pre-trained-gensim-word2vector-in-a-keras-model-and-visualizing/
以上為簡略的說明,若有疑問請在留言區發問,若是文章有幫助到你也可以讓我知道。