基于word2vec实现deepwalk中的降维可视化问题

 

        在复现deepwalk时,遇到对实验结果降维可视化的问题,使用PCA结果不佳,于是使用T-SNE。

        但是想让不同类型节点用不同颜色表示时没有找到合适的解决方法,最终使用model.wv.similar_by_word('xxx'),再将节点区分颜色实现了想要的效果。

 最终效果如下:

绿色表示所有与space race相似的节点

基于word2vec实现deepwalk中的降维可视化问题_第1张图片

 这里使用的数据集来自:

使用DeepWalk从图中提取特征 - 人工智能遇见磐创 - 博客园 (cnblogs.com)

我只保留了depth为1的所有节点,深度为2,3,4的节点有待讨论。

基于word2vec实现deepwalk中的降维可视化问题_第2张图片

1. 将随机游走序列通过word2vec训练后,找到space exploration的相似节点:

words_exploration = model.wv.similar_by_word('space exploration')

 所有节点的向量放入X中:

X = model.wv.vectors
term2index = model.wv.key_to_index

2.将与 space exploration相似的节点用t-sne降维可视化:

值得注意的是:这里我将所有与space exploration的相似节点降为2维后的向量存放在了sort_x[]和sort_y[]中(sort_x表示x轴,y同理),再进行plt.scatter()。

tsne = TSNE(n_components=2, n_iter=10000)
#将所有节点降为2维
embed_2d = tsne.fit_transform(X)


def plot(sim_words, color, label):
    # 提取相似节点,sim_words是一个[(,),(,)...]形式的list
    first_list = [i[0] for i in sim_words] 
    sort_x = []
    sort_y = []
    # 将所有相似节点的2维向量放进sort_x和sort_y中
    for item in first_list:
        idx = term2index[item]
        sort_x.append(embed_2d[idx, 0])
        sort_y.append(embed_2d[idx, 1])

    plt.scatter(sort_x, sort_y, c=color, label=label)
    #label放在右上角(1,2,3,4对应右上,左上,左下,右下)
    plt.legend(loc=2)


plot(words_race, 'green', 'space race')
plot(words_research, 'red', 'space research')
plot(words_exploration, 'yellow', 'space exploration')
# 注意plt.show不要写在for循环中
plt.show()

存在的问题:model.wv.similar_by_word()没有将所有与space exploration有关的节点提取出来,绘制结果散点图点数过少。

你可能感兴趣的:(word2vec,python)