word2vec - 得到最近的单词

时间:2016-10-16 19:18:01

标签: tensorflow word2vec

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

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

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

enter image description here

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

在此图片中,单词“to,he,it'包含在同一个集群中,是否有一个函数作为输入'到'输出'他,它' (在这种情况下,n = 2)?

3 个答案:

答案 0 :(得分:9)

这种方法一般适用于word2vec。如果你可以将word2vec保存在文本/二进制文件中,如google / GloVe word vector。那么你需要的只是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.

答案 1 :(得分:2)

我会假设您不想使用gensim,并且更愿意坚持使用tensorflow。在这种情况下,我会提供两个选项

选项1 - Tensorboard:

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

Tensorboard's embedding visualizer

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个最接近的单词的单词/单词idx。

答案 2 :(得分:1)

获取gensim并在gensim.models.Word2Vec型号上使用similar_by_word方法。

similar_by_word需要3个参数,

  1. 输入字
  2. n - 对于前n个相似的单词(可选,默认= 10)
  3. restrict_vocab(可选,默认=无)
  4. 示例

    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
    

    然后根据你输入的句子(sentence_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)