需要帮助来理解 Pandas TfidfTransformer 背后的计算

问题描述 投票:0回答:0

举例题-

数据-

data = [['1', 'af_aa'],
            ['1', 'af_aa'],
            ['1', 'af_bb'],
            ['1', 'af_bb'],
            ['1', 'af_cc'],
            ['2', 'af_aa'],
            ['2', 'af_dd'],
            ['2', 'af_dd'],
            ['2', 'af_dd'],
            ['3', 'af_aa'],
            ['3', 'af_bb'],
            ['3', 'af_dd'],
            ['3', 'af_dd']]

    df = pd.DataFrame(data, columns=['id', 'event_name'])

计算数据透视表(而不是使用 CountVectorizer 对象)-

pivoted_data = df.pivot_table(index='id', columns='event_name', aggfunc=len, fill_value=0)
    print(pivoted_data.to_string())

>>>
event_name    af_aa  af_bb  af_cc  af_dd
id                            
1                 2      2      1      0
2                 1      0      0      3
3                 1      1      0      2

初始化

TfidfTransformer
对象并调用fit_transform -

tfidf_transformer = TfidfTransformer()
transform_relevant_data = pivoted_data.loc[:, pivoted_data.columns != 'id']
tf_idf_vector = tfidf_transformer.fit_transform(transform_relevant_data)
print(pd.DataFrame(tfidf_transformer.idf_, index=tfidf_transformer.get_feature_names_out(), columns=["idf_weights"]).to_string())


>>>

       idf_weights
af_aa     1.000000
af_bb     1.287682
af_cc     1.693147
af_dd     1.287682

结果-

train_tfidf_df = pd.DataFrame(tf_idf_vector.todense(), index=pivoted_data.index, columns=transform_relevant_data.columns.tolist())

print(train_tfidf_df.to_string())

>>>

                 af_aa     af_bb     af_cc     af_dd
id                                        
1             0.544346  0.700945  0.460829  0.000000
2             0.250603  0.000000  0.000000  0.968090
3             0.328078  0.422461  0.000000  0.844921

创建测试数据-

test_data = [['4', 'af_aa', 'x'],
                 ['4', 'af_bb', 'x'],
                 ['4', 'af_bb', 'x']]

test_df = pd.DataFrame(test_data, columns=['id', 'event_name', 'temp'])

呼叫转换-

pivoted_test_df = test_df[['id', 'event_name']].pivot_table(index='id',
                                                                          columns='event_name', aggfunc=len, fill_value=0)
pivoted_test_df = pivoted_test_df.reindex(pivoted_test_df.columns.union(tfidf_transformer.get_feature_names_out().tolist(), sort=False), axis=1, fill_value=0)

test_tfidf_transformed = tfidf_transformer.transform(pivoted_test_df)
print(pd.DataFrame(data=test_tfidf_transformed.todense(), index=pivoted_test_df.index, columns=pivoted_test_df.columns.tolist()))

>>>

                 af_aa     af_bb  af_cc  af_dd
id                                  
4             0.361965  0.932192    0.0    0.0

我不明白它是如何得到这些结果的。例如,我预计

tf-idf(4, af_aa) == 0.33 * idf(af_aa) == 0.33 * 1 = 0.33 
而不是 0.361965.

有人能帮忙吗?

pandas tf-idf
© www.soinside.com 2019 - 2024. All rights reserved.