Tensorflow word2vec-获取最近的单词

Tensorflow word2vec-获取最近的单词,tensorflow,word2vec,Tensorflow,Word2vec,阅读tensorflow word2vec模型输出如何输出与特定单词相关的单词 阅读src:可以查看图像的打印方式 但是,作为训练模型的一部分,是否创建了一个数据结构(如字典),允许访问离给定单词最近的n个单词? 例如,如果word2vec生成图像: 图像src: 在这幅图中,单词“to,he,it”包含在同一个簇中,是否有一个函数作为输入“to”并输出“he,it”(在本例中n=2)?这种方法通常适用于word2vec。如果您可以将word2vec保存在文本/二进制文件中,如google/W

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

阅读src:可以查看图像的打印方式

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

图像src:


在这幅图中,单词“to,he,it”包含在同一个簇中,是否有一个函数作为输入“to”并输出“he,it”(在本例中n=2)?

这种方法通常适用于word2vec。如果您可以将word2vec保存在文本/二进制文件中,如google/WordVector。那么你所需要的就是这个

要安装:

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]
然而,这将搜索所有单词以给出结果,有一种近似最近邻(ANN),它将更快地给出结果,但在准确性上需要权衡

在最新的gensim中,用于执行ANN,请参阅此以了解更多信息

获取并使用
gensim.models.Word2Vec
模型上的方法

similor\u by\u word
采用3个参数

  • 输入字
  • n-用于前n个类似单词(可选,默认值=10)
  • restrict_vocab(可选,默认值=无)
  • 示例

    import gensim, nltk
    
    class FileToSent(object):
       """A class to load a text file efficiently """   
        def __init__(self, filename):
            self.filename = filename
            # To remove stop words (optional)
            self.stop = set(nltk.corpus.stopwords.words('english'))
    
        def __iter__(self):
            for line in open(self.filename, 'r'):
                ll = [i for i in unicode(line, 'utf-8').lower().split() if i not in self.stop]
                yield ll
    
    然后根据您输入的句子(句子文件.txt)


    我假设您不想使用gensim,而更愿意使用tensorflow。在这种情况下,我将提供两种选择

    选项1-张力板: 如果您只是试图从探索的角度来做这件事,我建议使用Tensorboard的嵌入可视化工具来搜索最近的嵌入。它提供了一个很酷的界面,您可以使用余弦距离和欧几里得距离与一组邻居

    选项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\u dictionary[valid\u examples[i]]
    来做一些调整,使之成为你想要获得k-最近单词的单词/单词idx

    # 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)