Gensim Doc2vec 模型聚类为 K-means

Gensim Doc2vec model clustering into K-means

我是 doc2vec 的新手,我希望你们中的一些人能帮助我解决这个问题。 关于这个问题我问过很多人,但没有人知道解决方案。

我想做的是将 Doc2vec 结果聚类为 k-means。请看下面的代码。

mbk = MiniBatchKMeans(n_clusters=3, init_size=400, batch_size=300, verbose=1).fit(model_dm.docvecs[range([2000])                                                                                                 
MiniBatchKMeans.predict(mbk,mbk.labels_ )

我遇到了这个错误。

TypeErrorTraceback (most recent call last)
<ipython-input-19-fbc57a13bf4b> in <module>()
      6 
      7 
----> 8 mbk = MiniBatchKMeans(n_clusters=3, init_size=400, batch_size=300, verbose=1).fit(model_dm.docvecs[:2000])
      9 
     10 #model_dm.docvecs.doctag_syn0[2000]

/usr/local/lib64/python2.7/site-packages/gensim/models/doc2vec.pyc in __getitem__(self, index)
    351             return self.doctag_syn0[self._int_index(index)]
    352 
--> 353         return vstack([self[i] for i in index])
    354 
    355     def __len__(self):

TypeError: 'slice' object is not iterable

您正在尝试在您的这部分代码上对单个文档向量(准确地说是第 2001 个向量)进行聚类:

.fit(model_dm.docvecs[2000]) 

我假设您想要前 2000 个向量?

编辑:

查看 gensim 文档后,找不到获取文档向量切片的方法。但是查看 source code DocvecsArray 接受单个键(int 或 str)或键列表。有了它,您可以使用以下方法获得前 2000 个向量:

.fit(model_dm.docvecs[range(2000)])

看起来不太令人满意,如果以后能找到其他方法,我会修正我的答案。

还要记住这些不是第一个 2000 个向量,因为 gensim 似乎将 docvecs 存储为 key:value 对并且字典没有排序。

第二次编辑:

K-means 部分代码也需要修复,您正在调用 MiniBatchKMeans class' predict 函数。并将 class 实例 (mbk) 作为参数。如果您需要预测任何其他内容,则需要调用 class 实例(在这种情况下为 mbk)的 predict 函数。我假设你不知道。

您可以使用下面的代码获取分配的标签。

mbk = MiniBatchKMeans(n_clusters=3, init_size=400, batch_size=300, verbose=1).fit(model_dm.docvecs[range(2000])
mbk.labels_