2015-04-22 3 views
7

Ich verwende sklearn auf Python, um etwas Clustering durchzuführen. Ich habe 200.000 Daten trainiert, und Code unten funktioniert gut.Behalte das TFIDF-Ergebnis für die Vorhersage neuer Inhalte mit Scikit für 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) 

Aber wenn ich neue Testinhalte habe, möchte ich sie zu bestehenden Clustern gruppieren, die ich trainiert habe. Ich frage mich also, wie ich IDF-Ergebnis speichern kann, so dass ich TFIDF für den neuen Testinhalt tun kann und sicherstellen, dass das Ergebnis für neue Testinhalte dieselbe Arraylänge hat.

Vielen Dank im Voraus.

UPDATE

Ich brauche kann „Transformator“ oder „TFIDF“ Variable zu einer Datei speichern (txt oder andere), wenn einer von ihnen das gelernten IDF Ergebnis enthält.

UPDATE

Zum Beispiel. Ich habe die Trainingsdaten:

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

Und tun TFIDF, enthält das Ergebnis 4 Merkmale (a, b, c, d)

Wenn ich TEST:

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

zu sehen Sie, welcher Cluster (bereits von k-means gemacht) gehört. TFIDF gibt nur das Ergebnis mit 3 Merkmalen (a, c, d), so dass das Clustering in k-means fällt. (Wenn ich ["a", "b", "e"] teste, kann es andere Probleme geben.)

So, wie man die Merkmalsliste für das Prüfen von Daten speichert (sogar mehr, speichert es in der Akte)?

UPDATE

gelöst, siehe unten Antworten.

+0

durch neuen Inhalt, was meinst du? neue Testinhalte oder Trainingsinhalte? – user123

+0

neuer Testinhalt @ user123 –

+0

Ich vermute, dass Sie möglicherweise nicht in der Lage sind, neue Trainingsinhalte an zuvor trainierte Inhalte anzuhängen. Sie müssen mindestens einmal mit ganzen Trainingsdaten trainieren, dann können Sie diese trainierten Daten putzen, die später verwendet werden können, um die Trainingsverzögerung zu eliminieren. Aber wenn du neue Inhalte bekommst, musst du es mindestens einmal trainieren – user123

Antwort

4

Ich speicherte erfolgreich die Feature-Liste von vectorizer.vocabulary_ speichern und wiederverwenden, indem CountVectorizer(decode_error="replace",vocabulary=vectorizer.vocabulary_)

Codes unter:

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"]))) 

, das funktioniert. tfidf haben dieselbe Merkmalslänge wie trainierte Daten.

+0

Wird dies das Tfidf trainierte Modell zusammen mit der generierten Tfidf-Matrix speichern? – Minu

+2

Laden Sie es später Abschnitt ist falsch !! .. Warum ist es fit_transform .. Es sollte nur technisch transformiert werden, wenn Sie neue/ungesehene Daten transformieren. – MANU

2

Sie die Vektorisierung tun können, und TFIDF Transformation in einer Stufe:

vec =TfidfVectorizer() 

dann passen und Transformation auf den Trainingsdaten

tfidf = vec.fit_transform(training_data) 

und das TFIDF Modell verwenden zu verwandeln

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

Danke. Aber ich möchte das tfidf-Ergebnis in eine Datei (txt oder so) speichern und später laden. Sie wollen die Variable "vec" wiederverwenden, aber kann sie gespeichert werden? –

5

Wenn Sie eine Funktionsliste zum Testen von Daten für die zukünftige Verwendung speichern möchten, können Sie Folgendes tun:

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' enthält keine Feature-Liste, ich habe die Feature-Liste erfolgreich zur Wiederverwendung gespeichert und diese selbst beantwortet. Danke, dass du mich inspiriert hast. –

+0

@ lol.Wen: Sie können als beantwortet markieren, wenn es Ihr Problem gelöst – user123