57

如何使用 Doc2vec 获取两个文本文档的文档向量?我是新手,所以如果有人能指出我正确的方向/帮助我提供一些教程,那将会很有帮助

我正在使用gensim。

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:“列表”对象没有属性“单词”

每当我运行这个。

4

4 回答 4

45

如果要训练 Doc2Vec 模型,您的数据集需要包含单词列表(类似于 Word2Vec 格式)和标签(文档 ID)。它还可以包含一些附加信息(有关更多信息,请参阅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]

更新(如何在 epochs 中训练):这个例子已经过时了,所以我删除了它。有关时代训练的更多信息,请参阅此答案或@gojomo 的评论。

于 2016-09-05T11:01:09.423 回答
36

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

然而,@bee2502 是对的

docvec = model.docvecs[99] 

它应该是训练模型的第 100 个向量的值,它适用于整数和字符串。

于 2015-10-28T23:21:45.040 回答
27
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' object has no attribute 'words' 因为 Doc2vec() 的输入文档不是正确的 LabeledSentence 格式。我希望下面的示例可以帮助您理解格式。

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

更多细节在这里:http : //rare-technologies.com/doc2vec-tutorial/ 但是,我通过使用 TaggedLineDocument() 从文件中获取输入数据解决了这个问题。
文件格式:一份文档 = 一行 = 一个 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 是我们想要的向量的文档 ID。如果标签是整数格式(默认情况下,如果您使用 TaggedLineDocument() 加载),请像我一样直接使用整数 id。如果标签是字符串格式,请使用“SENT_99”。这类似于 Word2vec

于 2015-07-09T18:19:46.127 回答
0
from gensim.models.doc2vec import Doc2Vec, TaggedDocument 
Documents = [TaggedDocument(doc, [i]) for i, doc in enumerate(doc1)]
Model = Doc2Vec(Documents, other parameters~~)

这应该可以正常工作。您需要为训练doc2vec模型标记文档。

于 2019-04-25T01:29:39.260 回答