2015-01-26 23 views
5

Chciałbym wykreślić wykres 2d z osi X jako termin i oś Y jako wynik TFIDF (lub identyfikator dokumentu) dla mojej listy zdań. Użyłem scikit learn's fit_transform(), aby uzyskać matrycę scipy, ale nie wiem, jak użyć tej macierzy do wykreślenia wykresu. Próbuję uzyskać spisek, aby zobaczyć, jak dobrze moje zdania można sklasyfikować za pomocą kmeans.wykreślić dokument tfidf 2D wykres

Oto wyjściowy fit_transform(sentence_list):

(id dokument, numer termin) tfidf zdobyć

(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 

Oto mój kod:

 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 

Dzięki

+0

wykonuje następujące prace dla Ciebie? Powinno to wyglądać, gdy patrzysz tylko na prosty wykres 2D. http://matplotlib.org/examples/pylab_examples/simple_plot.html –

Odpowiedz

15

Podczas korzystania z torby Słowa, każde z twoich zdań jest reprezentowane w wysoko wymiarowej przestrzeni o długości równej słownictwie. Jeśli chcesz do reprezentowania w 2D trzeba zmniejszyć wymiar, na przykład za pomocą PCA z dwóch komponentów:

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 

data2d

Teraz można na przykład obliczyć i wykreślić klastra wchodzi na tych danych:

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

Tak, właśnie to. Dzięki! – jxn

+0

Czy mogę po prostu użyć tfidfvectorizer zamiast robić countvectorizer następnie tfidftransformer? Czy kod dla potoku wygląda następująco: 'pipeline = Pipeline ([('tfidf', TfidfVectorizer())])'? – jxn

+3

im otrzymuję błąd dla 'plt.scatter (data2D [:, 0], data2D [:, 1], c = data.target)' konkretnie 'c = data.target'. Jeśli chcę, aby kolory wykresów rozproszonych były dostrojone do kolorów klastrów odkrytych przez kmeans, co powinienem użyć zamiast "data.target"? 'kmeans.label_'? #this zwraca listę. – jxn