PART3:將距離相近的詞以視覺化呈現
- 選擇要呈現在二維平面上的字詞們(建議可以先選擇種類不同的字詞,在二維平面做視覺化的分佈會分得較開):
# 選擇你想丟進去的字詞
# 顯示空間距離相近的詞
# 放入字詞: '寶寶'
indexes = model.cosine(u'寶寶')
for index in indexes[0]:
print model.vocab[index]
# Result
寶寶的
小寶寶
孩子
準媽媽
寶寶在
胎兒
媽媽們
小孩
小孩子
媽媽
# 放入字詞: '打車'
indexes = model.cosine(u'打車')
for index in indexes[0]:
print model.vocab[index]
# Result
坐車
開車
坐火車
買票
下車
買菜
上車
搭車
乘車
騎車
# 放入字詞: '楊冪'
indexes = model.cosine(u'楊冪')
for index in indexes[0]:
print model.vocab[index]
# Result
姚晨
林心如
穎兒
張智霖
劉愷威
馮紹峰
鄧超
周迅
柳岩
李晨
# 放入字詞: '騰訊'
indexes = model.cosine(u'騰訊')
for index in indexes[0]:
print model.vocab[index]
# Result
網易
新浪
百度
優酷
搜狗
凡客
窩窩團
電商
愛奇藝
百視通
將要視覺化的五組字詞,找出其相近詞後 append 起來成 array 形式:
# 在高維向量空間(k=300)找出與所選字詞距離最接近的前10名
index1,metrics1 = model.cosine(u'畢業')
index2,metrics2 = model.cosine(u'寶寶')
index3,metrics3 = model.cosine(u'打車')
index4,metrics4 = model.cosine(u'楊冪')
index5,metrics5 = model.cosine(u'騰訊')
# 所選字詞
index01 = np.where(model.vocab == u'畢業')
index02 = np.where(model.vocab == u'寶寶')
index03 = np.where(model.vocab == u'打車')
index04 = np.where(model.vocab == u'楊冪')
index05 = np.where(model.vocab == u'騰訊')
# 將所選字詞與其最接近之前10名合併
index1 = np.append(index1,index01)
index2 = np.append(index2,index02)
index3 = np.append(index3,index03)
index4 = np.append(index4,index04)
index5 = np.append(index5,index05)
接下來,將上述高維空間的向量,變成二維平面:
import numpy as np
# 視覺化套件
import matplotlib
import matplotlib.pyplot as plt
# 主成分因子
from sklearn.decomposition import PCA
為什麼需要做 PCA?
PCA ( Principal Component Analysis ) 是一種常用的數據分析方法。PCA 通過線性變換將原始數據變換為一組各維度線性無關的表示,可用於提取數據的主要特徵分量,常用於高維數據的降維。若想了解數學原理及更詳細的介紹可以看這裡。
PCA 降維示意圖:
Principal Component Analysis using truncated SVD# 引入上述將文章斷詞後轉為300維向量的資料
rawWordVec = model.vectors
# 將原本300維向量空間降為2維
X_reduced = PCA(n_components=2).fit_transform(rawWordVec)
視覺化呈現步驟:
# 須先下載wqy-microhei.ttc,因中文顯示需做特殊處理
zhfont = matplotlib.font_manager.FontProperties(fname='/Users/youngmihuang/Downloads/wqy-microhei.ttc')
# 畫圖
fig = plt.figure()
ax = fig.add_subplot(111)
for i in index1:
ax.text(X_reduced[i][0],X_reduced[i][1],model.vocab[i], fontproperties=zhfont,color='C3')
for i in index2:
ax.text(X_reduced[i][0],X_reduced[i][1],model.vocab[i], fontproperties = zhfont,color= 'C1')
for i in index3:
ax.text(X_reduced[i][0],X_reduced[i][1],model.vocab[i], fontproperties=zhfont,color='C7')
for i in index4:
ax.text(X_reduced[i][0],X_reduced[i][1],model.vocab[i], fontproperties=zhfont,color='C0')
for i in index5:
ax.text(X_reduced[i][0],X_reduced[i][1],model.vocab[i], fontproperties=zhfont,color='C4')
ax.axis([0,0.5,-0.2,0.6])
plt.figure(figsize=(60,60))
plt.show()
結果如下:
透過各個相近群的字詞以不同顏色標記之後,可以看到各字詞群組之間相對都蠻聚合的,但因為他們是從 300 維空間當中投射至 2 維空間,「打車」和「騰訊」這兩組相近字(灰色、紫色)在視覺上看起來跟其他重疊性很高,若把它們移除結果如下: