【问题标题】:Doc2Vec Clustering with kmeans for a new documentDoc2Vec 聚类与新文档的 kmeans
【发布时间】:2019-05-08 20:59:10
【问题描述】:

我有一个使用 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))

感谢任何帮助!

【问题讨论】:

    标签: cluster-analysis k-means doc2vec


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢你,我当然也会用epoc 参数进行测试。该字符串仅用于演示目的,实际文档要长得多。小评论——对于单个样本,我必须在将向量传递给预测之前对其进行整形:testdoc_vector.reshape(1,-1)
    猜你喜欢
    • 2012-11-12
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 2018-02-05
    • 2020-06-19
    • 2013-11-18
    • 1970-01-01
    • 2018-05-15
    相关资源
    最近更新 更多