Word2vec - 获取最近的单词

12

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

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

但是在训练模型时是否创建了数据结构(例如字典),允许访问最接近给定词的最近n个单词?例如,如果word2vec生成以下图像:

enter image description here

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

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

3个回答

14
这种方法通常适用于word2vec。如果你能够像Google/GloVe词向量一样将word2vec保存在文本/二进制文件中,那么你所需要的就是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]

然而,这将搜索所有单词以给出结果,但是有近似最近邻(ANN),可以更快地给出结果,但准确性会有所降低。在最新的gensim中,使用annoy执行ANN,请参见此notebooks获取更多信息。Flann是另一个用于近似最近邻的库。

5
我会假设您不想使用gensim,并希望坚持使用tensorflow。在这种情况下,我将提供两个选项:

选项1-Tensorboard:

如果您只是从探索的角度尝试此操作,则建议使用Tensorboard的嵌入可视化器来搜索最接近的嵌入。它提供了一个很酷的界面,您可以使用余弦和欧几里得距离以及一组邻居。

Tensorboard's embedding visualizer

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)

接着,在训练过程中(每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个最接近单词的单词索引。


2

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

similar_by_word 方法需要 3 个参数:

  1. 输入单词
  2. n - 返回前 n 个相似的单词(可选,默认值为 10)
  3. restrict_vocab(可选,默认值为 None)

示例

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接