将gensim doc2vec嵌入导出到单独的文件中,以便稍后与keras嵌入层一起使用

将gensim doc2vec嵌入导出到单独的文件中,以便稍后与keras嵌入层一起使用,keras,gensim,word-embedding,doc2vec,Keras,Gensim,Word Embedding,Doc2vec,我对gensim有点陌生,现在我正试图解决在keras中使用doc2vec嵌入的问题。我在keras中找不到doc2vec的现有实现——据我所见,到目前为止,在我找到的所有示例中,所有人都只是使用gensim来获取文档嵌入 一旦我在gensim中训练了我的doc2vec模型,我需要以某种方式将嵌入权重从genim导出到keras中,但如何做到这一点还不清楚。我明白了 model.syn0 假定给出了单词2vec的嵌入权重(根据)。但不清楚如何为文档嵌入执行相同的导出。有什么建议吗 我知道,一般

我对gensim有点陌生,现在我正试图解决在keras中使用doc2vec嵌入的问题。我在keras中找不到doc2vec的现有实现——据我所见,到目前为止,在我找到的所有示例中,所有人都只是使用gensim来获取文档嵌入

一旦我在gensim中训练了我的doc2vec模型,我需要以某种方式将嵌入权重从genim导出到keras中,但如何做到这一点还不清楚。我明白了

model.syn0
假定给出了单词2vec的嵌入权重(根据)。但不清楚如何为文档嵌入执行相同的导出。有什么建议吗

我知道,一般来说,我可以直接从gensim模型中获取每个文档的嵌入,但我想稍后对keras中的嵌入层进行微调,因为文档嵌入将作为更大任务的一部分使用,因此它们可能会被微调一点。

我发现了这一点

假设您已经培训了gensim模型并使用字符串标记作为文档ID:

#get vector of doc
model.docvecs['2017-06-24AEON']
#raw docvectors (all of them)
model.docvecs.doctag_syn0
#docvector names in model
model.docvecs.offset2doctag
假设DataFrame df拥有所有文档,您可以将此文档向量导出到keras嵌入层,如下所示。请注意,在嵌入矩阵中,只需传递整数作为输入。我使用dataframe中的原始编号作为文档的id进行输入。另外请注意,嵌入层要求不接触索引0-它是为屏蔽而保留的,所以当我将文档id作为输入传递到我的网络时,我需要确保它大于0

#creating embedding matrix
embedding_matrix = np.zeros((len(df)+1, text_encode_dim))
for i, row in df.iterrows():
    embedding = modelDoc2Vec.docvecs[row['docCode']]
    embedding_matrix[i+1] = embedding

#input with id of document
doc_input = Input(shape=(1,),dtype='int16', name='doc_input')
#embedding layer intialized with the matrix created earlier
embedded_doc_input = Embedding(output_dim=text_encode_dim, input_dim=len(df)+1,weights=[embedding_matrix], input_length=1, trainable=False)(doc_input)
更新 2017年末后,随着Keras 2.0 API的引入,最后一条生产线应改为:

embedded_doc_input = Embedding(output_dim=text_encode_dim, input_dim=len(df)+1,embeddings_initializer=Constant(embedding_matrix), input_length=1, trainable=False)(doc_input)

我的印象是,
keras.layers.Embedding
with
weights
的格式不受欢迎。如果您检查这个()和这个()@PoeteMaudit,您是对的,它会有一些变化。现在最后一行不是权重=[embedding\u matrix],我们应该做embeddings\u initializer=常量(embedding\u matrix)。更新了答案,谢谢你的noteCool(upvote)。老实说,我没有测试
weights
参数当前是否有效。我刚刚看到这个人的帖子,他声称它不起作用。可能是
weights
参数仍然有效?我无法理解
Input(shape=(1,),dtype='int16',name='doc\u Input')一行中的
Input
是什么内容,只是文档列表中的一个行号。因此,我在数据帧中为我的网络提供文件的整数id——嵌入比根据文件的整数is提取所需的嵌入要晚