Sådan behandles tekstdata ved hjælp af TF-IDF i Python

Computere er gode med tal, men ikke så meget med tekstdata. En af de mest anvendte teknikker til behandling af tekstdata er TF-IDF. I denne artikel lærer vi, hvordan det fungerer, og hvad er dets funktioner.

Fra vores intuition mener vi, at de ord, der vises oftere, burde have større vægt i tekstdata-analyse, men det er ikke altid tilfældet. Ord som “the”, “will” og “you” - kaldet stopord - vises mest i et korpus af tekst, men har meget ringe betydning. I stedet for er de ord, der er sjældne, dem, der rent faktisk hjælper med at skelne mellem dataene og har mere vægt.

En introduktion til TF-IDF

TF-IDF står for "Term Frequency - Inverse Data Frequency". Først vil vi lære, hvad dette udtryk betyder matematisk.

Term Frekvens (tf) : giver os hyppigheden af ​​ordet i hvert dokument i corpus. Det er forholdet mellem antallet af gange ordet vises i et dokument sammenlignet med det samlede antal ord i det dokument. Det øges, når antallet af forekomster af dette ord i dokumentet øges. Hvert dokument har sin egen tf.

Invers datafrekvens (idf): bruges til at beregne vægten af ​​sjældne ord på tværs af alle dokumenter i corpus. De ord, der sjældent forekommer i corpus, har en høj IDF-score. Det er givet ved ligningen nedenfor.

Ved at kombinere disse to kommer vi med TF-IDF score (w) for et ord i et dokument i corpus. Det er produktet af tf og idf:

Lad os tage et eksempel for at få en klarere forståelse.

Sætning 1: Bilen køres på vejen.

Sætning 2: Lastbilen køres på motorvejen.

I dette eksempel er hver sætning et separat dokument.

Vi beregner nu TF-IDF for de to ovenstående dokumenter, der repræsenterer vores korpus.

Fra ovenstående tabel kan vi se, at TF-IDF for almindelige ord var nul, hvilket viser, at de ikke er signifikante. På den anden side er TF-IDF af "bil", "lastbil", "vej" og "motorvej" ikke-nul. Disse ord har større betydning.

Brug af Python til at beregne TF-IDF

Lad os nu kode TF-IDF i Python fra bunden. Derefter vil vi se, hvordan vi kan bruge sklearn til at automatisere processen.

Funktionen computeTFberegner TF-scoren for hvert ord i corpus, efter dokument.

Funktionen computeIDFberegner IDF-score for hvert ord i corpus.

Funktionen computeTFIDFnedenfor beregner TF-IDF score for hvert ord ved at multiplicere TF og IDF score.

Outputtet produceret af ovenstående kode til sættet af dokumenter D1 og D2 er det samme som det manuelt beregnet ovenfor i tabellen.

Du kan henvise til dette link for den komplette implementering.

sklearn

Nu vil vi se, hvordan vi kan implementere dette ved hjælp af sklearn i Python.

Først importerer vi TfidfVectorizerfra sklearn.feature_extraction.text:

Nu vil vi initialisere vectorizerog derefter kalde tilpasning og transformere over den for at beregne TF-IDF score for teksten.

Under emhætten udfører sklearn fit_transform følgende fit og transformfunktioner. Disse kan findes i det officielle sklearn-bibliotek på 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

En ting at bemærke i ovenstående kode er, at i stedet for kun loggen over n_samples er der blevet føjet 1 til n_samples for at beregne IDF-score. Dette sikrer, at ordene med en IDF-score på nul ikke bliver undertrykt helt.

Det opnåede output er i form af en skæv matrix, som normaliseres for at få følgende resultat.

Således så vi, hvordan vi nemt kan kode TF-IDF på kun 4 linjer ved hjælp af sklearn. Nu forstår vi, hvor kraftig TF-IDF er som et værktøj til at behandle tekstdata ud af et korpus. For at lære mere om sklearn TF-IDF, kan du bruge dette link.

God kodning!

Tak, fordi du læste denne artikel. Sørg for at dele det, hvis du finder det nyttigt.

For mere om programmering kan du følge mig, så du får besked, hver gang jeg kommer med et nyt indlæg.

Skål!

Lad os også få forbindelse på Twitter , Linkedin , Github og Facebook .