2015-12-11 4 views
5

Ich arbeite an Keyword-Extraktion Problem. Betrachten Sie die sehr allgemeinen FallScikit Learn TfidfVectorizer: Wie bekomme ich Top n Begriffe mit der höchsten tf-IDF-Punktzahl

tfidf = TfidfVectorizer(tokenizer=tokenize, stop_words='english') 
    t="""Two Travellers, walking in the noonday sun, sought the shade of a widespreading tree to rest. As they lay looking up among the pleasant leaves, they saw that it was a Plane Tree. 

"How useless is the Plane!" said one of them. "It bears no fruit whatever, and only serves to litter the ground with leaves." 

"Ungrateful creatures!" said a voice from the Plane Tree. "You lie here in my cooling shade, and yet you say I am useless! Thus ungratefully, O Jupiter, do men receive their blessings!" 

Our best blessings are often the least appreciated.""" 

tfs = tfidf.fit_transform(t.split(" ")) 
str = 'tree cat travellers fruit jupiter' 
response = tfidf.transform([str]) 
feature_names = tfidf.get_feature_names() 
for col in response.nonzero()[1]: 
    print feature_names[col], ' - ', response[0, col] 

und das gibt mir

(0, 28) 0.443509712811 
    (0, 27) 0.517461475101 
    (0, 8) 0.517461475101 
    (0, 6) 0.517461475101 
tree - 0.443509712811 
travellers - 0.517461475101 
jupiter - 0.517461475101 
fruit - 0.517461475101 

was gut ist. Gibt es für jedes neue Dokument, das ankommt, eine Möglichkeit, die Top-n-Begriffe mit dem höchsten tfidf-Wert zu erhalten?

+2

Sie sollten den Python-Datentyp str wahrscheinlich nicht überschreiben. – scottlittle

Antwort

14

Sie haben ein bisschen ein Lied zu tun und tanzen die Matrizen als numpy Arrays statt zu bekommen, aber dies sollte das tun, was Sie suchen:

feature_array = np.array(tfidf.get_feature_names()) 
tfidf_sorting = np.argsort(response.toarray()).flatten()[::-1] 

n = 3 
top_n = feature_array[tfidf_sorting][:n] 

Das gibt mir:

array([u'fruit', u'travellers', u'jupiter'], 
    dtype='<U13') 

Der Anruf argsort ist wirklich der nützliche, here are the docs for it. Wir müssen [::-1] tun, weil argsort nur Sortierung klein bis groß unterstützt. Wir rufen flatten auf, um die Dimensionen auf 1d zu reduzieren, sodass die sortierten Indizes zum Indizieren des 1d-Feature-Arrays verwendet werden können. Beachten Sie, dass das Einschließen des Anrufs zu flatten nur funktioniert, wenn Sie ein Dokument gleichzeitig testen.

Auch auf einer anderen Anmerkung, meintest du etwas wie tfs = tfidf.fit_transform(t.split("\n\n"))? Andernfalls wird jeder Ausdruck in der mehrzeiligen Zeichenfolge als "Dokument" behandelt. Die Verwendung von \n\n bedeutet stattdessen, dass wir tatsächlich 4 Dokumente betrachten (eines für jede Zeile), was mehr Sinn macht, wenn Sie an tfidf denken.

+0

vielen Dank Mann :) – AbtPst

+1

Wie würde ich erreichen, dass mit DictVectorizer + TfidfTransformer? – diugalde

+1

Was ist, wenn wir die Top-n-Begriffe für jede Klasse und nicht für jedes Dokument auflisten möchten? Ich habe hier eine Frage gestellt (https://stackoverflow.com/questions/44833987/listing-top-n-features-in-e-ach-class-using-sklearn-and-tf-idf-values), aber noch keine Antwort ! – Pedram

Verwandte Themen