NLP 系列 - Tensorboard 視覺化 word2vec 詞向量

How to use tensorboard(Embedding Projector) to visualize/project word2vec model?

word2vec 的應用已經相當的的普及,但是該模型為向量組成,充滿了一般人腦袋不可理解的維度與空間,在應用解釋時(給老闆、業務、行銷與客戶)其實蠻困擾的。此文章將利用 Tensorboard(Embedding Projector) 將模型的向量投射到多維空間中,可以清晰地看得出詞與詞之間的相依關係,來解決上述問題。

在本範例你會學到:

  • 如何使用 tensorboard
  • 將 word2vec 詞向量視覺化

在本範例你需要先準備好:

  • word2vec model (本篇不贅述該如何產生一個 word2vec model,若有需要的留言讓我知道)
  • 注意:本範例會有一點 Tensorflow 的用法,不懂也不會影響使用。

1.套件準備

在自己喜歡的環境內使用安裝以下套件,基本上就是 tensorflowgensimnumpy,版本之間的衝突問題請依照自己環境選擇版本,網路上相關範本已經很多了:

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.binmed250.model.bin.trainables.syn1neg.npymed250.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

啟動Tensorboard

一開始會進入我們程式建立的 graphic 畫面

初始畫面

選擇右上方下拉選單,點擊 projector

選擇 projector

系統將會開始載入,這會花一些時間,如果是在本機嘗試這個專案的朋友們請注意自己機器的 memory 大小,若不夠用可以將自己的 model 切小一點來嘗試

載入畫面

看到一坨藍藍的點點就是成功了

載入成功

維度太多其實很難看到什麼,所以可以利用右側的篩選像是 zoom in 的功能。

EX:我在 Search 輸入 新北市且選擇 by label後,再點擊 isolate xx point,就可以看到新北市其相關的字詞的距離

Zoon in 側邊功能

其他相關的按鈕與功能我認為蠻直覺的,我就不特別說明了,但如果有需要解釋也請讓我知道!

參考資料

https://eliyar.biz/using-pre-trained-gensim-word2vector-in-a-keras-model-and-visualizing/

以上為簡略的說明,若有疑問請在留言區發問,若是文章有幫助到你也可以讓我知道。


 上一篇
keras系列 - keras model部署與序列化於spark進行預測 keras系列 - keras model部署與序列化於spark進行預測
How to serialize keras model and apply to all workers on spark?Keras 先天設計上無法序列化 (serialize),只能在單機上使用 (利用cpu 或 gpu)。但我又有需
2019-11-29
下一篇 
pyspark 系列 - 在 lit 中使用 Array(Arraylist) 教學 pyspark 系列 - 在 lit 中使用 Array(Arraylist) 教學
How to pass array to pyspark lit function?在本範例你會學到: 如何使用 lit 函式 將 array 傳給 lit 解決以下問題 py4j.protocol.Py4JJavaError: An
2019-11-26
  目錄