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

kam*_*ami 3 cluster-analysis k-means doc2vec

我有一个用 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)
Run Code Online (Sandbox Code Playgroud)

使用向量,文档被聚类为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()
Run Code Online (Sandbox Code Playgroud)

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

from numpy import array
testdocument = gensim.utils.simple_preprocess('Microsoft excel')
cluster_label = kmeans_model.predict(array(testdocument))
Run Code Online (Sandbox Code Playgroud)

任何帮助表示赞赏!

goj*_*omo 6

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))
Run Code Online (Sandbox Code Playgroud)

请注意,Doc2Vec和推理在至少数十个单词长的文档上效果更好(而不是像您在此处的测试那样的微小的 2 个单词短语),并且推理通常也可能受益于使用大于默认值的可选epochs参数(尤其是短文件)。

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