【问题标题】:doc2vec How to cluster DocvecsArraydoc2vec 如何集群 DocvecsArray
【发布时间】:2017-01-16 10:25:48
【问题描述】:

我从网上找到的示例中修补了以下代码:

# gensim modules
from gensim import utils
from gensim.models.doc2vec import LabeledSentence
from gensim.models import Doc2Vec
from sklearn.cluster import KMeans

# random
from random import shuffle

# classifier

class LabeledLineSentence(object):
    def __init__(self, sources):
        self.sources = sources

        flipped = {}

        # make sure that keys are unique
        for key, value in sources.items():
            if value not in flipped:
                flipped[value] = [key]
            else:
                raise Exception('Non-unique prefix encountered')

    def __iter__(self):
        for source, prefix in self.sources.items():
            with utils.smart_open(source) as fin:
                for item_no, line in enumerate(fin):
                    yield LabeledSentence(utils.to_unicode(line).split(), [prefix + '_%s' % item_no])

    def to_array(self):
        self.sentences = []
        for source, prefix in self.sources.items():
            with utils.smart_open(source) as fin:
                for item_no, line in enumerate(fin):
                    self.sentences.append(LabeledSentence(utils.to_unicode(line).split(), [prefix + '_%s' % item_no]))
        return self.sentences

    def sentences_perm(self):
        shuffle(self.sentences)
        return self.sentences

sources = {'test.txt' : 'DOCS'}
sentences = LabeledLineSentence(sources)

model = Doc2Vec(min_count=1, window=10, size=100, sample=1e-4, negative=5, workers=8)
model.build_vocab(sentences.to_array())

for epoch in range(10):
    model.train(sentences.sentences_perm())

print(model.docvecs)

我的 test.txt 文件每行包含一个段落。

代码运行良好,为每一行文本生成DocvecsArray

我的目标是得到这样的输出:

集群 1:[DOC_5,DOC_100,...DOC_N]
集群 2:[DOC_0,DOC_1,...DOC_N]

我找到了following Answer,但输出是:

第 1 组:[单词,单词...单词]
集群 2:[单词,单词...单词]

如何更改代码并获取文档集群?

【问题讨论】:

    标签: python machine-learning k-means word2vec doc2vec


    【解决方案1】:

    就我而言,我使用的是:

    for doc in docs:
        doc_vecs = model.infer_vector(doc.split())
    # creating a matrix from list of vectors
    mat = np.stack(doc_vecs)
    
    # Clustering Kmeans
    km_model = KMeans(n_clusters=5)
    km_model.fit(mat)
    # Get cluster assignment labels
    labels = km_model.labels_
    
    # Clustering DBScan
    dbscan_model = DBSCAN()
    labels = dbscan_model.fit_predict(mat)  
    

    其中 model 是预训练的 Doc2Vec 模型。在我的情况下,我不需要对相同的培训文档进行聚类,而是将新文档保存在 docs 列表中

    【讨论】:

      【解决方案2】:

      看来你快到了。

      您正在输出一组向量。对于 sklearn 包,您必须将它们放入一个 numpy 数组中 - 使用 numpy.toarray() 函数可能是最好的。 The documentation 的 KMeans 非常出色,甚至在整个库中都很好。

      请注意,我使用 DBSCAN 的运气比使用 KMeans 好得多,它们都包含在同一个 sklearn 库中。 DBSCAN 不需要您指定要在输出中包含多少个集群。

      两个链接中都有注释良好的代码示例。

      【讨论】:

      • 酷,我来看看..你实现了文档集群吗?
      • 不,但我处理过文档分类。一般来说,文本越小越难。一开始,您可能希望将其保留为更大的文本。
      猜你喜欢
      • 2018-02-05
      • 1970-01-01
      • 2018-09-21
      • 2018-09-23
      • 2019-09-08
      • 1970-01-01
      • 2019-11-30
      • 2017-06-01
      • 2018-03-09
      相关资源
      最近更新 更多