我有一个频率值表,例如-
a b
1 3 0
2 0 3
3 4 5
我想计算tf_idf。
我的代码-
l=len(data)
for doc in data:
m=data.groupby(doc).apply(lambda column: column.sum()/(column != 0).sum())
for i in range(l):
tf=print(data.loc[i,doc])
idf=log(l/m)
weight=tf*idf
data.loc[i,doc]=weight
说明- 首先,我遍历每列,在其中找到var m中该列的非零行,并将该行的特定值存储为tf,然后计算tf_idf,并用tf_idf权重替换表中的值。>
预期输出-
对于g列第一行,我们有tf = 3 idf = log(5/4),因此tf_idf = idf * tf
a b
1 0.4 0
2 0 0.4
3 0.17 .22
答案 0 :(得分:1)
输入数据框:
df
a b
0 3 0
1 0 3
2 4 5
首先,在所有单词中找到idf
,
idf_list = []
for col in list(df.columns):
total_count = df[col].nonzero()[0][1]
idf = np.log(len(df) / total_count)
idf_list.append(round(idf, 3))
现在,找到tf-idf
并更新数据框
for row in range(len(df)):
total_doc_words = sum(df.iloc[row].values)
for col in range(len(df.columns)):
tf = df.iloc[row, col] / total_doc_words
df.iloc[row, col] = tf * idf_list[col]
输出:
df
a b
0 0.405 0.000
1 0.000 0.405
2 0.180 0.225