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
啟動Tensorboard

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

初始畫面
初始畫面

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

選擇 projector
選擇 projector

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

載入畫面
載入畫面

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

載入成功
載入成功

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

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

Zoon in 側邊功能
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
GitHub
與我聯絡
GitHub
與我聯絡