В этой статье мы постараемся реализовать sklearn tf-IDF Vectorizer с нуля и провести перекрестную проверку вывода с выводом стандартной библиотеки. SCIKIT-LEARN очень упрощает вычисления, просто выполнив пару строк, чтобы получить желаемый результат.

Что означает tf-IDF?

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

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

Стандартное определение взято с веб-сайта ниже



Как вычислить?

Как правило, вес tf-IDF обычно состоит из двух членов: первичный вычисляет нормализованную частоту термина (TF), иначе. несколько раз слово появляется в превышающем документе, разделенное на все количество слов в этом документе; второй член - это обратная частота документов (IDF), вычисляемая из логарифма количества документов в корпусе, деленного на количество документов, в которых встречается конкретный термин.

TF: Term Frequency, которая измеряет, насколько обычно термин встречается в документе. Поскольку каждый документ имеет разную длину, вполне вероятно, что термин будет появляться в длинных документах гораздо дольше, чем в более коротких. Таким образом, частота термина обычно делится на длину документа (также известную как общее количество терминов в документе) как простейший способ нормализации:

IDF: обратная частота документа, которая количественно определяет кардинальность термина. При вычислении частоты терминов все термины считаются одинаково важными. Известно, что некоторые термины, такие как «но», «а» и «эти», могут встречаться много раз, но не имеют большого значения. Таким образом, нам нужно утяжелять повторяющиеся термины и увеличивать разреженные, вычисляя следующее:

Пример:

Давайте возьмем обзор в корпусе из 100 слов, в котором словарь слов появляется 5 раз. Частота термина для книги тогда (5/100) = 0,05. Теперь предположим, что у нас есть 10 миллионов документов в корпусе, и словарик присутствует в одной тысяче из них. Затем обратная частота документов рассчитывается как log (10 000 000/1 000) = 4. Вес tf-IDF является результатом этих величин: 0,05 * 4 = 0,20.

Давайте создадим векторизатор TFIDF и сравним его результаты со Sklearn:

сравните результаты вашей собственной реализации векторизатора TFIDF с результатами векторизатора TFIDF реализации sklearns.

Sklearn делает еще несколько настроек в реализации своей версии векторизатора TFIDF, поэтому для воспроизведения точных результатов вам нужно будет добавить следующие вещи в свою собственную реализацию векторизатора TF-IDF:

  1. Словарь Sklearn создан на основе IDF и отсортирован в алфавитном порядке.
  2. Формула Sklearn IDF отличается от стандартной формулы учебника. Здесь константа «1» добавляется к числителю и знаменателю IDF, как если бы был замечен дополнительный документ, содержащий каждый термин в коллекции ровно один раз, что предотвращает нулевое деление.

3. Sklearn применяет L2-нормализацию к своей выходной матрице.

4. Конечным результатом векторизатора sklearn TF-IDF является разреженная матрица.

Шаги, чтобы подойти к этой задаче:

Возьмем образец корпуса:

  1. Напишите методы подгонки и преобразования для собственной реализации векторизатора TF-IDF. Распечатайте отсортированный по алфавиту словарь после того, как вы поместите свои данные, и проверьте, совпадает ли он с именами функций из векторизатора sklearn TF-IDF.

2. Распечатайте значения IDF из вашей реализации и проверьте, совпадают ли они со значениями IDF векторизатора sklearns TF-IDF.

['and', 'document', 'first', 'is', 'one', 'second', 'the', 'third', 'this']

3. После того, как вы добьетесь того же значения вашего словаря и IDF, что и у sklearns-реализации векторизатора TF-IDF, убедитесь, что результат вашей реализации является разреженной матрицей. Перед генерацией окончательного вывода вам необходимо нормализовать разреженную матрицу с помощью нормализации L2. Вы можете обратиться к этой ссылке https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.normalize.html

[1.91629073, 1.22314355, 1.51082562, 1.0, 1.91629073, 1.91629073, 1.0, 1.91629073, 1.0]

Теперь давайте сравним наши результаты, используя стандартную функцию векторизатора scikit-learn tf-IDF.

scikit-learn действительно упрощает нашу жизнь, просто добавляя пару строк кода, и мы получаем тот же результат, что и выше.

SKLearn Внедрение

['and', 'document', 'first', 'is', 'one', 'second', 'the', 'third', 'this']
[1.91629073 1.22314355 1.51082562 1.         1.91629073 1.91629073
 1.         1.91629073 1.        ]