python - Doc2Vec句子聚类

原文 标签 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()

基本上,我现在所做的是对文档中每个标记的句子进行培训。但是,如果有这样的想法,这可以用一种更简单的方式。
最后,包含相似单词的句子应该聚在一起并打印出来。在这一点上,单独训练每个文档,并不能清楚地揭示集群中的任何逻辑。
希望有人能把我引向正确的方向。
谢谢。

最佳答案

你看过你得到的词向量了吗(使用dm=1算法设置)?当你检查它们时,它们显示出很好的相似性吗?
我会尝试使用tsne来减少你的维度,一旦你有一些合理的类似的词向量工作。如果需要的话,你可以先使用主成分分析(pca)来减少大约50个维度。认为两者都在sklearn。然后看看您的文档是否正在形成不同的组或不是这样的组。
再看看你最相似的文档向量,然后在一个已知的训练过的句子上尝试infer vector(),如果一切都好的话,你应该得到非常接近1的相似度。(inferVector()每次的结果总是有点不同,所以永远不会相同!)

相关文章:

python - 内存高效的随机数迭代器,无需替换

python - scikit-learn与make_scorer挣扎

python - 如何在结构主题建模R-package中绘制文档主题分布?

machine-learning - 如何用标签概率对文本进行分类?

python - 创建词汇字典以进行文本挖掘

python - 使用VIM逐步调试Eclipse和PyDev等python

python - 为什么从文件末尾查找BZip2文件而不是Gzip文件?

scikit-learn - AWS SageMaker最低配置

python - scikit-learn安排文本数据进行文本分类的标准方法是什么?

java - 无监督命名实体识别(NER),带有用于Java中交联建议的自定义控制词汇表