У меня проблемы с пониманием результатов TfidfVectorizer от sklearn - PullRequest
2 голосов
/ 06 июля 2019

С учетом корпуса из 3 документов, например:

   sentences = ["This car is fast",
                "This car is pretty",
                "Very fast truck"]

Я выполняю вручную расчет tf-idf.

Для документа 1 и слова "автомобиль" я могу найти следующее:

TF = 1/4
IDF = log(3/2)
TF-IDF = 1/4 * log(3/2)

Тот же результат должен применяться к документу 2, поскольку в нем 4 слова, и одно из них - "машина".

Я пытался применить это в sklearn, с кодом ниже:

from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pd

data = {'text': sentences}
df = pd.DataFrame(data)
tv = TfidfVectorizer()
tfvector = tv.fit_transform(df.text)
print(pd.DataFrame(tfvector.toarray(), columns=tv.get_feature_names()))

И результат, который я получаю:

        car     fast        is    pretty      this     truck      very
0  0.500000  0.50000  0.500000  0.000000  0.500000  0.000000  0.000000
1  0.459854  0.00000  0.459854  0.604652  0.459854  0.000000  0.000000
2  0.000000  0.47363  0.000000  0.000000  0.000000  0.622766  0.622766

Я могу понять, что sklearn использует нормализацию L2, но все же, не должен ли показатель tf-idf "car" в первых двух документах быть одинаковым? Может ли кто-нибудь помочь мне понять результаты?

1 Ответ

0 голосов
/ 06 июля 2019

Это из-за нормализации.Если вы добавите параметр norm=None к TfIdfVectorizer(norm=None), вы получите следующий результат, который имеет то же значение для car

        car      fast        is    pretty      this     truck      very
0  1.287682  1.287682  1.287682  0.000000  1.287682  0.000000  0.000000
1  1.287682  0.000000  1.287682  1.693147  1.287682  0.000000  0.000000
2  0.000000  1.287682  0.000000  0.000000  0.000000  1.693147  1.693147
...