Python Doc2Vec语句聚类

Python Doc2Vec语句聚类,python,scikit-learn,text-mining,gensim,doc2vec,Python,Scikit Learn,Text Mining,Gensim,Doc2vec,我有多个包含多个句子的文档。我想使用doc2vec通过使用sklearn对句子向量进行聚类(例如k-means) 因此,我们的想法是将相似的句子分成若干组。但是,我不清楚是否必须单独训练每个文档,然后在句子向量上使用聚类算法。或者,如果我可以从doc2vec推断出一个句子向量,而不必训练每个新句子 现在,这是我的代码片段: sentenceLabeled = [] for sentenceID, sentence in enumerate(example_sentences): sent

我有多个包含多个句子的文档。我想使用doc2vec通过使用sklearn对句子向量进行聚类(例如k-means)

因此,我们的想法是将相似的句子分成若干组。但是,我不清楚是否必须单独训练每个文档,然后在句子向量上使用聚类算法。或者,如果我可以从doc2vec推断出一个句子向量,而不必训练每个新句子

现在,这是我的代码片段:

sentenceLabeled = []
for sentenceID, sentence in enumerate(example_sentences):
    sentenceL = TaggedDocument(words=sentence.split(), tags = ['SENT_%s' %sentenceID])
    sentenceLabeled.append(sentenceL)

model = Doc2Vec(size=300, window=10, min_count=0, workers=11, alpha=0.025, 
min_alpha=0.025)
model.build_vocab(sentenceLabeled)
for epoch in range(20):
    model.train(sentenceLabeled)
    model.alpha -= 0.002  # decrease the learning rate
    model.min_alpha = model.alpha  # fix the learning rate, no decay
textVect = model.docvecs.doctag_syn0

## K-means ##
num_clusters = 3
km = KMeans(n_clusters=num_clusters)
km.fit(textVect)
clusters = km.labels_.tolist()

## Print Sentence Clusters ##
cluster_info = {'sentence': example_sentences, 'cluster' : clusters}
sentenceDF = pd.DataFrame(cluster_info, index=[clusters], columns = ['sentence','cluster'])

for num in range(num_clusters):
     print()
     print("Sentence cluster %d: " %int(num+1), end='')
     print()
     for sentence in sentenceDF.ix[num]['sentence'].values.tolist():
        print(' %s ' %sentence, end='')
        print()
    print()
基本上,我现在正在做的是对文档中每个标记的句子进行训练。然而,如果你有这样一个想法,那就是可以用一种更简单的方式来完成

最后,包含相似单词的句子应该聚集在一起并打印出来。在这一点上,单独培训每个文档并不能清楚地揭示集群中的任何逻辑

希望有人能把我引向正确的方向。
谢谢。

对于您的用例,所有文档中的所有句子都应该一起训练。从本质上讲,您应该将句子视为迷你文档。然后它们都共享相同的词汇和语义空间。

  • 你看过你得到的词向量了吗(使用DM=1算法设置)?当你检查它们时,它们是否显示出良好的相似性
  • 我会尝试使用tSNE来降低你的维度,一旦你有了一些合理的相似的词向量。如果需要的话,可以先使用PCA来减少到大约50维。我想他们都在学习。然后查看您的文档是否形成了不同的组
  • 再看看你最相似的()文档向量,试着在一个已知的训练过的句子上推断出向量(),如果一切正常,你应该得到与1非常接近的相似性。(推断向量()每次的结果总是有点不同,所以永远不会相同!)

因此,这基本上意味着对于每个文档,我都必须训练一个新的doc2vec模型,并使用该特定模型进行集群?在我看来,这样做不会在逻辑上对句子进行聚类,因为我看不到聚类之间的语义差异。不,你不会为每个文档训练新的doc2vec模型。您为所有文档中的所有句子训练1 doc2vec模型。我的回答怎么不清楚?你需要用所有的句子来训练一个模型,正如thn所说的。然后,对于新的看不见的句子,你可以使用你的模型推断出_vector(),然后在你的sklearn聚类中找出它属于哪个聚类。是的,我也看过vector这个词。另外,我还根据thn所述的所有文档训练了一个模型,并使用了infer_vector(),这显示了更具前景的结果。此外,我正在考虑LDA来推断可以用作集群的主题。还将尝试结合PCA进行维度重组!我知道这有点晚了,但您可以尝试其他集群技术,如分层集群以及DBSCAN,看看它是否有任何改进。如果有其他事情对你有好处,请分享给大家。谢谢