2015-01-26 13 views
5

Cümleler listem için bir xd ekseni terim ve y ekseni olarak TFIDF skoru (veya belge kimliği) olarak çizmek istiyorum. Scipy matrisini elde etmek için scikit learn'in fit_transform() yöntemini kullandım ancak grafiği çizmek için bu matrisi nasıl kullanacağımı bilmiyorum. Cümlelerimin kmeans kullanarak nasıl sınıflandırılabileceğini görmek için bir komplo kurmaya çalışıyorum. Benim kodBir belge çizimi tfidf 2D graph

(doküman kimliği terimi numarası) İşte

(0, 1023) 0.209291711271 
    (0, 924) 0.174405532933 
    (0, 914) 0.174405532933 
    (0, 821) 0.15579574484 
    (0, 770) 0.174405532933 
    (0, 763) 0.159719994016 
    (0, 689) 0.135518787598 

skor tfidf edilir: Burada

fit_transform(sentence_list) çıktısıdır

 sentence_list=["Hi how are you", "Good morning" ...] 
     vectorizer=TfidfVectorizer(min_df=1, stop_words='english', decode_error='ignore') 
     vectorized=vectorizer.fit_transform(sentence_list) 
     num_samples, num_features=vectorized.shape 
     print "num_samples: %d, num_features: %d" %(num_samples,num_features) 
     num_clusters=10 
     km=KMeans(n_clusters=num_clusters, init='k-means++',n_init=10, verbose=1) 
     km.fit(vectorized) 
     PRINT km.labels_ # Returns a list of clusters ranging 0 to 10 

sayesinde

+0

sizin için aşağıdaki çalışır mı? Sadece basit bir 2D çizimine bakmanız gerekiyor. http://matplotlib.org/examples/pylab_examples/simple_plot.html –

cevap

15

Torbayı kullandığınızda Sözcükler, cümlelerinizin her biri, kelime dağarcığına eşit bir yüksek boyutlu uzayda temsil edilir. 2 boyutta bu temsil etmek isterseniz iki bileşenlerle PCA kullanarak örneğin boyut azaltmak gerekir:

from sklearn.datasets import fetch_20newsgroups 
from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer 
from sklearn.decomposition import PCA 
from sklearn.pipeline import Pipeline 
import matplotlib.pyplot as plt 

newsgroups_train = fetch_20newsgroups(subset='train', 
             categories=['alt.atheism', 'sci.space']) 
pipeline = Pipeline([ 
    ('vect', CountVectorizer()), 
    ('tfidf', TfidfTransformer()), 
])   
X = pipeline.fit_transform(newsgroups_train.data).todense() 

pca = PCA(n_components=2).fit(X) 
data2D = pca.transform(X) 
plt.scatter(data2D[:,0], data2D[:,1], c=data.target) 
plt.show()    #not required if using ipython notebook 
Şimdi

data2d

Örneğin hesaplamak ve küme bu verilere girer çizebilirsiniz:

from sklearn.cluster import KMeans 

kmeans = KMeans(n_clusters=2).fit(X) 
centers2D = pca.transform(kmeans.cluster_centers_) 

plt.hold(True) 
plt.scatter(centers2D[:,0], centers2D[:,1], 
      marker='x', s=200, linewidths=3, c='r') 
plt.show()    #not required if using ipython notebook 

enter image description here

+0

Evet, tam olarak bu. Teşekkürler! – jxn

+0

tfidfransectorizer'ı tfidftransformer yerine countvectorizer yapmak yerine kullanabilir miyim? Boru hattının kodu şöyle görünür: Boru hattı = Boru hattı ([('tfidf', TfidfVectorizer())]) '? – jxn

+3

'plt.scatter (data2D [:, 0], data2D [:, 1], c = data.target)' '' '' '' '' '= data.target'' için bir hata alıyorum. Scatter çizgilerinin renklerinin, kuzenler tarafından keşfedilen küme renklerine ayarlanmasını istiyorsanız, data.target yerine ne kullanmalıyım? 'Kmeans.label_'? # bu bir liste döndürür. – jxn