У меня есть таблица значений частоты, например:
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
Все еще не понимаете, что такое doc и data? Пожалуйста, поясните. Было бы хорошо, если бы вы упомянули полный ожидаемый результат для ваших данных.
@AbdurRehman doc - это итератор в цикле for, и я предоставил образец для фрейма данных в вопросе
В вашем примере, насколько я понимаю, у вас есть 3 документа. Слово a отображается как 3-times в первом doc, а в первом документе всего 3 слова (a = 3 + b = 0), поэтому tf будет 3/3 = 1. Так как всего 3 документа и слово a встречается в двух из них, то idf будет log(3/2) = 0.176, а теперь tf-idf = 1 * 0.176 = 0.176. Как вы получили 1.2 в первом документе.
Я просмотрел пример tf-idf от quora. Посмотрите здесь: quora.com/How-does-TF-IDF-work
@AbdurRehman Я ссылаюсь на этот tfidf.com, здесь его упомянутое tf - это частота слова в документе / количество слов в документе ... поскольку данные являются fvt, значения - это частота слова в документе .. поэтому в первом случае freq - 3, количество слов в первом документе - 1 tf = 3/1 idf - ln (3/2)
Позвольте нам продолжить обсуждение в чате.






Входной DataFrame:
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
Пожалуйста, поясните, что такое
data, и укажите ожидаемый результат.