【问题标题】:word2vec - get nearest wordsword2vec - 获取最近的单词
【发布时间】:2017-02-25 17:31:49
【问题描述】:

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

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

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

图片来源:https://www.tensorflow.org/versions/r0.11/tutorials/word2vec/index.html

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

【问题讨论】:

    标签: tensorflow word2vec


    【解决方案1】:

    这种方法通常适用于 word2vec。如果您可以将 word2vec 保存在文本/二进制文件中,例如 google/GloVe 词向量。那么你需要的只是gensim

    安装:

    Via 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]
    

    但是,这将搜索所有单词以给出结果,但有近似最近邻 (ANN) 可以更快地为您提供结果,但会牺牲准确性。

    在最新的 gensim 中,annoy 用于执行 ANN,有关详细信息,请参阅此 notebooks

    Flann is another library for Approximate Nearest Neighbors.

    【讨论】:

      【解决方案2】:

      我会假设您不想使用 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。

      【讨论】:

        【解决方案3】:

        get @ 987654321和在@ 987654322上使用gensim.models.Word2Vec model。

        similar_by_word需要3个参数

        1. 输入字
        2. n - 对于顶部n类似的单词(可选,默认值= 10)
        3. 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
        

        然后取决于您的输入句子(stound_file.txt),

        sentences = FileToSent('sentence_file.txt')
        model = gensim.models.Word2Vec(sentences=sentences, min_count=2, hs=1)
        print model.similar_by_word('hack', 2) # Get two most similar words to 'hack'
        # [(u'debug', 0.967338502407074), (u'patch', 0.952264130115509)] (Output specific to my dataset)
        

        【讨论】:

          猜你喜欢
          • 2015-08-15
          • 2015-12-21
          • 1970-01-01
          • 2013-06-09
          • 1970-01-01
          • 2017-03-10
          • 1970-01-01
          • 2015-10-05
          • 1970-01-01
          相关资源
          最近更新 更多