web-dev-qa-db-fra.com

traceur un document tf idf graphe 2D

Je voudrais tracer un graphique 2d avec l'axe des x comme terme et l'axe des y comme le score TFIDF (ou l'identifiant du document) pour ma liste de phrases. J'ai utilisé fit_transform () de scikit learn pour obtenir la matrice scipy mais je ne sais pas comment utiliser cette matrice pour tracer le graphique. J'essaie d'obtenir un complot pour voir comment mes phrases peuvent être classées à l'aide de kméans.

Voici le résultat de fit_transform(sentence_list):

(identifiant du document, numéro du terme) tfidf score

(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

Voici mon code:

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 

Merci,

12
jxn

Lorsque vous utilisez Sac de mots, chacune de vos phrases est représentée dans un espace de grande dimension et de longueur égale au vocabulaire. Si vous souhaitez représenter cela en 2D, vous devez réduire la cote, par exemple en utilisant PCA avec deux composants:

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

Maintenant, vous pouvez par exemple calculer et tracer le cluster entre sur ces données:

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

27
elyase

Attribuez simplement une variable aux étiquettes et utilisez-la pour indiquer la couleur. ex km = Kmeans().fit(X) clusters = km.labels_.tolist() puis c=clusters

0
beto