TF-IDF - это простой поворот в пакете слов. Пакет слов просто означает (# раз слово w встречается в документе d).

TF-IDF означает термин "частота, умноженная на обратную частоту документа".

На изображении ниже рассказывается о подходе с использованием набора слов для численного кодирования текстовых данных для работы с текстовыми данными в условиях машинного обучения.

В приведенном ниже примере слово «щенок» встречается в тексте ровно один раз, поэтому в пакете слов vector puppy значение равно единице, в основном это говорит о том, что количество слов puppy в этом документе равно единице, и есть много документов в реальном слове, так что это вектор будет выглядеть как матрица, где каждая строка - это документ, а матрица - это набор документов, в которых столбцы представляют собой определенное количество слов.

Зачем нам нужен tf-idf, если у нас уже есть пакет слов, представляющий текст?

Пакет слов - это простое представление текстовых данных, но оно далеко от совершенства.
Если мы посчитаем все одинаково, то некоторые слова будут выделены больше, чем другие.

Например, рассмотрим отзыв, сделанный покупателем при покупке продукта. Здесь «и», «то», «а» встречаются чаще, чем слова «счастливый», «качество» и тем самым доминируют в векторном пространстве. Если бы нам нужно было создать модель анализа настроений с учетом отзывов клиентов, мы бы хотели знать, насколько определенное слово важно для документа, например слова «Счастливый» и «Качество», и мы бы хотели придать этим словам больше веса, чтобы получить лучшая модель. TF-IDF делает то же самое, когда не хватает слов.

Вместо того, чтобы искать необработанное количество слов в документе в наборе данных, tf-idf ищет нормализованное количество, где каждое количество слов делится на количество документов, в которых встречается это слово.

Формула учебника:

bow (w, d) = # раз слово w встречается в документе d

idf (w, d) = N / (# документ, в котором встречается слово w).

tf-idf (w, d) = bow (w, d) * N / (# документ, в котором встречается слово w).

Где N - общее количество документов.

Если слово встречается во многих документах, то его обратная частота документа близка к единице. Если слово встречается всего в нескольких документах, то частота его обратного документа намного выше.

Мы также можем использовать преобразование журнала, а не просто использовать необработанную частоту обратного документа. Лог-преобразование превратит 1 в 0 и уменьшит большие значения (больше 1).
Теперь формулу можно переписать в следующем виде:

tf-idf (w, d) = bow (w, d) * Log (N / # документов, в которых встречается слово w)

Это в значительной степени касается представления tf-idf в учебниках. Теперь давайте погрузимся в реализацию tf-idf в sklearn, которая немного отличается от представления в учебнике.

TF-IDF в sklearn:

Я собираюсь использовать TfidfVectorizer с параметрами по умолчанию:
class sklearn.feature_extraction.text.TfidfVectorizer (*, input = 'content', encoding = 'utf-8', decode_error = 'strict', strip_accents = None, нижний регистр = True , preprocessor = None, tokenizer = None, analyzer = 'word', stop_words = Нет, token_pattern = '(? U) \ b \ w \ w + \ b', ngram_range = (1, 1) , max_df = 1.0, min_df = 1, max_features = None, dictionary = None, binary = False, dtype = ‹class 'numpy.float64'›, norm = 'l2', use_idf = True, smooth_idf = True, sublinear_tf = False)

Выше я привел пример, когда в наборе данных есть только два документа: «Этот документ» и «Второй документ».

Общее количество слов в наборе данных - три.

Вы также можете увидеть преобразованное представление набора данных tf-idf в приведенном выше фрейме данных, которое взвешивает слова для конкретного документа.

Выше мы можем заметить, что слову «второй» присвоено нулевое значение, поскольку это слово не встречается в первом документе, и аналогично оно имеет нулевое значение во втором документе. В то время как другие слова, такие как «документ», имеют 0,579739 для первого документа.

Теперь давайте посчитаем, как именно tfidfVectorizer () с нуля выдал эти значения:

По умолчанию tfidfVectorizer имеет smooth_idf = True и norm = "l2".

Для этих параметров приведена формула для расчета преобразованных выше значений:

Ниже я рассчитал значения для приведенного выше примера вручную (с нуля)

Возьмем первый документ «Этот документ»:

tfidf_of_word_document = (np.log ((1+ (number_of_documents)) / (1+ (Количество документов, в которых встречается это слово))) * Word_count_of_word_document_in_first_document
= (np.log (( 1 + 2) / (1 + 2)) + 1) * 1 = 1

Аналогичным образом рассчитайте это для других значений и используйте приведенную ниже методику нормализации, чтобы получить точный результат с точки зрения sklearn с нуля.

tfidf_normalized_for_word_document_in_first_document =
(tfidf_of_word_document) /
(np.sqrt (np.square (tf_idf_for_word_document_in_first_document) + \
np.square_for_word_document_in_first_document) + \
tp.square_id_first_word_send_word_id_server_id_id_id_id_id_id_id_id_id_id_id_id_id_id_id_id_id_id_id_id_code_ np.square (tf_idf_for_word_this_in_first_document)))

= 1 / np.sqrt (1² + 0² + 1,405²) = 0,579738

Надеюсь, эта статья поможет тем, кто не уверен в реализации sklearn по tf-idf. Это явно отличается от обозначений в учебниках.

Я не могу дождаться, когда вы внедрите tf-idf для следующей задачи обработки естественного языка или машинного обучения, чтобы классифицировать или кластеризовать свой корпус.

Пожалуйста, хлопайте в ладоши, если вы нашли эту статью полезной, и оставьте комментарий. Следуйте за мной, чтобы узнать больше о машинном обучении и науке о данных.

Ссылка:
https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html

Https://scikit-learn.org/stable/modules/feature_extraction.html#text-feature-extraction

Https://scikit-learn.org/stable/modules/feature_extraction.html#text-feature-extraction