Doc2vec:如何获取文档向量

如何使用Doc2vec获取两个文本文档的文档向量? 我对此很陌生,所以如果有人能指出我正确的方向/帮助我一些教程将是有帮助的

我正在使用gensim python库。

doc1=["This is a sentence","This is another sentence"] documents1=[doc.strip().split(" ") for doc in doc1 ] model = doc2vec.Doc2Vec(documents1, size = 100, window = 300, min_count = 10, workers=4) 

我得到AttributeError:“列表”对象没有属性的话“每当我运行这个

Gensim已更新 。 LabeledSentence的语法不包含标签 。 现在有标签 – 请参阅LabeledSentence的文档https://radimrehurek.com/gensim/models/doc2vec.html

不过,@ bee2502是对的

 docvec = model.docvecs[99] 

它应该是训练模型的第100个vector的值,它使用整数和string。

如果您想培养Doc2Vec模型,您的数据集需要包含单词列表(类似于Word2Vec格式)和标签(文档编号)。 它也可以包含一些额外的信息(更多信息请参阅https://github.com/RaRe-Technologies/gensim/blob/develop/docs/notebooks/doc2vec-IMDB.ipynb )。

 # Import libraries from gensim.models import doc2vec from collections import namedtuple # Load data doc1 = ["This is a sentence", "This is another sentence"] # Transform data (you can add more data preprocessing steps) docs = [] analyzedDocument = namedtuple('AnalyzedDocument', 'words tags') for i, text in enumerate(doc1): words = text.lower().split() tags = [i] docs.append(analyzedDocument(words, tags)) # Train model (set min_count = 1, if you want the model to work with the provided example data set) model = doc2vec.Doc2Vec(docs, size = 100, window = 300, min_count = 1, workers = 4) # Get the vectors model.docvecs[0] model.docvecs[1] 

更新(如何在时代训练):Doc2Vec函数包含alphamin_alpha参数,但这意味着学习速率衰减在一个时期从alphamin_alpha 。 要训​​练多个时代,请手动设置学习率,如下所示:

 from gensim.models import doc2vec import random alpha_val = 0.025 # Initial learning rate min_alpha_val = 1e-4 # Minimum for linear learning rate decay passes = 15 # Number of passes of one document during training alpha_delta = (alpha_val - min_alpha_val) / (passes - 1) model = doc2vec.Doc2Vec( size = 100 # Model initialization , window = 300 , min_count = 1 , workers = 4) model.build_vocab(docs) # Building vocabulary for epoch in range(passes): # Shuffling gets better results random.shuffle(docs) # Train model.alpha, model.min_alpha = alpha_val, alpha_val model.train(docs) # Logs print('Completed pass %i at alpha %f' % (epoch + 1, alpha_val)) # Next run alpha alpha_val -= alpha_delta 
 doc=["This is a sentence","This is another sentence"] documents=[doc.strip().split(" ") for doc in doc1 ] model = doc2vec.Doc2Vec(documents, size = 100, window = 300, min_count = 10, workers=4) 

我得到了AttributeError:'list'对象没有属性'words',因为Doc2vec()的input文档不是正确的LabeledSentence格式。 我希望下面的例子能帮助你理解格式。

 documents = LabeledSentence(words=[u'some', u'words', u'here'], labels=[u'SENT_1']) 

更多细节在这里: http ://rare-technologies.com/doc2vec-tutorial/然而,我通过使用TaggedLineDocument()从文件input数据解决了这个问题。
文件格式:一个文件=一行=一个TaggedDocument对象。 预计单词已经被预处理并被空白分隔,标签从文档行号自动构造。

 sentences=doc2vec.TaggedLineDocument(file_path) model = doc2vec.Doc2Vec(sentences,size = 100, window = 300, min_count = 10, workers=4) 

获取文档向量:您可以使用docvecs。 更多详细信息,请访问: https : //radimrehurek.com/gensim/models/doc2vec.html#gensim.models.doc2vec.TaggedDocument

 docvec = model.docvecs[99] 

其中99是我们想要的vector的文档ID。 如果标签是整数格式(默认情况下,如果使用TaggedLineDocument())加载,则直接使用像我一样的整数id。 如果标签是string格式,则使用“SENT_99”。这与Word2vec类似