Doc2Vec句子聚类

时间:2017-04-18 15:53:35

标签: python scikit-learn text-mining gensim doc2vec

我有多个包含多个句子的文档。我想使用 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()

基本上,我现在正在做的是对文件中的每个标记句子进行培训。但是,如果有想法可以用更简单的方式完成。

最终,包含相似单词的句子应该聚集在一起并打印出来。此时,单独训练每个文档,并没有清楚地揭示集群中的任何逻辑。

希望有人可以引导我朝着正确的方向前进。 感谢。

2 个答案:

答案 0 :(得分:1)

  • 你看过你得到的单词vector(使用DM = 1算法设置)吗?当你检查它们时,它们是否表现出良好的相似性?
  • 一旦你有一些合理的相似单词向量工作,我会尝试使用tSNE减少你的尺寸。如果需要,您可以首先使用PCA来减少50个左右的尺寸。认为两者都在sklearn。然后看看你的文件是否形成了不同的群体。
  • 还会查看你的most_similar()文档向量,并在已知训练过的句子上尝试infer_vector(),如果一切正常,你应该与1非常接近。 (infer_vector()每次总是有点不同,所以从不相同!)

答案 1 :(得分:0)

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