2016-11-09 32 views
0

对于kmeans聚类,我使用TfidfVectorizer时总是出错。如何正确使用scikit-learn进行文本聚类

有3种情况:

  1. 我用分词器参数TfidfVectorizer定制标记化进程对我的数据集。这里是我的代码:

`

vectorizer = TfidfVectorizer(stop_words=stops,tokenizer=tokenize) 
X = vectorizer.fit_transform(titles) 

`

但是我得到这个错误:

ValueError: empty vocabulary; perhaps the documents only contain stop words 
  • 我做一个词汇由每个术语组成的术语和文档频率是词法化的结果,因此代码如下所示:
  • vectorizer = TfidfVectorizer(stop_words=stops,tokenizer=tokenize,vocabulary=vocab)

    ,但我得到了另一个新的错误:

    ValueError: Vocabulary contains repeated indices. 
    

    最后,我删除标记生成器和词汇参数。代码变成这样:

    `

    vectorizer = TfidfVectorizer(stop_words=stops) 
    X = vectorizer.fit_transform(titles) 
    terms = vectorizer.get_feature_names() 
    true_k = 8 
    model = KMeans(n_clusters=true_k, init='k-means++', max_iter=100, n_init=1) 
    model.fit(X) 
    print "Top terms per cluster:" 
    order_centroids = model.cluster_centers_.argsort()[:, ::-1] 
    for i in range(true_k): 
        print "Cluster %d:" % i, 
        for ind in order_centroids[i, :10]: 
         print ' %s' % terms[ind], 
        print 
    

    `

    嘛,程序成功运行,但聚类结果是这样的:

    `

    Cluster 0: bangun, rancang, lunak, perangkat, aplikasi, berbasis, menggunakan, service, sistem, pembangunan, 
    Cluster 1: sistem, aplikasi, berbasis, web, menggunakan, pembuatan, mobile, informasi, teknologi, pengembangan, 
    Cluster 2: android, berbasis, aplikasi, perangkat, rancang, bangun, bergerak, mobile, sosial, menggunakan, 
    Cluster 3: implementasi, algoritma, menggunakan, klasifikasi, data, game, fuzzy, vector, support, machine, 
    Cluster 4: metode, menggunakan, video, penerapan, implementasi, steganografi, pengenalan, berbasis, file, analisis, 
    Cluster 5: citra, segmentasi, menggunakan, implementasi, metode, warna, tekstur, kembali, berwarna, temu, 
    Cluster 6: jaringan, tiruan, protokol, voip, syaraf, saraf, menggunakan, implementasi, kinerja, streaming, 
    Cluster 7: studi, kasus, its, informatika, teknik, sistem, informasi, data, surabaya, jurusan, 
    

    `

    某些术语被聚类为多个群集,如术语data被放置到群集3和群集7.

    您能告诉我如何正确使用tfidfvectorizer和KMeans吗?你的帮助是我的幸福:)

    +0

    什么是'titles','vocab'? “你能告诉我如何恰当地使用tfidfvectorizer和KMeans吗?”这个问题太模糊了。你可以写出吨和吨的线。 – MMF

    +0

    你的结果没有问题。一个词可能发生在具有不同概率的不同聚类中。 – Ash

    回答

    0

    如果你想知道每个学期的集群,你可以有:

    vectorizer = TfidfVectorizer(stop_words=stops) 
    X = vectorizer.fit_transform(titles) 
    terms = vectorizer.get_feature_names() 
    true_k = 8 
    model = KMeans(n_clusters=true_k, init='k-means++', max_iter=100, n_init=1) 
    model.fit(X) 
    
    terms_vectorized = vectorizer.transform(terms) 
    terms_prediction = model.predict(terms_vectorized) 
    

    然后你会得到一个预测为每它可以遍历项。

    您所显示的结果显示了每个群集中的术语的重要性,而不是他们的预测。

    ,为什么你获得这些错误的原因是因为你不能没有期限,不管怎样,你传递给矢量化的参数会引起一些文件是这样的输入文档。

    +0

    你能告诉我为什么当我使用参数tokenizer作为我自己的标记函数时,向量器传递空词汇吗? 上述集群中的术语根本没有被阻止,所以我不得不使用一个函数来阻止它们。 非常感谢:) –

    +0

    即使对于您的文档之一,您的矢量化程序没有找到一个术语,那么它会抛出该错误。您可以单独在所有文档上运行您的标记器以找出哪一个没有任何条款(不包括停止条款)。如果你找到那个文件,你就会知道这个问题。您也可以通过为所有文档添加一个虚拟项来解决问题,以便它们都不为空(例如,将“虚拟”这个词添加到所有文档中)。 – Ash