2017-09-12 1 views
-2

J'ai pris un tas de documents et calculé tf * idf pour chaque jeton dans tous les documents et les vecteurs créés (chacun de n dimension, n est le nombre de mots uniques dans le corpus) pour chaque document. Je n'arrive pas à comprendre comment créer un cluster à partir de vecteurs à l'aide de sklearn.cluster.MeanShiftClustering de documents en utilisant le décalage moyen

+0

Après avoir calculé tfidf, avez-vous une matrice (ie: table de données avec des lignes et des colonnes) de valeurs numériques? Est-il rare ou dense? Quel type en général? Avez-vous utilisé TfidfVectorizer() de sklearn? – Jarad

+0

Oui, j'ai utilisé TfidfVectorizer() fini avec une matrice clairsemée. Je ne comprends pas comment donner cela comme une entrée à sklearn.clister.MeanShift –

Répondre

1

TfidfVectorizer convertit les documents en une «matrice fragmentée» de nombres. MeanShift exige que les données qui lui sont transmises soient "denses". Ci-dessous, je montre comment le convertir dans un pipeline (credit) mais, si la mémoire le permet, vous pouvez simplement convertir une matrice clairsemée en dense avec toarray() ou todense().

from sklearn.feature_extraction.text import TfidfVectorizer 
from sklearn.cluster import MeanShift 
from sklearn.pipeline import Pipeline 
from sklearn.preprocessing import FunctionTransformer 

documents = ['this is document one', 
      'this is document two', 
      'document one is fun', 
      'document two is mean', 
      'document is really short', 
      'how fun is document one?', 
      'mean shift... what is that'] 

pipeline = Pipeline(
    steps=[ 
    ('tfidf', TfidfVectorizer()), 
    ('trans', FunctionTransformer(lambda x: x.todense(), accept_sparse=True)), 
    ('clust', MeanShift()) 
    ]) 

pipeline.fit(documents) 
pipeline.named_steps['clust'].labels_ 

result = [(label,doc) for doc,label in zip(documents, pipeline.named_steps['clust'].labels_)] 

for label,doc in sorted(result): 
    print(label, doc) 

Prints:

0 document two is mean 
0 this is document one 
0 this is document two 
1 document one is fun 
1 how fun is document one? 
2 mean shift... what is that 
3 document is really short 

Vous pouvez modifier les "hyperparam'etres", mais cela vous donne une idée générale je pense.