2016-11-09 101 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