Расчёт tf-idf даёт неправильные результаты.

Вопрос или проблема

enter image description here

Я постоянно получаю 49 как мой ответ. В случае если вам нужен образец, вот код, который я использую:

# Problem 8: Corrected TF-IDF Calculation
TF = np.array([
    [3, 0, 2, 1],
    [1, 2, 0, 1],
    [2, 1, 3, 5]
], dtype=np.float32)
num_docs = 4
DF = np.count_nonzero(TF, axis=1)  # Count number of docs each term appears in
IDF = np.log10(num_docs / DF)  # Compute correct IDF
TF_IDF = TF * IDF[:, None]  # Multiply TF by IDF

total_scores = np.sum(TF_IDF, axis=0)  # Sum scores per document
final_result_8 = int(np.floor(100 * np.max(total_scores)))  # Get max score and scale

Однако предоставленный ответ – 44. Верный ли это ответ или я где-то ошибаюсь?
Изменение 1:
Я проверил на другом сайте (https://remykarem.github.io/tfidf-demo/):
enter image description here
Однако я не могу понять результаты. Как мне получить ответ из них?

Ответ или решение

Теория

Алгоритм TF-IDF (term frequency-inverse document frequency) — это популярный способ оценки важности термов (слов) в документах, которые входят в корпус. Он состоит из двух основных компонентов:

  1. Term Frequency (TF): Частота терма в документе, которая отражает, как часто терм встречается в данном документе. Вычисляется для каждой пары "терм-документ" следующим образом:
    [ \text{TF}(t, d) = \frac{\text{Количество вхождений терма } t \text{ в документе } d}{\text{Общее количество термов в документе } d} ]

  2. Inverse Document Frequency (IDF): Обратная частота документа, которая оценивает важность терма в коропусе всех документов, снижает вес термов, которые встречаются во всех документах. Вычисляется следующим образом:
    [ \text{IDF}(t, D) = \log_{10}\left(\frac{\text{Общее количество документов}}{\text{Количество документов, содержащих терм } t}\right) ]

После вычисления TF и IDF, алгоритм TF-IDF объединяет их путём умножения значений, чтобы определить вес каждого терма в каждом документе:
[ \text{TF-IDF}(t, d, D) = \text{TF}(t, d) \times \text{IDF}(t, D) ]

Пример

В вашем случае, есть матрица частот terма (TF) следующего вида:

TF = [
    [3, 0, 2, 1],
    [1, 2, 0, 1],
    [2, 1, 3, 5]
]

Здесь у нас 3 терма и 4 документа. Ваша цель — вычислить величины TF-IDF для всех термов в каждом документе и определять максимальный из них.

Применение

  1. Вычисление IDF:

    • Для терма 1: он присутствует в 3-х из 4-х документов (сталкиваемся с проблемой неверного подсчета dirty/negative assumptions в коде). Итак, IDF(терм 1) = log10(4/3).
    • Для терма 2: он присутствует в 3-х документах. IDF(терм 2) = log10(4/3).
    • Для терма 3: он присутствует в 4-х документах. IDF(терм 3) = log10(4/4).
  2. Вычисление TF-IDF:

    • Умножаем строки TF на соответствующие им IDF:
      [
      [3*IDF1, 0*IDF1, 2*IDF1, 1*IDF1],
      [1*IDF2, 2*IDF2, 0*IDF2, 1*IDF2],
      [2*IDF3, 1*IDF3, 3*IDF3, 5*IDF3]
      ]
  3. Суммирование и нормирование:

    • Суммируем значения по каждому столбцу, чтобы получить общий вклад каждого документа.
    • Применяем умножение на 100 и округление вниз для итогового результата.
  4. Ошибка в коде:

    • Определите, что ваши вычисления DF ошибочны: DF = np.count_nonzero(TF, axis=1) подсчитывает количество ненулевых элементов в каждой строке TF, но должно подсчитывать количество ненулевых во всей матрице каждого терма, то есть вдоль axis=0.
    • Исходно вы должны были вычислять корректное DF = np.count_nonzero(TF, axis=0).

Рекомендации

Очень важно, чтобы вы корректно интерпретировали, как TF и IDF должны быть рассчитаны на основании размерности матрицы. Ваше начальное недопонимание в том, какую ось использовать для функции np.count_nonzero при подсчете количества документов привело к нелогичным и неполным вычислениям.

Проведите ревизию вашего кода, убедитесь, что использование математических операций ясно и точно в соответствии с требованиями вычисления TF-IDF. Это решение позволит получить корректную максимальную величину, которая должна быть масштабирована и преобразована в целое число.

Оцените материал
Добавить комментарий

Капча загружается...