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_
我是 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_