我正在构建一个程序,为文本描述分配多个标签/标签。我使用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)
的数组
请注意,
Doc2Vec
为您提供的每个tag
学习向量。如果需要为每个文档指定一个唯一的向量,那么应该为每个文档指定一个唯一的ID标记。你知道吗另一方面,如果您有1000个文档,但它们只重用100个标记,
Doc2Vec
只学习100个标记向量。基本上,所有用同一标签提交的文本都被视为一个单一的、组合的虚拟文档,即使它们是分开传递的。你知道吗(您可以使用这些合并文档进行训练,但之后使用
infer_vector()
为每个文本推断新的唯一向量,而不是查找在批量训练中学习的向量。)另外,请注意,大多数已发表的
Doc2Vec
工作使用10个或更多的培训时段。而且,特别是对于较小的微粒(在文档计数或文本的典型大小中),更多的epochs
会有帮助。但是调用Doc2Vec
的方式将使用其默认的epochs=5
(从与Word2Vec
共享的代码继承)。你知道吗我认为您误解了
tags
字段表示的内容,因为您似乎暗示您的一些文档共享标记,但您希望每个文档有一个向量。标记主要用于索引文档,建议每个文档都有其唯一的标记ID根据文件:
这是因为doc2vec每个标签学习一个向量,而doc2vec的典型用例需要每个文档学习一个向量。该算法将共享标签的两个文档有效地处理为一分为二的文档。你知道吗
在您的例子中,您可以使用
i
作为文档标记,或者如果您的文本列表变得太大而无法一次保存在内存中,那么您可以使用更复杂的方法来轻松地从硬盘中检索相关文件。你知道吗相关问题 更多 >
编程相关推荐