TF-IDF steht für Term Frequency-Inverse Document Frequency. Es ist eine statistische Methode, die zum Beispiel zur Verbesserung von Suchmaschinen oder für Empfehlungssysteme genutzt wird. Ziel ist es, die Bedeutung eines Begriffs (Term) innerhalb eines bestimmten Dokuments in einem Korpus (einer größeren Sammlung von Dokumenten) zu bestimmen.
Wie funktioniert Term Frequency-Inverse Document Frequency?
Wie der Name schon sagt, setzt sich TF-IDF aus zwei Komponenten zusammen:
- Term Frequency (TF):
- Gibt an, wie oft ein bestimmter Term t in einem Dokument d vorkommt.
- Je häufiger ein Wort in einem Dokument vorkommt, desto relevanter könnte es für dieses Dokument sein.
- Mathematische Darstellung:
\( TF(t,D) = \frac{\text{Anzahl der Vorkommen von t in d}}{\text{Gesamtzahl der Wörter in d}}
\)
- Inverse Document Frequency (IDF)
- Misst, wie einzigartig ein Term in der gesamten Dokumentensammlung ist.
- Je seltener ein Wort in der gesamten Sammlung vorkommt, desto informativer ist es.
- Mathematische Darstellung:
\( IDF(t) = \log \left( \frac{N}{\text{Anzahl der Dokumente, die t enthalten}} \right)
\)- N ist die Gesamtzahl der Dokumente in der Sammlung.
TF-IDF
- Um die endgültige TF-IDF-Gewichtung eines Terms in einem Dokument zu erhalten, multipliziert man die TF mit der IDF:
\( \text{TF-IDF}(t,d) = TF(t,d) * IDF(t)\)
Beispiel
Ein einfaches Beispiel soll das Prinzip von TF-IDF verdeutlichen, dabei werden die TF-IDF-Werte für das Wort „Pizza“ berechnet. Angenommen, es gibt drei kurze Sätze als Dokumente:
- Dokument 1: „Ich liebe Pizza.“
- Dokument 2: „Heute mache ich mir eine Pizza.“
- Dokument 3: „Gestern habe Pizza und Pasta gegessen.“
Jetzt werden die TF-IDF-Werte für das Wort „Pizza“ in jedem Dokument berechnet:
Schritt 1: Term Frequency (TF) berechnen
Die Termfrequenz (TF) eines Begriffs t in einem Dokument d ist die Anzahl der Vorkommen von t geteilt durch die Gesamtanzahl der Wörter in d.
- Dokument 1:
- Anzahl der Wörter: 3 („Ich“, „liebe“, „Pizza“)
- Häufigkeit von „Pizza“: 1
- TF(„Pizza“, Dokument 1) \( = \frac{1}{3} \approx 0.333 \)
- Dokument 2:
- Anzahl der Wörter: 6 („Heute“, „mache“, „ich“, „mir“, „eine“, „Pizza“)
- Häufigkeit von „Pizza“: 1
- TF(„Pizza“, Dokument 2) \( = \frac{1}{6} \approx 0.167 \)
- Dokument 3:
- Anzahl der Wörter: 7 („Gestern“, „habe“, „ich“, „Pizza“, „und“, „Pasta“, „gegessen“)
- Häufigkeit von „Pizza“: 1
- TF(„Pizza“, Dokument 3) \( = \frac{1}{7} \approx 0.143 \)
Schritt 2: Inverse Document Frequency (IDF) berechnen
Die inverse Dokumentfrequenz (IDF) eines Begriffs t wird wie folgt berechnet:
\( IDF(t,D) = \log \left( \frac{N}{1 + | \{d \in D : t \in d \} | } \right)
\)
Dabei ist:
- N: Die Gesamtzahl der Dokumente im Korpus.
- \( | \{d \in D : t \in d \} | \): Die Anzahl der Dokumente, die den Begriff t enthalten.
- Anzahl der Dokumente N=3
- Anzahl der Dokumente mit „Pizza“: 3 (alle Dokumente enthalten „Pizza“)
\( IDF(„Pizza“,D) = \log \left( \frac{3}{1 + 3} \right) \approx -0.2877
\)
- Hier wurde, wie bei scikit-learn üblich, der natürliche Logarithmus zur Basis e genutzt.
Schritt 3: TF-IDF berechnen
Die TF-IDF-Werte werden durch Multiplikation der TF- und IDF-Werte berechnet.
- Dokument 1:
- TF-IDF(„Pizza“, Dokument 1) \(= 0.333 * (-0.2877) \approx -0.0959\)
- Dokument 2:
- TF-IDF(„Pizza“, Dokument 2) \(= 0.167 * (-0.2877) \approx -0.0480\)
- Dokument 3:
- TF-IDF(„Pizza“, Dokument 3) \(= 0.143 * (-0.2877) \approx -0.0411\)
Interpretation
In diesem Beispiel sind die TF-IDF-Werte für das Wort „Pizza“ in allen Dokumenten negativ, was darauf hinweist, dass das Wort in allen Dokumenten des kleinen Korpus häufig vorkommt und daher nicht besonders informativ ist. In einem realistischeren Szenario mit einem größeren Korpus und vielfältigeren Begriffen würde TF-IDF hilfreich sein, um bedeutungsvollere Begriffe zu identifizieren.
Anwendungsbereiche von TF-IDF
- Information Retrieval: Verbesserung von Suchmaschinen, um relevantere Ergebnisse zu liefern.
- Text Mining: Identifizierung wichtiger Themen und Begriffe in großen Textkorpora.
- Empfehlungssysteme: Erstellung personalisierter Empfehlungen basierend auf Nutzerverhalten.
- Natural Language Processing: Aufgaben wie Textklassifikation und Clustering.
Zusammenfassung
TF-IDF ist ein einfaches, aber leistungsstarkes Werkzeug, um die Bedeutung von Wörtern in Texten zu quantifizieren. Es hilft, häufige, aber wenig informative Wörter wie „und“ oder „der“ zu identifizieren und unterdrücken, während es seltene, aber bedeutungsvolle Wörter hervorhebt. Durch das Verständnis und die Anwendung von TF-IDF können bessere Einblicke in die Textdaten gewonnen und effektivere Informationsverarbeitungs- und Suchmaschinenalgorithmen entwickelt werden.
Anmerkungen
- Es gibt verschiedene Varianten der TF-IDF-Berechnung, z.B. mit logarithmischer Skalierung oder Normierung.
- Die TF-IDF-Berechnung in scikit-learn’s TfidfTransformer und TfidfVectorizer unterscheiden sich leicht von der oben erwähnten Standard Textbuch Notation indem die IDF folgendermaßen definiert ist:
\( idf(t) = \log \left( \frac{1+N}{1+\text{Anzahl der Dokumente, die t enthalten}} \right) + 1
\)
- Die TF-IDF-Berechnung in scikit-learn’s TfidfTransformer und TfidfVectorizer unterscheiden sich leicht von der oben erwähnten Standard Textbuch Notation indem die IDF folgendermaßen definiert ist:
- TF-IDF ist nur eine von vielen Methoden zur Feature-Extraktion in Textdaten.
- Für komplexere Aufgaben werden oft Kombinationen aus TF-IDF und anderen Techniken eingesetzt.
Implementierung in Python
Mit dem Python package scitkit-learn lässt sich eine Implementierung ziemlich schnell umsetzen:
# Importiere Pakete
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
# Text Korpus
corpus = [
„Ich liebe Pizza.“,
„Heute mache ich mir eine Pizza.“,
„Gestern habe ich Pizza und Pasta gegessen.“
]
# Initialisiere TF-IDF Vectorizer
tfidf_vectorizer = TfidfVectorizer()
# Berechne TF-IDF Vektor
tfidf_vector = tfidf_vectorizer.fit_transform(corpus)
# Speichere Vektor in pandas dataframe
df_tfidf = pd.DataFrame(tfidf_vector.toarray(), columns=tfidf_vectorizer.get_feature_names_out())
# Zeige dataframe
df_tfidf
Damit ergibt sich folgende Ausgabe: