de Mayank Tripathi

Cum se proceseaza date text folosind TF IDF in Python

Calculatoarele sunt bune cu numerele, dar nu atât de mult cu datele textuale. Una dintre cele mai utilizate tehnici pentru procesarea datelor textuale este TF-IDF. În acest articol, vom afla cum funcționează și care sunt caracteristicile sale.

Din intuiția noastră, credem că cuvintele care apar mai des ar trebui să aibă o pondere mai mare în analiza datelor textuale, dar nu este întotdeauna cazul. Cuvinte precum „the”, „will” și „you” – numite cuvinte de oprire – apar cel mai mult într-un corpus de text, dar au o semnificație foarte mică. În schimb, cuvintele care sunt rare sunt cele care ajută de fapt la diferențierea între date și au o pondere mai mare.

O introducere în TF-IDF

TF-IDF înseamnă „Frecvența termenului – Frecvența inversă a datelor”. În primul rând, vom învăța ce înseamnă acest termen matematic.

Frecvența termenului (tf): ne oferă frecvența cuvântului din fiecare document din corpus. Este raportul de câte ori apare cuvântul într-un document comparativ cu numărul total de cuvinte din acel document. Crește pe măsură ce crește numărul aparițiilor acelui cuvânt în document. Fiecare document are propriul tf.

1611616506 237 Cum se proceseaza date text folosind TF IDF in Python

Frecvența inversă a datelor (idf): folosit pentru a calcula greutatea cuvintelor rare în toate documentele din corpus. Cuvintele care apar rar în corpus au un scor IDF ridicat. Este dat de ecuația de mai jos.

1611616506 560 Cum se proceseaza date text folosind TF IDF in Python

Combinând aceste două, ajungem cu scorul TF-IDF (w) pentru un cuvânt dintr-un document din corpus. Este produsul tf și idf:

1611616506 695 Cum se proceseaza date text folosind TF IDF in Python
1611616506 244 Cum se proceseaza date text folosind TF IDF in Python

Să luăm un exemplu pentru a obține o înțelegere mai clară.

Fraza 1: Mașina este condusă pe drum.

Fraza 2: Camionul este condus pe autostradă.

În acest exemplu, fiecare propoziție este un document separat.

Acum vom calcula TF-IDF pentru cele două documente de mai sus, care reprezintă corpusul nostru.

1611616506 284 Cum se proceseaza date text folosind TF IDF in Python

Din tabelul de mai sus, putem vedea că TF-IDF al cuvintelor obișnuite a fost zero, ceea ce arată că nu sunt semnificative. Pe de altă parte, TF-IDF pentru „mașină”, „camion”, „drum” și „autostradă” sunt diferite de zero. Aceste cuvinte au mai multă semnificație.

Folosind Python pentru a calcula TF-IDF

Permite acum codificarea TF-IDF în Python de la zero. După aceea, vom vedea cum putem folosi sklearn pentru a automatiza procesul.

Functia computeTF calculează scorul TF pentru fiecare cuvânt din corpus, după document.

1611616506 749 Cum se proceseaza date text folosind TF IDF in Python
1611616506 235 Cum se proceseaza date text folosind TF IDF in Python

Functia computeIDF calculează scorul IDF al fiecărui cuvânt din corpus.

1611616507 70 Cum se proceseaza date text folosind TF IDF in Python
1611616507 697 Cum se proceseaza date text folosind TF IDF in Python

Functia computeTFIDF de mai jos calculează scorul TF-IDF pentru fiecare cuvânt, prin înmulțirea scorurilor TF și IDF.

1611616507 310 Cum se proceseaza date text folosind TF IDF in Python

Rezultatul produs de codul de mai sus pentru setul de documente D1 și D2 este același cu ceea ce am calculat manual mai sus în tabel.

1611616507 811 Cum se proceseaza date text folosind TF IDF in Python

Vă puteți referi la acest link pentru implementarea completă.

sklearn

Acum vom vedea cum putem implementa acest lucru folosind sklearn în Python.

În primul rând, vom importa TfidfVectorizer din sklearn.feature_extraction.text:

1611616507 897 Cum se proceseaza date text folosind TF IDF in Python

Acum vom inițializa vectorizer apoi apelați fit și transformați-l pentru a calcula scorul TF-IDF pentru text.

1611616507 758 Cum se proceseaza date text folosind TF IDF in Python

Sub capotă, sklearn fit_transform execută următoarele fit și transform funcții. Acestea pot fi găsite în biblioteca oficială sklearn de la 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

Un lucru de observat în codul de mai sus este că, în loc de doar jurnalul de n_samples, 1 a fost adăugat la n_samples pentru a calcula scorul IDF. Acest lucru asigură faptul că cuvintele cu un scor IDF zero nu sunt suprimate în totalitate.

Rezultatul obținut este sub forma unei matrice înclinate, care este normalizată pentru a obține următorul rezultat.

1611616507 24 Cum se proceseaza date text folosind TF IDF in Python

Astfel am văzut cum putem codifica cu ușurință TF-IDF în doar 4 linii folosind sklearn. Acum înțelegem cât de puternic este TF-IDF ca instrument pentru procesarea datelor textuale dintr-un corpus. Pentru a afla mai multe despre sklearn TF-IDF, puteți utiliza acest link.

Codificare fericită!

Vă mulțumim că ați citit acest articol. Asigurați-vă că îl împărtășiți dacă vi se pare de ajutor.

Pentru mai multe informații despre programare, mă puteți urmări, astfel încât să primiți o notificare de fiecare dată când vin cu un post nou.

Noroc!

De asemenea, Hai să ne conectăm Stare de nervozitate, Linkedin, Github și Facebook.