使用kmeans对新文档进行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-means对一个新文档进行聚类,并知道它属于哪个聚类。我尝试了以下操作,但我认为预测的输入不正确。

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,那么对训练后文档使用相同的流程。(Doc2Vec模型无法识别的单词,因为它们在训练过程中不存在,将被默默地忽略——因此,像在推理时进行不同风格的事例扁平化这样的错误会大大削弱结果。(

最新更新