我会假设您不想使用 gensim,而更愿意坚持使用 tensorflow。在这种情况下,我将提供两种选择
选项 1 - Tensorboard:
如果您只是从探索的角度尝试这样做,我建议您使用 Tensorboard 的嵌入可视化器来搜索最接近的嵌入。它提供了一个很酷的界面,您可以使用余弦距离和欧几里德距离以及一定数量的邻居。
Link to Tensorflow documentation
选项 2 - 直接计算
在 word2vec_basic.py 文件中,有一个他们如何计算最接近单词的示例,如果您稍微弄乱了该函数,您可以继续使用它。在图表本身中可以找到以下内容:
# Compute the cosine similarity between minibatch examples and all embeddings.
norm = tf.sqrt(tf.reduce_sum(tf.square(embeddings), 1, keep_dims=True))
normalized_embeddings = embeddings / norm
valid_embeddings = tf.nn.embedding_lookup(
normalized_embeddings, valid_dataset)
similarity = tf.matmul(
valid_embeddings, normalized_embeddings, transpose_b=True)
然后,在训练期间(每 10000 步),他们运行下一段代码(在会话处于活动状态时)。当他们调用 similarity.eval() 时,它会得到图中相似张量的字面 numpy 数组评估。
# Note that this is expensive (~20% slowdown if computed every 500 steps)
if step % 10000 == 0:
sim = similarity.eval()
for i in xrange(valid_size):
valid_word = reverse_dictionary[valid_examples[i]]
top_k = 8 # number of nearest neighbors
nearest = (-sim[i, :]).argsort()[1:top_k+1]
log_str = "Nearest to %s:" % valid_word
for k in xrange(top_k):
close_word = reverse_dictionary[nearest[k]]
log_str = "%s %s," % (log_str, close_word)
print(log_str)
如果您想为自己调整它,您将不得不做一些技巧,将reverse_dictionary[valid_examples[i]] 更改为您想要为其获取 k 最接近单词的单词/单词 idxs。