Является ли tf-idf scikit-learn в этом примере правильным? Самые частые слова имеют высокий балл - PullRequest
0 голосов
/ 09 марта 2019
from sklearn.feature_extraction.text import TfidfVectorizer

documents=["The car is driven on the road","The truck is                  
            driven on the highway","the lorry is"]
fidf_transformer=TfidfVectorizer(smooth_idf=True,use_idf=True)
tfidf=tfidf_transformer.fit_transform(documents)
print(tfidf_transformer.vocabulary_)
print(tfidf.toarray())

{'the': 7, 'car': 0, 'on': 5, 'driven': 1, 'is': 3, 'road':         6, 'lorry': 4, 'truck': 8, 'highway': 2}
[[0.45171082 0.34353772 0. 0.26678769 0.  0.34353772 0.45171082 0.53357537 0.        ]
 [0.         0.34353772 0.45171082 0.26678769 0.         0.34353772 0.         0.53357537 0.45171082]
 [0.         0.         0.         0.45329466 0.76749457 0. 0.         0.45329466 0.        ]]

Слово "the" должно иметь низкую оценку в трех документах

1 Ответ

0 голосов
/ 10 марта 2019

tfidf = термин частота (tf) * обратная частота документа (idf)

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer 

vectorizer = CountVectorizer()
X = vectorizer.fit_transform(documents)
print(vectorizer.get_feature_names())
print (X.toarray())
print ("---")
t = TfidfTransformer(use_idf=True, norm=None, smooth_idf=False)
a = t.fit_transform(X)
print (a.toarray())
print ("---")
print (t.idf_)

Выход:

enter image description here

idf() низкий, но tf (the, doc1) = 2 высокий, что толкает его на другие слова.

Из приведенного выше примера кода:

idf (без норм, безсглаженный idf) is == the == 1

Однако tf (the, doc1) = 2 и tf (is, doc1) = 1, что увеличивает значение tfidf для tfidf (the, doc1).

аналогично idf (car) = 2.09861229, но tf (car, doc1) = 1, => tfidf (car, doc1) = 2.09861229, что очень близко к tfidf (the, doc1).Сглаживание IDF еще больше уменьшает разрыв.

На большом корпусе различия становятся более заметными.

Попробуйте запустить свой код, отключив сглаживание и не нормализуя, чтобы увидеть влияние на небольшой корпус.

tfidf_transformer = TfidfVectorizer (smooth_idf = False, use_idf = True, norm = None)

...