Doc2Vec 使用 kmeans 对新文档进行聚类

Doc2Vec Clustering with kmeans for a new document

我有一个使用 Doc2Vec 训练的语料库,如下所示:

d2vmodel = Doc2Vec(vector_size=100, min_count=5, epochs=10)
d2vmodel.build_vocab(train_corpus)
d2vmodel.train(train_corpus, total_examples=d2vmodel.corpus_count, epochs=d2vmodel.epochs)

使用向量,文档聚类为 kmeans:

kmeans_model = KMeans(n_clusters=NUM_CLUSTERS, init='k-means++', random_state = 42)  
X = kmeans_model.fit(d2vmodel.docvecs.vectors_docs)
labels=kmeans_model.labels_.tolist()

我想使用 k-means 对一个新文档进行聚类,并知道它属于哪个聚类。我尝试了以下方法,但我认为 predict 的输入不正确。

from numpy import array
testdocument = gensim.utils.simple_preprocess('Microsoft excel')
cluster_label = kmeans_model.predict(array(testdocument))

感谢任何帮助!

您的 kmeans_model 需要一个与其在原始聚类期间提供的相似的特征向量,而不是您将从 gensim.simple_preprocess() 返回的字符串标记列表。

事实上,您想使用 Doc2Vec 模型通过其 infer_vector() 方法获取此类标记列表并将它们转换为模型兼容的向量。例如:

testdoc_words = gensim.utils.simple_preprocess('Microsoft excel')
testdoc_vector = d2vmodel.infer_vector(testdoc_words)
cluster_label = kmeans_model.predict(array(testdoc_vector))

请注意,Doc2Vec 和推理在至少有几十个单词长的文档(不是像你这里的测试那样的微小的 2 词短语)上工作得更好,而且推理也可能经常受益于使用大于默认值的可选 epochs 参数(尤其是在短文档上)。

另请注意,您的测试文档应该与您的训练数据完全相同地进行预处理和标记化——因此,如果使用其他过程来准备 train_corpus,请对 post 使用相同的过程-培训文件。 (Doc2Vec 模型无法识别的词,因为它们在训练期间不存在,将被默默地忽略——因此在推理时进行不同风格的案例扁平化等错误会大大削弱结果。)