Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Kosinusähnlichkeit: Dokumente im Vektorraum ranken

Nach dieser Lektion: Ich kann Dokumente nach dem Winkel zwischen ihren Vektoren ordnen.

Lektion, 55 Min.2 BefehleJupyterLab-Lab für Data Science: pandas, Matplotlib und scikit-learn im Browser

Was ist Kosinusähnlichkeit?

Die Kosinusähnlichkeit (englisch cosine similarity) misst, wie ähnlich zwei Texte sind. Dazu schreibt man jeden Text als Liste von Zahlen und vergleicht die Richtung der Listen. Damit ordnet eine Suche Dokumente danach, wie nah sie an der Anfrage liegen.

Zwei Aushänge über Nudeln sollen sich ähnlicher sein als einer über Nudeln und einer über die Bibliothek. Eine Zahl zwischen 0 und 1 drückt das aus.

Am Ende dieser Lektion

Notiz

Ich kann Dokumente nach dem Winkel zwischen ihren Vektoren ordnen.

Schlüsselwörter

BegriffWas er bedeutetBeispiel
Vektoreine Liste von Zahlen, hier eine Zahl pro Wort des Vokabulars[1, 2, 0, 0]
Vokabulardie Liste der Wörter, die der Vektor zählt
Skalarproduktdie Summe der Produkte gleicher Stellen zweier Vektoren
Längedie Wurzel aus der Summe der Quadrate der Stellen eines Vektors
KosinusähnlichkeitSkalarprodukt geteilt durch das Produkt der beiden Längen

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Ein Text wird zu einer Liste von Zahlen

Ein Programm rechnet mit Zahlen, nicht mit Wörtern. Man legt ein Vokabular fest, zum Beispiel mensa, nudeln, kaese, bibliothek. Für jeden Text zählt man, wie oft jedes Wort darin steht.

Aus „mensa nudeln nudeln“ wird so der Vektor [1, 2, 0, 0]. Jede Stelle gehört zu einem Wort. Jeder Text ist damit ein Punkt in einem Raum mit einer Achse pro Wort.

Texte in Zahlenlisten verwandeln

Code: python
vokabular = ["mensa", "nudeln", "kaese", "bibliothek"]
texte = [
    "mensa nudeln",
    "mensa nudeln nudeln",
    "mensa kaese",
    "bibliothek",
]
for text in texte:
    zaehler = []
    for wort in vokabular:
        zaehler.append(text.split().count(wort))
    print(text, "->", zaehler)
# Fügen Sie dem Vokabular das Wort "salat" hinzu. Wie lang wird jeder Vektor?

Einen Zählvektor im Terminal

Befehl
docker exec jupyter python3 -c "print(['mensa nudeln nudeln'.split().count(w) for w in ['mensa', 'nudeln', 'kaese', 'bibliothek']])"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Der Winkel sagt, wie ähnlich zwei Texte sind

Zeigen zwei Vektoren in dieselbe Richtung, sprechen die Texte über dasselbe. Der Kosinus des Winkels zwischen ihnen ist dann 1. Stehen sie senkrecht, haben die Texte kein gemeinsames Wort, und der Kosinus ist 0.

Man berechnet ihn so: Skalarprodukt geteilt durch die Länge des ersten Vektors mal die Länge des zweiten. Das Skalarprodukt multipliziert die gleichen Stellen und addiert.

Beispiel: vier Dokumente gegen eine Anfrage

DokumentVektorSkalarproduktKosinus
A[1, 2, 0, 0]30,949
B[1, 0, 1, 0]10,5
C[0, 0, 0, 1]00
D (A fünfmal wiederholt)[5, 10, 0, 0]150,949

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Den Kosinus ausrechnen

Code: python
import math

anfrage = [1, 1, 0, 0]
dokument = [1, 2, 0, 0]
skalarprodukt = 0
for i in range(len(anfrage)):
    skalarprodukt = skalarprodukt + anfrage[i] * dokument[i]
laenge_a = math.sqrt(anfrage[0] ** 2 + anfrage[1] ** 2 + anfrage[2] ** 2 + anfrage[3] ** 2)
laenge_d = math.sqrt(dokument[0] ** 2 + dokument[1] ** 2 + dokument[2] ** 2 + dokument[3] ** 2)
print("Skalarprodukt:", skalarprodukt)
print("Kosinus:", round(skalarprodukt / (laenge_a * laenge_d), 4))
# Setzen Sie dokument auf [0, 0, 0, 1]. Welchen Wert erhalten Sie?

Denselben Kosinus im Terminal

Befehl
docker exec jupyter python3 -c "import math; print(round(3 / (math.sqrt(5) * math.sqrt(2)), 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.

Der Kosinus ignoriert die Länge des Textes

In der Tabelle hat Dokument D fünfmal so viele Wörter wie A, aber dieselbe Richtung. Das Skalarprodukt wächst auf 15, der Kosinus bleibt bei 0,949. Ein langer Text gewinnt also nicht, nur weil er lang ist.

Darum nimmt man den Kosinus und nicht das Skalarprodukt allein. Die Suche ordnet die Dokumente nach dem Kosinus, der größte zuerst.

Ein häufiger Fehler

Warnung

Viele lesen einen Kosinus von 0 als „gegensätzlich“. Das stimmt hier nicht. Die Zählwerte sind nie negativ, 0 heißt nur: kein gemeinsames Wort. Ist ein Vektor nur Nullen, teilen Sie durch null. Fangen Sie das ab.

Über dieses Lab und seinen Quellcode: JupyterLab-Lab für Data Science: pandas, Matplotlib und scikit-learn im Browser

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.