понимание основных функций tfidf в TfidfVectorizer - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь лучше понять TfidfVectorizer из scikit-learn. В следующем коде есть два документа doc1 = The car is driven on the road, doc2 = The truck is driven on the highway. При вызове fit_transform создается векторизованная матрица весов tf-idf.

Согласно матрице значений tf-idf, не должно ли highway,truck,car быть верхними словами вместо highway,truck,driven как highway = truck= car= 0.63 and driven = 0.44?

#testing tfidfvectorizer
from sklearn.feature_extraction.text import TfidfVectorizer
import numpy as np

tn = ['The car is driven on the road', 'The truck is driven on the highway']
vectorizer = TfidfVectorizer(tokenizer= lambda x:x.split(),stop_words = 'english')
response = vectorizer.fit_transform(tn)

feature_array = np.array(vectorizer.get_feature_names()) #list of features
print(feature_array)
print(response.toarray())

sorted_features = np.argsort(response.toarray()).flatten()[:-1] #index of highest valued features
print(sorted_features)

#printing top 3 weighted features
n = 3
top_n = feature_array[sorted_features][:n]
print(top_n)
['car' 'driven' 'highway' 'road' 'truck']
[[0.6316672  0.44943642 0.         0.6316672  0.        ]
 [0.         0.44943642 0.6316672  0.         0.6316672 ]]
[2 4 1 0 3 0 3 1 2]
['highway' 'truck' 'driven']

1 Ответ

2 голосов
/ 07 мая 2020

Как видно из результата, матрица tf-idf действительно дает более высокий балл highway, truck, cartruck):

tn = ['The car is driven on the road', 'The truck is driven on the highway']
vectorizer = TfidfVectorizer(stop_words = 'english')
response = vectorizer.fit_transform(tn)
terms = vectorizer.get_feature_names()

pd.DataFrame(response.toarray(), columns=terms)

        car    driven   highway      road     truck
0  0.631667  0.449436  0.000000  0.631667  0.000000
1  0.000000  0.449436  0.631667  0.000000  0.631667

Что не так, это дальнейшая проверка, которую вы выполняете, выравнивая массив. Чтобы получить наивысшие оценки по всем строкам, вы могли бы вместо этого сделать что-то вроде:

max_scores = response.toarray().max(0).argsort()
np.array(terms)[max_scores[-4:]]
array(['car', 'highway', 'road', 'truck'], dtype='<U7')

Где самые высокие баллы - это имена функций, которые имеют оценку 0.63 в фрейме данных.

...