Как обрабатывать текстовые данные с помощью TF-IDF в Python

1656604818 kak obrabatyvat tekstovye dannye s pomoshhyu tf idf v python

от Mayank Tripathi

1*JTk6iVMiZCQCr8duiaKlHQ

Компьютеры хорошо разбираются с числами, но не очень хорошо с текстовыми данными. Одним из наиболее широко используемых методов обработки текстовых данных является TF-IDF. В этой статье мы узнаем, как это работает и каковы его особенности.

Из нашей интуиции мы считаем, что появляющиеся чаще слова должны иметь больший вес в анализе текстовых данных, но это не всегда так. Такие слова, как the, will и you называются стоп-слово — наиболее встречаются в корпусе текста, но имеют очень мало значения. Слова, встречающиеся редко, на самом деле помогают различать данные и имеют больший вес.

Введение в TF-IDF

TF-IDF расшифровывается как «Частота термина – инверсная частота данных». Сначала мы узнаем, что означает этот термин математически.

Периодичность терминов (tf): дает нам частоту слова по каждому документу в корпусе. Это отношение количества встреч слова в документе к общему количеству слов в этом документе. Она увеличивается с увеличением количества встреч этого слова в документе. У каждого документа есть свой tf.

1*HM0Vcdrx2RApOyjp_ZeW_Q

Обратная частота данных (idf): используется для расчета веса редких слов во всех документах в корпусе. Редко встречающиеся в корпусе слова имеют высокий балл IDF. Это задается уравнением ниже.

1*A5YGwFpcTd0YTCdgoiHFUw

Сочетая эти два, мы получаем оценку TF-IDF(w) для слова в документе в корпусе. Это произведение tf и idf:

1*nSqHXwOIJ2fa_EFLTh5KYw
1*q2tRgjV_J-MLvnhwNAl0KQ

Для более ясного понимания возьмем пример.

1: Автомобиль едет по дороге.

Предложение 2: Грузовик едет по шоссе.

В этом примере каждое предложение представляет собой отдельный документ.

Теперь мы вычислим TF-IDF для двух вышеуказанных документов, представляющих наш корпус.

1*q3qYevXqQOjJf6Pwdlx8Mw

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

Использование Python для вычисления TF-IDF

Теперь давайте кодировать TF-IDF на Python с нуля. После этого мы увидим, как мы можем использовать sklearn для автоматизации процесса.

Функция computeTF вычисляет оценку TF для каждого слова в корпусе по документу.

1*AgBLM-NRFEpWVhXM7I3XjQ
1*RE_h1NoBqyW24oGU3tthew

Функция computeIDF Вычисляет оценку IDF для каждого слова в корпусе.

1*EjHweFHuNa-rznvdPQaRbQ
1*cGGCFDVZRdh4yVWKdUKj1g

Функция computeTFIDF ниже вычисляется оценка TF-IDF для каждого слова путём умножения баллов TF и ​​IDF.

1*QSTMOhLviIEcRtrEBzwrfPA

Выход, полученный вышеуказанным кодом для набора документов D1 и D2, такой же, как и то, что мы вычислили вручную выше в таблице.

1*aLUwNr58mazdfs7DHT1Z6Q

Вы можете перейти по этой ссылке для полной реализации.

sklearn

Теперь мы увидим, как мы можем реализовать это с помощью sklearn в Python.

Во-первых, мы будем импортировать TfidfVectorizer от sklearn.feature_extraction.text:

1*w9tnnHtsjZwyuFhve5uM1g

Теперь мы инициализируем vectorizer а затем вызовите fit и трансформируйте над ним, чтобы вычислить оценку TF-IDF для текста.

1*H0_K3rA-tK3hP8KUdq3o8A

Под капотом sklearn fit_transform выполняет следующее fit и transform функции. Их можно найти в официальной библиотеке sklearn на GitHub.


    def fit(self, X, y=None):
        """Learn the idf vector (global term weights)
        Parameters
        ----------
        X : sparse matrix, [n_samples, n_features]
            a matrix of term/token counts
        """
        if not sp.issparse(X):
            X = sp.csc_matrix(X)
        if self.use_idf:
            n_samples, n_features = X.shape
            df = _document_frequency(X)

            # perform idf smoothing if required
            df += int(self.smooth_idf)
            n_samples += int(self.smooth_idf)

            # log+1 instead of log makes sure terms with zero idf don't get
            # suppressed entirely.
            idf = np.log(float(n_samples) / df) + 1.0
            self._idf_diag = sp.spdiags(idf, diags=0, m=n_features,
                                        n=n_features, format="csr")

        return self

    def transform(self, X, copy=True):
        """Transform a count matrix to a tf or tf-idf representation
        Parameters
        ----------
        X : sparse matrix, [n_samples, n_features]
            a matrix of term/token counts
        copy : boolean, default True
            Whether to copy X and operate on the copy or perform in-place
            operations.
        Returns
        -------
        vectors : sparse matrix, [n_samples, n_features]
        """
        if hasattr(X, 'dtype') and np.issubdtype(X.dtype, np.floating):
            # preserve float family dtype
            X = sp.csr_matrix(X, copy=copy)
        else:
            # convert counts or binary occurrences to floats
            X = sp.csr_matrix(X, dtype=np.float64, copy=copy)

        n_samples, n_features = X.shape

        if self.sublinear_tf:
            np.log(X.data, X.data)
            X.data += 1

        if self.use_idf:
            check_is_fitted(self, '_idf_diag', 'idf vector is not fitted')

            expected_n_features = self._idf_diag.shape[0]
            if n_features != expected_n_features:
                raise ValueError("Input has n_features=%d while the model"
                                 " has been trained with n_features=%d" % (
                                     n_features, expected_n_features))
            # *= doesn't work
            X = X * self._idf_diag

        if self.norm:
            X = normalize(X, norm=self.norm, copy=False)

        return X

В вышеприведенном коде следует отметить, что вместо журнала n_samples к n_samples было добавлено 1 для вычисления оценки IDF. Это гарантирует, что слова с нулевой оценкой IDF не скрываются полностью.

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

1*d_Pk4czfcod_vFlFugWysA

Таким образом мы увидели, как мы можем легко кодировать TF-IDF всего за 4 строчки с помощью sklearn. Теперь мы понимаем, насколько мощным является TF-IDF как инструмент для обработки текстовых данных из корпуса. Чтобы узнать больше о sklearn TF-IDF, вы можете воспользоваться этой ссылкой.

Счастливого кодирования!

Спасибо, что прочли эту статью. Обязательно поделитесь им, если вы считаете это полезным.

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

На здоровье!

Кроме того, давайте подключимся Twitter, Linkedin, Github и Facebook.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *