2014-12-21 10 views
5

Sto utilizzando l'algoritmo Kmeans di learn di scikit per raggruppare i commenti.In che modo kmea sanno come raggruppare i documenti quando li alimentiamo solo con vettori di singole parole?

sentence_list=['hello how are you', "I am doing great", "my name is abc"] 

vectorizer=TfidfVectorizer(min_df=1, max_df=0.9, stop_words='english', decode_error='ignore') 
vectorized=vectorizer.fit_transform(sentence_list) 

km=KMeans(n_clusters=num_clusters, init='k-means++',n_init=10, verbose=1) 
km.fit(vectorized) 

quando ho stampare l'output di vectorized, mi dà l'indice delle parole e dei punteggi TF-IDF dell'indice.

Quindi, mi chiedo, dato che otteniamo solo le decine di parole di tfidf, come è possibile che riusciamo a raggruppare i documenti in base a singole parole e non al punteggio di un intero documento? O forse lo fa .. Può qualcuno spiegarmi il concetto alla base di questo?

+0

Non so cosa stai chiedendo. Il processo di divisione del testo in parole fa parte del processo di vettorizzazione/adattamento. – BrenBarn

+0

il mio obiettivo finale è quello di essere in grado di tracciare un grafico 2D con l'asse y che è il punteggio di tfidf e l'asse x può essere il vettore di conteggio (o qualcos'altro che ha più senso) e ogni punto di dati è 1 documento. Quindi ero curioso di sapere se il punteggio per ogni frase è effettivamente calcolato dietro la scena in modo tale che i cluster con i punteggi più simili siano raggruppati insieme? – jxn

risposta

6

Si dovrebbe dare un'occhiata a come funziona il Kmeans algorithm. Prima le parole di stop non arrivano mai a vectorized, quindi sono totalmente ignorate dai Kmean e non hanno alcuna influenza sul modo in cui i documenti sono raggruppati. Ora supponiamo di avere:

sentence_list=["word1", "word2", "word2 word3"] 

Diciamo che volete 2 gruppi. In questo caso ci si aspetta che il secondo e il terzo documento si trovino nello stesso cluster perché condividono una parola comune. Vediamo come succede.

La rappresentazione numerica dei documenti vectorized assomiglia:

word1  word3  word2 
    1 0.000000 0.000000  # doc 1 
    0 1.000000 0.000000  # doc 2 
    0 0.605349 0.795961  # doc 3 

Nella prima fase di Kmeans, alcuni centroidi sono casualmente scelto tra i dati, per esempio, il documento 1 e il documento 3 sarà essere i centroidi iniziali:

Centroid 1:  [1, 0.000000, 0.000000] 

Centroid 2:  [0, 0.605349, 0.795961] 

Ora, se si calcolano le distanze da ogni punto (documento) a ciascuno dei due baricentri, si vedrà che:

  • documento 1 ha distanza 0 al centroide 1 in modo che appartiene al centroide 1
  • documento 3 è distanza 0 al centroide 2 in modo che appartiene centroide 2

Infine si calcola la distanza tra la rimanente documento 2 e ciascuno baricentro per scoprire quale appartiene:

>>> from scipy.spatial.distance import euclidean 

>>> euclidean([0, 1, 0], [1, 0, 0])    # dist(doc2, centroid1) 
1.4142135623730951 

>>> euclidean([0, 1, 0], [0, 0.605349, 0.795961]) # dist(doc2, centroid2) 
0.8884272507056005 

Così il secondo documento e il secondo baricentro sono più vicini, questo significa che il secondo documento viene assegnato al 2 ° centr OID.

+0

E 'possibile tracciare ciascun documento su un asse 2D per avere una rappresentazione visiva per darci un'idea migliore di quanti cluster dovremmo avere o dove dovrebbe essere il centroide? – jxn

+0

Non l'ho mai fatto su interi documenti ma non vedo alcun problema con la tua idea. Penso che dovrebbe essere fattibile. – elyase

1

TF/IDF è una misura che calcola l'importanza di una parola in un documento rispetto al resto delle parole in tale documento. Non calcola l'importanza di una parola autonoma. (e ha senso, giusto? Perché l'importanza significa sempre privilegio sugli altri!). Quindi TF/IDF di ogni parola è in realtà una misura di importanza di un documento rispetto alla parola.

Non vedo dove viene utilizzato TF/IDF nel codice. Tuttavia, è possibile calcolare l'algoritmo kmeans con i punteggi TF/IDF usati come caratteristiche. Inoltre, il clustering per i tre documenti campione che hai menzionato è semplicemente impossibile, mentre non ci sono due documenti in cui c'è una parola comune!

Modifica 1: Prima di tutto, se la parola "gatto" si verifica in due documenti è possibile che vengano raggruppati insieme (a seconda delle altre parole nei due documenti e anche in altri documenti). In secondo luogo, dovresti saperne di più su k-means. Vedete, kmea usa le funzionalità per raggruppare i documenti insieme e ogni punteggio tf/idf per ogni parola in un documento è una misura caratteristica che è stata utilizzata per confrontare quel documento con gli altri su un corpus.

+0

Questi sono solo esempi, quindi se in 2 della mia frase esiste la parola 'cat', le due frasi con 'cat' saranno raggruppate in base a quello in quanto le altre parole sono stopword? E se questo è il caso, l'algo calcola un punteggio per ogni frase basata sul tfidf di ogni parola in un documento (assumendo che 'cat' abbia un punteggio tfidf elevato)? – jxn

+0

@jenn controlla la mia prima modifica! fammi sapere se hai ulteriori domande. – user823743

Problemi correlati