Was ist TF-IDF?
TF-IDF (englisch term frequency, inverse document frequency) gibt jedem Wort in einem Dokument ein Gewicht. Das Gewicht sagt, wie typisch das Wort für genau dieses Dokument ist. Damit ordnet eine Suche ihre Treffer, sodass die besten oben stehen.
Die Anfrage „Mensa Nudeln“ findet viele Aushänge. Welcher soll zuerst kommen? Der mit dem seltenen, aussagekräftigen Wort.
Am Ende dieser Lektion
Notiz
Ich kann Dokumente danach ordnen, wie besonders ein Wort in ihnen ist.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Termhäufigkeit (tf) | wie oft ein Wort in einem Dokument steht, geteilt durch die Zahl seiner Wörter | 2 von 4 Wörtern: 0,5 |
| Dokumenthäufigkeit (df) | in wie vielen Dokumenten ein Wort steht | |
| inverse Dokumenthäufigkeit (idf) | ein Maß dafür, wie selten ein Wort in der ganzen Sammlung ist | |
| Gewicht | tf mal idf: wie wichtig ein Wort für ein Dokument ist | |
| Ranking | die Reihenfolge der Treffer, der beste zuerst |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Häufige Wörter sind wichtig für den Text
Wer in einem Aushang dreimal „Nudeln“ liest, weiß: Es geht um Nudeln. Die Termhäufigkeit (tf) zählt das Wort und teilt durch die Länge des Textes. So sind lange und kurze Texte vergleichbar.
Der Text „nudeln nudeln mit sauce“ hat vier Wörter, und „nudeln“ steht zweimal. Die Termhäufigkeit ist 2 geteilt durch 4, also 0,5.
Ein Wort, das überall vorkommt, sagt nichts
Das Wort „die“ steht in fast jedem deutschen Text. Es hilft nicht, ein Dokument zu finden. Ein seltenes Wort wie „Mensaplan“ hilft viel mehr.
Die Dokumenthäufigkeit (df) zählt die Dokumente mit dem Wort. Die inverse Dokumenthäufigkeit ist der Zehnerlogarithmus von N durch df. Dabei ist N die Zahl aller Dokumente. Der Zehnerlogarithmus zählt Nullen: Für 100 ist er 2.
Beispiel: idf bei hundert Dokumenten
| Das Wort steht in | N durch df | idf | Bedeutung |
|---|---|---|---|
| 100 Dokumenten | 100 durch 100 = 1 | 0 | sagt nichts, es steht überall |
| 50 Dokumenten | 100 durch 50 = 2 | 0,30 | hilft ein wenig |
| 10 Dokumenten | 100 durch 10 = 10 | 1 | hilft deutlich |
| 1 Dokument | 100 durch 1 = 100 | 2 | hilft am meisten |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Das Gewicht eines Wortes ausrechnen
import math
dokumente = [
"die mensa bietet nudeln mit sauce".split(),
"die mensa bietet salat mit kaese".split(),
"die bibliothek oeffnet um acht uhr".split(),
"die mensa oeffnet um elf uhr".split(),
]
wort = "nudeln"
tokens = dokumente[0]
tf = tokens.count(wort) / len(tokens)
df = 0
for text in dokumente:
if wort in text:
df = df + 1
idf = math.log10(len(dokumente) / df)
print("tf:", round(tf, 3))
print("df:", df)
print("idf:", round(idf, 3))
print("Gewicht:", round(tf * idf, 3))
# Setzen Sie wort auf "die". Warum ist das Gewicht null?
Drei idf-Werte im Terminal
docker exec jupyter python3 -c "import math; print(round(math.log10(4/1), 3), round(math.log10(4/3), 3), math.log10(4/4))"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Anfrage bekommt pro Dokument eine Summe
Das Gewicht eines Wortes ist tf mal idf. Eine Anfrage hat meist mehrere Wörter. Für jedes Dokument addiert man die Gewichte aller Anfragewörter. Wer die größte Summe hat, steht oben im Ranking.
Der Befehl oben zeigt die idf-Werte der vier Aushänge: „nudeln“ steht in einem von vier Texten und wiegt 0,602. „mensa“ steht in dreien und wiegt nur 0,125.
Beispiel: Ranking für „mensa nudeln“
| Dokument | Inhalt | Summe der Gewichte |
|---|---|---|
| 1 | die mensa bietet nudeln mit sauce | 0,121 |
| 2 | die mensa bietet salat mit kaese | 0,021 |
| 3 | die bibliothek oeffnet um acht uhr | 0 |
| 4 | die mensa oeffnet um elf uhr | 0,021 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein Ranking für eine Anfrage berechnen
import math
dokumente = [
"die mensa bietet nudeln mit sauce".split(),
"die mensa bietet salat mit kaese".split(),
"die bibliothek oeffnet um acht uhr".split(),
"die mensa oeffnet um elf uhr".split(),
]
anfrage = ["mensa", "nudeln"]
for nummer in range(len(dokumente)):
tokens = dokumente[nummer]
summe = 0
for wort in anfrage:
df = 0
for text in dokumente:
if wort in text:
df = df + 1
if df > 0:
summe = summe + tokens.count(wort) / len(tokens) * math.log10(len(dokumente) / df)
print("Dokument", nummer + 1, round(summe, 3))
# Ändern Sie die Anfrage zu ["mensa", "uhr"]. Wer liegt nun vorn?
Ein häufiger Fehler
Warnung
Viele denken, das häufigste Wort sei das wichtigste. Meist ist es das unwichtigste, etwa „die“. Wichtig ist, was in diesem Dokument oft und in der Sammlung selten vorkommt.
Die Termhäufigkeit im Terminal
docker exec jupyter python3 -c "t='nudeln nudeln mit sauce'.split(); print(t.count('nudeln') / len(t))"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.