举例题-
数据-
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.
有人能帮忙吗?