So verarbeiten Sie Textdaten mit TF-IDF in Python

Computer können gut mit Zahlen umgehen, aber nicht so gut mit Textdaten. Eine der am häufigsten verwendeten Techniken zur Verarbeitung von Textdaten ist TF-IDF. In diesem Artikel erfahren Sie, wie es funktioniert und welche Funktionen es bietet.

Aus unserer Intuition heraus denken wir, dass die Wörter, die häufiger vorkommen, bei der Analyse von Textdaten ein größeres Gewicht haben sollten, aber das ist nicht immer der Fall. Wörter wie „das“, „der Wille“ und „Sie“ - Stoppwörter genannt - kommen in einem Textkorpus am häufigsten vor, sind jedoch von sehr geringer Bedeutung. Stattdessen sind die seltenen Wörter diejenigen, die tatsächlich bei der Unterscheidung zwischen den Daten helfen und mehr Gewicht haben.

Eine Einführung in TF-IDF

TF-IDF steht für "Term Frequency - Inverse Data Frequency". Zunächst lernen wir, was dieser Begriff mathematisch bedeutet.

Termhäufigkeit (tf) : Gibt die Häufigkeit des Wortes in jedem Dokument im Korpus an. Dies ist das Verhältnis der Häufigkeit, mit der das Wort in einem Dokument erscheint, zur Gesamtzahl der Wörter in diesem Dokument. Sie nimmt zu, wenn die Anzahl der Vorkommen dieses Wortes im Dokument zunimmt. Jedes Dokument hat seinen eigenen tf.

Inverse Datenfrequenz (idf): Wird verwendet, um das Gewicht seltener Wörter für alle Dokumente im Korpus zu berechnen. Die Wörter, die selten im Korpus vorkommen, haben eine hohe IDF-Punktzahl. Es ist durch die folgende Gleichung gegeben.

Wenn wir diese beiden kombinieren, erhalten wir den TF-IDF-Score (w) für ein Wort in einem Dokument im Korpus. Es ist das Produkt von tf und idf:

Nehmen wir ein Beispiel, um ein klareres Verständnis zu erhalten.

Satz 1: Das Auto wird auf der Straße gefahren.

Satz 2: Der LKW wird auf der Autobahn gefahren.

In diesem Beispiel ist jeder Satz ein separates Dokument.

Wir werden nun die TF-IDF für die beiden oben genannten Dokumente berechnen, die unseren Korpus darstellen.

Aus der obigen Tabelle können wir sehen, dass die TF-IDF der gebräuchlichen Wörter Null war, was zeigt, dass sie nicht signifikant sind. Andererseits sind die TF-IDF von "Auto", "LKW", "Straße" und "Autobahn" ungleich Null. Diese Wörter haben mehr Bedeutung.

Verwenden von Python zum Berechnen von TF-IDF

Lassen Sie uns jetzt TF-IDF in Python von Grund auf neu codieren. Danach werden wir sehen, wie wir sklearn verwenden können, um den Prozess zu automatisieren.

Die Funktion computeTFberechnet die TF-Punktzahl für jedes Wort im Korpus nach Dokument.

Die Funktion computeIDFberechnet die IDF-Bewertung jedes Wortes im Korpus.

Die folgende Funktion computeTFIDFberechnet die TF-IDF-Bewertung für jedes Wort durch Multiplizieren der TF- und IDF-Bewertungen.

Die Ausgabe, die durch den obigen Code für den Satz von Dokumenten D1 und D2 erzeugt wird, ist dieselbe wie die, die wir oben in der Tabelle manuell berechnet haben.

Unter diesem Link finden Sie die vollständige Implementierung.

sklearn

Jetzt werden wir sehen, wie wir dies mit sklearn in Python implementieren können.

Zuerst importieren wir TfidfVectorizeraus sklearn.feature_extraction.text:

Jetzt werden wir die initialisieren vectorizerund dann fit aufrufen und darüber transformieren, um die TF-IDF-Punktzahl für den Text zu berechnen.

Unter der Haube führt sklearn fit_transform Folgendes fit und transformFunktionen aus. Diese finden Sie in der offiziellen sklearn-Bibliothek bei 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

Im obigen Code ist zu beachten, dass anstelle des Protokolls von n_samples 1 zu n_samples hinzugefügt wurde, um die IDF-Bewertung zu berechnen. Dies stellt sicher, dass die Wörter mit einer IDF-Bewertung von Null nicht vollständig unterdrückt werden.

Die erhaltene Ausgabe erfolgt in Form einer verzerrten Matrix, die normalisiert wird, um das folgende Ergebnis zu erhalten.

So haben wir gesehen, wie wir TF-IDF mit sklearn einfach in nur 4 Zeilen codieren können. Jetzt verstehen wir, wie leistungsfähig TF-IDF als Werkzeug zur Verarbeitung von Textdaten aus einem Korpus ist. Um mehr über sklearn TF-IDF zu erfahren, können Sie diesen Link verwenden.

Viel Spaß beim Codieren!

Vielen Dank für das Lesen dieses Artikels. Teilen Sie es unbedingt mit anderen, wenn Sie es hilfreich finden.

Wenn Sie mehr über das Programmieren erfahren möchten, können Sie mir folgen, damit Sie jedes Mal benachrichtigt werden, wenn ich einen neuen Beitrag verfasse.

Prost!

Also, Let’s get connected on Twitter, Linkedin, Github and Facebook.