Что это за вывод Sklearn tfidf_vectorizer - PullRequest
1 голос
/ 06 августа 2020

Сначала я применил tfidf_vectorizer к своим обучающим данным.

X_train_counts = tfidf_vectorizer.fit_transform(X_train)

Затем я пытаюсь вывести значение tf-idf предложения «программирование».

test = tfidf_vectorizer.transform(['programming']).reshape(1, -1)
print(test)

результат:

(0, 45295)  1.0

Что представляет эта 1.0? Я подумал, что это может быть значение tf-idf или idf слова «программирование», поскольку значение tf в данном случае равно 1.

Затем я попробовал

test = tfidf_vectorizer.transform(['programming upgrade']).reshape(1, -1)
print(test)

Результат такой:

(0, 60314)  0.7968362696657073
(0, 45295)  0.6041952990095505

Если 1 является значением tf-idf, то в этом случае оно должно быть 0,5, так как значение tf равно 1/2, но это не так.

Так что же обозначает это число? Кажется, это не значение tf, не значение idf и не значение tf-idf.

Смущает

1 Ответ

1 голос
/ 06 августа 2020

Я думаю, ваша проблема в том, что настройка по умолчанию для tfidf_vectorizer - это норма «l2» вместо «l1».

Результатом tfidf_vectorizer является матрица tf-idf, и поэтому число равно tf-idf value.

По умолчанию tfidf_vectorizer использовал норму 'l2' (https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html).

Вот несколько параллельных сравнений полученных Значения tf-idf:

from sklearn.feature_extraction.text import TfidfVectorizer

doc1 = ['programming upgrade']

tfidf_l1 = TfidfVectorizer(norm='l1')
tfidf_2 = TfidfVectorizer(norm='l2')

tfidf_l1.fit(docs)
tfidf_2.fit(docs)

print("Output tfidf_transformer with l1 norm:")
test = tfidf_l1.transform(['programming upgrade']).reshape(1, -1)
print(test)

print("Output tfidf_transformer with l2 norm:")
test = tfidf_2.transform(['programming upgrade']).reshape(1, -1)
print(test)

И это возвращает:

Output tfidf_transformer with l1 norm:
  (0, 1)    0.5
  (0, 0)    0.5
Output tfidf_transformer with l2 norm:
  (0, 1)    0.7071067811865475
  (0, 0)    0.7071067811865475

Поэтому просто укажите свой tfidfVectorizer, чтобы использовать норму «l1».

...