word2vec - 得到最近的单词

blu*_*sky 9 word2vec tensorflow

读取tensorflow word2vec模型输出如何输出与特定单词相关的单词?

阅读src:https://github.com/tensorflow/tensorflow/blob/r0.11/tensorflow/examples/tutorials/word2vec/word2vec_basic.py可以查看图像的绘制方式.

但是,是否有一个数据结构(例如字典)作为训练模型的一部分而创建,允许访问最接近给定单词的最近n个单词?例如,如果word2vec生成图像:

在此输入图像描述

image src:https://www.tensorflow.org/versions/r0.11/tutorials/word2vec/index.html

在这个图像中,单词'to,he,it'包含在同一个集群中,是否有一个函数将输入'输出'并输出'he,it'(在这种情况下n = 2)?

Ste*_* Du 9

这种方法一般适用于word2vec.如果你可以将word2vec保存在文本/二进制文件中,如google/GloVe word vector.那你需要的只是gensim.

安装:

通过github

Python代码:

from gensim.models import Word2Vec

gmodel=Word2Vec.load_word2vec_format(fname)
ms=gmodel.most_similar('good',10)
for x in ms:
    print x[0],x[1]
Run Code Online (Sandbox Code Playgroud)

然而,这将搜索所有单词以给出结果,有近似最近邻(ANN),它将更快地给你结果,但在准确性上有折衷.

在最新的gensim,惹恼用于执行人工神经网络,看到这个笔记本电脑了解更多信息.

Flann是近似最近邻居的另一个图书馆.


Nat*_*Raw 5

我假设您不想使用 gensim,并且更愿意坚持使用张量流。在这种情况下,我将提供两种选择

选项 1 - Tensorboard:

如果您只是尝试从探索的角度做到这一点,我建议使用 Tensorboard 的嵌入可视化工具来搜索最接近的嵌入。它提供了一个很酷的界面,您可以对一定数量的邻居使用余弦距离和欧几里德距离。

Tensorboard 的嵌入可视化工具

链接到 Tensorflow 文档

选项 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)
Run Code Online (Sandbox Code Playgroud)

然后,在训练期间(每 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)
Run Code Online (Sandbox Code Playgroud)

如果您想自己调整此设置,则必须进行一些巧妙的更改,将其更改reverse_dictionary[valid_examples[i]]为您想要获取 k 个最接近单词的单词/单词 idx。