2015-12-11 30 views
5

ile üst n terimlerini nasıl elde ederim Anahtar kelime çıkarma sorunu üzerinde çalışıyorum. Çok genel haliScikit Learn TfidfVectorizer: En yüksek tf-idf puanı

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] 

düşünün ve bu bana iyi olduğunu

(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 

verir. Gelen herhangi bir yeni belge için, en yüksek tfidf puanı ile en üst sıralara ulaşmanın bir yolu var mı?

+2

Python veri türü str'nin üzerine yazmamalısınız. – scottlittle

cevap

14

Bir şarkının biraz yapmak yerine numpy diziler olarak matrisleri elde etmek dans etmek zorunda, ama bu aradığınız yapmalı:

:

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] 

Bu bana verir

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

argsort numaralı çağrı gerçekten faydalı olanıdır, here are the docs for it. [::-1] yapmamız gerekiyor, çünkü argsort sadece küçükten büyüğe ayırmayı destekliyor. Boyutları 1d'ye düşürmek için flatten'u ararız, böylece sıralanmış dizinler 1d özellik dizisini dizine eklemek için kullanılabilir. flatten numaralı telefona yapılan aramanın yalnızca bir dokümanı zamanda test ediyorsanız işe yarayacağını unutmayın.

Ayrıca, başka bir notta, tfs = tfidf.fit_transform(t.split("\n\n")) gibi bir şey mi kastettiniz? Aksi takdirde, çok satırlı dizedeki her terim bir "belge" olarak ele alınmaktadır. \n\n'u kullanmak, aslında, tfidf hakkında düşündüğünüzde daha mantıklı olan 4 belgeye (her satır için bir tane) baktığımız anlamına gelir.

+0

çok teşekkürler :) – AbtPst

+1

Bunu DictVectorizer + TfidfTransformer kullanarak nasıl başarabilirim? – diugalde

+1

Her bir belge için her bir sınıf için en üstteki terimleri listelemek istersek ne olur? Bir soru sordum [https://stackoverflow.com/questions/44833987/listing-top-n-features-in-each-class-using-sklearn-and-tf-idf-values] ama henüz yanıt yok ! – Pedram