2015-12-11 27 views
5

Pracuję nad problemem ekstrakcji słów kluczowych. Rozważmy bardzo ogólnym przypadkuScikit Learn TfidfVectorizer: Jak zdobyć najlepsze n terminów z najwyższym wynikiem tf-idf

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] 

i to daje mi

(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 

co jest dobrym rozwiązaniem. W przypadku każdego nowego dokumentu, który jest dostępny, czy istnieje sposób na uzyskanie najlepszych n terminów z najwyższym wynikiem tfidf?

+2

Prawdopodobnie nie powinieneś zastępować typu Python. – scottlittle

Odpowiedz

14

Musisz zrobić trochę pieśni i tańca, aby uzyskać jak matryce zamiast tablic numpy, ale to powinien zrobić to, czego szukasz:

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] 

To daje mi:

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

Wywołanie argsort jest naprawdę przydatne, here are the docs for it. Musimy wykonać [::-1], ponieważ argsort obsługuje tylko sortowanie małych i dużych. Nazywamy flatten, aby zmniejszyć wymiary do 1d, tak aby posortowane indeksy mogły być używane do indeksowania tablicy cech 1d. Pamiętaj, że w tym przypadku połączenie z numerem flatten będzie działać tylko wtedy, gdy testujesz jeden dokument na raz.

Również, na innej nucie, miałeś na myśli coś takiego jak tfs = tfidf.fit_transform(t.split("\n\n"))? W przeciwnym razie każde wyrażenie w łańcuchu wielowierszowym jest traktowane jako "dokument". Używanie wartości \n\n oznacza, że ​​faktycznie patrzymy na 4 dokumenty (po jednym na każdą linię), co ma większy sens, gdy myślisz o tfidf.

+0

bardzo dziękuję człowiekowi :) – AbtPst

+1

Jak to osiągnąć, używając DictVectorizer + TfidfTransformer? – diugalde

+1

Co zrobić, jeśli chcemy wyświetlić najlepsze n terminów dla każdej klasy nie dla każdego dokumentu? Zadałem pytanie [tutaj] (https://stackoverflow.com/questions/44833987/listing-top-n-features-in-each-class-using-sklearn-and-tf-idf-values), ale brak odpowiedzi ! – Pedram