Skip to main content
 首页 » 编程设计

python之如何将 word2vec 导入 TensorFlow Seq2Seq 模型

2024年08月23日29emanlee

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

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

谁能给我一个关于上述问题的想法?

请您参考如下方法:

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