2015-04-22 19 views
7

Sto usando sklearn su Python per fare un po 'di clustering. Ho addestrato 200.000 dati e il codice sotto funziona bene.Mantieni il risultato TFIDF per la previsione di nuovi contenuti utilizzando Scikit per Python

corpus = open("token_from_xml.txt") 
vectorizer = CountVectorizer(decode_error="replace") 
transformer = TfidfTransformer() 
tfidf = transformer.fit_transform(vectorizer.fit_transform(corpus)) 
km = KMeans(30) 
kmresult = km.fit(tfidf).predict(tfidf) 

Ma quando ho nuovi contenuti di test, mi piacerebbe a raggrupparsi a grappoli esistito avevo addestrato. Quindi mi chiedo come salvare il risultato IDF , in modo da poter eseguire TFIDF per il nuovo contenuto di test e accertarmi che il risultato per il nuovo contenuto di test abbia la stessa lunghezza dell'array.

Grazie in anticipo.

UPDATE

posso avere bisogno di salvare "trasformatore" o variabile "TFIDF" su file (txt o altri), se uno di essi contiene il risultato IDF addestrato.

UPDATE

per esempio. Ho i dati di allenamento:

["a", "b", "c"] 
["a", "b", "d"] 

E faccio TFIDF, la volontà risultato comprende 4 funzioni (a, b, c, d)

Quando ho TEST:

["a", "c", "d"] 

a vedere quale cluster (già creato da k-means) a cui appartiene. TFIDF fornirà il risultato solo con 3 feature (a, c, d), quindi il clustering in k-means cadrà. (Se provo lo ["a", "b", "e"], potrebbero esserci altri problemi.)

Quindi, come memorizzare l'elenco delle caratteristiche per i dati di test (ancora di più, memorizzarlo nel file)?

UPDATE

risolto, vedere le risposte di seguito.

+0

di nuovi contenuti, cosa intendi? nuovi contenuti di test o contenuti di formazione? – user123

+0

nuovo contenuto di test @ user123 –

+0

Immagino che potresti non essere in grado di aggiungere nuovi contenuti di formazione a contenuti precedentemente preparati. Devi allenarti almeno una volta con tutti i dati di allenamento, quindi puoi raccogliere quei dati addestrati, che possono essere utilizzati in seguito per eliminare il ritardo dell'allenamento. Ma quando ricevi nuovi contenuti, dovresti addestrarlo almeno una volta – user123

risposta

4

ho salvato con successo la lista delle caratteristiche salvando vectorizer.vocabulary_, e il riutilizzo da CountVectorizer(decode_error="replace",vocabulary=vectorizer.vocabulary_)

Codici di seguito:

corpus = np.array(["aaa bbb ccc", "aaa bbb ddd"]) 
vectorizer = CountVectorizer(decode_error="replace") 
vec_train = vectorizer.fit_transform(corpus) 
#Save vectorizer.vocabulary_ 
pickle.dump(vectorizer.vocabulary_,open("feature.pkl","wb")) 

#Load it later 
transformer = TfidfTransformer() 
loaded_vec = CountVectorizer(decode_error="replace",vocabulary=pickle.load(open("feature.pkl", "rb"))) 
tfidf = transformer.fit_transform(loaded_vec.fit_transform(np.array(["aaa ccc eee"]))) 

che funziona. tfidf avrà la stessa lunghezza di funzione dei dati addestrati.

+0

Questo salverà il modello addestrato di tfidf insieme alla matrice tfidf generata? – Minu

+2

Caricalo in seguito, la sezione è sbagliata !! .. Perché è fit_transform .. Dovrebbe essere solo trasformare, tecnicamente, se stai trasformando dati nuovi/invisibili. – MANU

2

si può fare la vettorializzazione e TFIDF trasformazione in una fase:

vec =TfidfVectorizer() 

quindi montare e trasformare sui dati di allenamento

tfidf = vec.fit_transform(training_data) 

e utilizzare il modello TFIDF per trasformare

unseen_tfidf = vec.transform(unseen_data) 
km = KMeans(30) 
kmresult = km.fit(tfidf).predict(unseen_tfid) 
+0

Grazie. Ma voglio salvare il risultato di tfidf in un file (txt o qualcosa) e caricarlo in seguito. Intendi riutilizzare la variabile "vec", ma può essere salvata? –

5

Se si desidera archiviare l'elenco delle caratteristiche per i dati di test da utilizzare in futuro, è possibile effettuare questa operazione:

tfidf = transformer.fit_transform(vectorizer.fit_transform(corpus)) 

#store the content 
with open("x_result.pkl", 'wb') as handle: 
        pickle.dump(tfidf, handle) 
#load the content 
tfidf = pickle.load(open("x_result.pkl", "rb")) 
+1

'tfidf' non contiene l'elenco delle caratteristiche, ho salvato con successo l'elenco delle caratteristiche per il riutilizzo e ho risposto a me stesso. Grazie per avermi ispirato. –

+0

@ lol.Wen: puoi contrassegnare la risposta se risolvono il problema – user123