带有kmeans的Doc2Vec集群用于新文档

时间:2018-12-07 05:19:33

标签: 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)

使用矢量将文档与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均值对一个新文档进行聚类,并知道它属于哪个聚类。我尝试了以下方法,但我认为预测输入不正确。

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

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

您的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单词短语),并且使用较大的推论通常也可以从中受益-than-default可选的epochs参数(尤其是在简短文档上)。

还请注意,您的测试文档应与培训数据进行真正的预处理和完全相同的标记-因此,如果使用其他流程来准备train_corpus,请对培训后的文档使用相同的流程。 (Doc2Vec模型无法识别的单词,因为它们在训练期间不存在,将被静默忽略-因此,在推理时进行不同风格的大小写拼合之类的错误会大大削弱结果。)< / p>

答案 1 :(得分:-1)

首先需要一个doc2vec向量,然后才能将其与KMeans集群进行比较。

arraysimple_preproces不这样做。