Kako obraditi tekstualne podatke pomoću TF-IDF-a u Pythonu

Računala su dobra s brojevima, ali ne toliko s tekstualnim podacima. Jedna od najčešće korištenih tehnika za obradu tekstualnih podataka je TF-IDF. U ovom ćemo članku naučiti kako to funkcionira i koje su njegove značajke.

Iz naše intuicije mislimo da bi riječi koje se pojavljuju češće trebale imati veću težinu u analizi tekstualnih podataka, ali to nije uvijek slučaj. Riječi poput "the", "will" i "you" - nazvane zaustavnim riječima - pojavljuju se najviše u korpusu teksta, ali su od vrlo malog značaja. Umjesto toga, rijetke su riječi koje zapravo pomažu u razlikovanju podataka i imaju veću težinu.

Uvod u TF-IDF

TF-IDF je kratica za „Termin Frekvencija - inverzna frekvencija podataka“. Prvo ćemo naučiti što ovaj pojam matematički znači.

Frekvencija pojma (tf) : daje nam učestalost riječi u svakom dokumentu u korpusu. To je omjer broja pojavljivanja riječi u dokumentu u odnosu na ukupan broj riječi u tom dokumentu. Povećava se kako se povećava broj pojavljivanja te riječi u dokumentu. Svaki dokument ima svoj tf.

Inverzna frekvencija podataka (idf): koristi se za izračunavanje težine rijetkih riječi u svim dokumentima u korpusu. Riječi koje se rijetko javljaju u korpusu imaju visoku ocjenu IDF-a. Daje se jednadžbom u nastavku.

Kombinirajući ovo dvoje dolazimo do rezultata TF-IDF (w) za riječ u dokumentu u korpusu. Proizvod je tf i idf:

Uzmimo primjer da bismo dobili jasnije razumijevanje.

Rečenica 1: Automobil se vozi cestom.

Rečenica 2: Kamion se vozi autocestom.

U ovom primjeru svaka je rečenica zaseban dokument.

Sada ćemo izračunati TF-IDF za gornja dva dokumenta koja predstavljaju naš korpus.

Iz gornje tablice možemo vidjeti da je TF-IDF uobičajenih riječi bio nula, što pokazuje da nisu značajne. S druge strane, TF-IDF "automobila", "kamiona", "ceste" i "autoceste" nije nula. Te riječi imaju veće značenje.

Korištenje Pythona za izračunavanje TF-IDF-a

Omogućimo sada kodiranje TF-IDF u Pythonu od nule. Nakon toga vidjet ćemo kako možemo koristiti sklearn za automatizaciju procesa.

Funkcija computeTFizračunava TF rezultat za svaku riječ u korpusu, prema dokumentu.

Funkcija computeIDFizračunava IDF rezultat svake riječi u korpusu.

Funkcija u computeTFIDFnastavku izračunava TF-IDF rezultat za svaku riječ množenjem TF i IDF rezultata.

Izlaz koji daje gornji kod za skup dokumenata D1 i D2 jednak je onome što smo ručno izračunali gore u tablici.

Kompletnu implementaciju možete potražiti na ovoj poveznici.

sklearn

Sad ćemo vidjeti kako to možemo implementirati koristeći sklearn u Pythonu.

Prvo ćemo uvoziti TfidfVectorizeriz sklearn.feature_extraction.text:

Sada ćemo inicijalizirati, vectorizera zatim nazvati fit i transformirati preko njega da bismo izračunali TF-IDF rezultat za tekst.

Ispod haube, sklearn fit_transform izvršava sljedeće fit i transformfunkcije. Oni se mogu naći u službenoj knjižnici sklearn na GitHubu.

 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

Jedna stvar koju treba primijetiti u gornjem kodu je da je, umjesto samo zapisniku n_samples, u n_samples dodan 1 za izračunavanje IDF rezultata. To osigurava da se riječi s IDF rezultatom nula ne potisnu u potpunosti.

Dobiveni izlaz je u obliku iskrivljene matrice, koja se normalizira da bi se dobio sljedeći rezultat.

Tako smo vidjeli kako možemo lako kodirati TF-IDF u samo 4 retka pomoću sklearna. Sada razumijemo koliko je moćan TF-IDF alat za obradu tekstualnih podataka iz korpusa. Da biste saznali više o sklearn TF-IDF, možete koristiti ovu vezu.

Sretno kodiranje!

Hvala što ste pročitali ovaj članak. Obavezno ga podijelite ako vam pomogne.

Za više informacija o programiranju možete me pratiti kako biste dobivali obavijesti svaki put kad smislim novi post.

Živjeli!

Također, povezimo se na Twitter , Linkedin , Github i Facebook .