2015-01-26 14 views
5

Vorrei tracciare un grafico 2D con l'asse x come asse di termine e y come punteggio TFIDF (o ID documento) per la mia lista di frasi. Ho usato scikit learn's fit_transform() per ottenere la matrice scipy ma non so come usare quella matrice per tracciare il grafico. Sto cercando di ottenere una trama per vedere quanto bene le mie frasi possano essere classificate usando kmea.trama di un documento tfidf grafico 2D

Ecco l'output di fit_transform(sentence_list):

(documento di identità, il numero termine) TFIDF segnare

(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 

Ecco il mio codice:

 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 

Grazie,

+0

fa il seguente lavoro per voi? Dovrebbe se stai guardando solo una semplice trama 2D. http://matplotlib.org/examples/pylab_examples/simple_plot.html –

risposta

15

Quando usi Bag of Parole, ognuna delle tue frasi viene rappresentata in uno spazio di dimensioni elevate di lunghezza pari al vocabolario. Se si vuole rappresentare questo in 2D è necessario ridurre la dimensione, ad esempio utilizzando PCA con due componenti:

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

Ora è possibile ad esempio calcolare e tracciare il cluster entra su questi dati:

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

Sì, questo è esattamente. Grazie! – jxn

+0

posso usare tfidfvectorizer invece di fare countvectorizer e poi tfidftransformer? Il codice per pipeline sarà simile a questo: 'pipeline = Pipeline ([('tfidf', TfidfVectorizer())])'? – jxn

+3

im ottenere un errore per 'plt.scatter (data2D [:, 0], data2D [:, 1], c = data.target)' specificatamente 'c = data.target'. Se voglio che i colori dei grafici a dispersione siano sintonizzati sui colori dei cluster scoperti da kmea, cosa dovrei usare al posto di 'data.target'? 'Kmeans.label_'? #questo restituisce una lista. – jxn