Gensim Doc2Vec:生成的向量少于预期

2024-10-03 09:13:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在构建一个程序,为文本描述分配多个标签/标签。我使用Gensim的Doc2Vec对每个文本描述进行矢量化。然而,当我打印出Doc2Vec模型向量的长度时,它返回不同标签的数量,而不是描述的数量。换句话说,它返回表示标记的向量,而不是表示文档的向量。当我尝试拆分数据(使用sklearn)时,这不可避免地会导致ValueError:

ValueError: Found input variables with inconsistent numbers of samples: [64, 8370]

下面是我的代码:

textList = []

for i in range(0, len(unformattedText)):
    text = unformattedText[i]
    tag = tagList[i]
    textList.append(TaggedDocument(words=text.split(" "), tags=[tag]))

numCores = multiprocessing.cpu_count() 
model = Doc2Vec(textList, workers=numCores, vector_size=100)

docVectors = []
for j in range(0, len(model.docvecs)):
    docVectors.append(model.docvecs[j])
x = docVectors

vectorizer2 = MultiLabelBinarizer()
vectorizer2.fit(tagList)
y = vectorizer2.transform(tagList)

xTrain, xTest, yTrain, yTest = train_test_split(x, y, test_size=0.20)

变量维度:x是长度为64和y.shape = (8370, 24)的数组


Tags: in文本for数量modellenrange标签
2条回答

请注意,Doc2Vec为您提供的每个tag学习向量。如果需要为每个文档指定一个唯一的向量,那么应该为每个文档指定一个唯一的ID标记。你知道吗

另一方面,如果您有1000个文档,但它们只重用100个标记,Doc2Vec只学习100个标记向量。基本上,所有用同一标签提交的文本都被视为一个单一的、组合的虚拟文档,即使它们是分开传递的。你知道吗

(您可以使用这些合并文档进行训练,但之后使用infer_vector()为每个文本推断新的唯一向量,而不是查找在批量训练中学习的向量。)

另外,请注意,大多数已发表的Doc2Vec工作使用10个或更多的培训时段。而且,特别是对于较小的微粒(在文档计数或文本的典型大小中),更多的epochs会有帮助。但是调用Doc2Vec的方式将使用其默认的epochs=5(从与Word2Vec共享的代码继承)。你知道吗

我认为您误解了tags字段表示的内容,因为您似乎暗示您的一些文档共享标记,但您希望每个文档有一个向量。标记主要用于索引文档,建议每个文档都有其唯一的标记ID

根据文件:

Tags may be one or more unicode string tokens, but typical practice (which will also be the most memory-efficient) is for the tags list to include a unique integer id as the only tag.

这是因为doc2vec每个标签学习一个向量,而doc2vec的典型用例需要每个文档学习一个向量。该算法将共享标签的两个文档有效地处理为一分为二的文档。你知道吗

在您的例子中,您可以使用i作为文档标记,或者如果您的文本列表变得太大而无法一次保存在内存中,那么您可以使用更复杂的方法来轻松地从硬盘中检索相关文件。你知道吗

相关问题 更多 >