如何将word2vec导入TensorFlow Seq2Seq模型?

时间:2016-03-17 22:15:32

标签: python tensorflow

我正在使用Tensorflow序列进行序列翻译模型。我想知道我是否可以将自己的word2vec导入此模型?而不是使用教程中提到的原始“密集表示”。

从我的观点来看,它看起来TensorFlow正在使用seq2seq模型的One-Hot表示。首先,对于函数tf.nn.seq2seq.embedding_attention_seq2seq,编码器的输入是标记符号,例如, 'a'将为'4'而'dog'将为'15715'等,并且需要num_encoder_symbols。所以我认为它让我提供单词的位置和单词的总数,然后函数可以用One-Hot表示来表示单词。我还在学习源代码,但很难理解。

有人可以就上述问题给我一个想法吗?

2 个答案:

答案 0 :(得分:2)

seq2seq embedding_ *函数确实创建了与word2vec非常类似的嵌入矩阵。它们是一个名为sth的变量:

  

EMBEDDING_KEY =“embedding_attention_seq2seq / RNN / EmbeddingWrapper / embedding”

知道这一点,你可以修改这个变量。我的意思是 - 以某种格式获取你的word2vec向量,比如一个文本文件。假设你在model.vocab中有你的词汇,你可以用下面的片段说明的方式分配阅读向量(它只是一个片段,你必须改变它才能使它工作,但我希望它能显示出这个想法)

   vectors_variable = [v for v in tf.trainable_variables()
                        if EMBEDDING_KEY in v.name]
    if len(vectors_variable) != 1:
      print("Word vector variable not found or too many.")
      sys.exit(1)
    vectors_variable = vectors_variable[0]
    vectors = vectors_variable.eval()
    print("Setting word vectors from %s" % FLAGS.word_vector_file)
    with gfile.GFile(FLAGS.word_vector_file, mode="r") as f:
      # Lines have format: dog 0.045123 -0.61323 0.413667 ...
      for line in f:
        line_parts = line.split()
        # The first part is the word.
        word = line_parts[0]
        if word in model.vocab:
          # Remaining parts are components of the vector.
          word_vector = np.array(map(float, line_parts[1:]))
          if len(word_vector) != vec_size:
            print("Warn: Word '%s', Expecting vector size %d, found %d"
                     % (word, vec_size, len(word_vector)))
          else:
            vectors[model.vocab[word]] = word_vector
    # Assign the modified vectors to the vectors_variable in the graph.
    session.run([vectors_variable.initializer],
                {vectors_variable.initializer.inputs[1]: vectors})

答案 1 :(得分:1)

我猜想马修提到的范围风格,你可以得到变量:

 with tf.variable_scope("embedding_attention_seq2seq"):
        with tf.variable_scope("RNN"):
            with tf.variable_scope("EmbeddingWrapper", reuse=True):
                  embedding = vs.get_variable("embedding", [shape], [trainable=])

另外,我想你也想将嵌入注入到解码器中,它的关键(或范围)就像是:

  

“embedding_attention_seq2seq / embedding_attention_decoder /嵌入”

感谢您的回答,Lukasz!

我想知道,代码段<b>model.vocab[word]</b>中究竟是什么代表?只是词汇中词的位置?

在这种情况下,迭代词汇表并为w2v模型中存在的单词注入w2v向量不会更快。