Вычисление tf_idf для таблицы fvt

У меня есть таблица значений частоты, например:

    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                    

Пожалуйста, поясните, что такое data, и укажите ожидаемый результат.

Abdur Rehman 03.01.2019 20:23

Все еще не понимаете, что такое doc и data? Пожалуйста, поясните. Было бы хорошо, если бы вы упомянули полный ожидаемый результат для ваших данных.

Abdur Rehman 05.01.2019 17:26

@AbdurRehman doc - это итератор в цикле for, и я предоставил образец для фрейма данных в вопросе

ubuntu_noob 05.01.2019 17:42

В вашем примере, насколько я понимаю, у вас есть 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 в первом документе.

Abdur Rehman 05.01.2019 18:12

Я просмотрел пример tf-idf от quora. Посмотрите здесь: quora.com/How-does-TF-IDF-work

Abdur Rehman 05.01.2019 18:13

@AbdurRehman Я ссылаюсь на этот tfidf.com, здесь его упомянутое tf - это частота слова в документе / количество слов в документе ... поскольку данные являются fvt, значения - это частота слова в документе .. поэтому в первом случае freq - 3, количество слов в первом документе - 1 tf = 3/1 idf - ln (3/2)

ubuntu_noob 05.01.2019 18:23

Позвольте нам продолжить обсуждение в чате.

Abdur Rehman 05.01.2019 18:34
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
7
80
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Входной 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

Другие вопросы по теме