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

Textklassifikation: Spam mit Wortzählung erkennen

Nach dieser Lektion: Ich kann einen Text mit Wortzählungen einer Klasse zuordnen.

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

Was ist Textklassifikation?

Textklassifikation heißt, einen Text einer von mehreren Klassen zuzuordnen, zum Beispiel „Spam“ oder „kein Spam“. Ein einfaches Verfahren dafür zählt, welche Wörter in welcher Klasse häufig sind (naive Bayes-Klassifikation).

Das Postfach einer Hochschule bekommt täglich tausende Mails. Ein Filter, der nur zählt, trennt die meisten davon schon erstaunlich gut.

Am Ende dieser Lektion

Notiz

Ich kann einen Text mit Wortzählungen einer Klasse zuordnen.

Schlüsselwörter

BegriffWas er bedeutetBeispiel
Klasseeine Gruppe, der ein Text zugeordnet wirdspam
TrainingstexteTexte, deren Klasse bekannt ist und aus denen gezählt wird
Glättungzu jeder Zählung 1 addieren, damit nie 0 herauskommt
Wert einer Klassedas Produkt der Wahrscheinlichkeiten aller Wörter des Textes
Genauigkeitder Anteil der richtig eingeordneten Texte

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

Zuerst zählt man die Wörter jeder Klasse

Sammeln Sie Trainingstexte, deren Klasse Sie kennen. Zählen Sie für jede Klasse, wie oft jedes Wort vorkommt und wie viele Wörter es insgesamt sind.

Im Beispiel gibt es zwei Spam-Nachrichten und zwei normale. Das sind zwei Bags of Words, eines je Klasse.

Die Wörter einer Klasse zählen

Code: python
spam = ["gratis geld jetzt", "geld gewinnen jetzt"]
zaehlungen = {}
gesamt = 0
for text in spam:
    for wort in text.split():
        if wort in zaehlungen:
            zaehlungen[wort] = zaehlungen[wort] + 1
        else:
            zaehlungen[wort] = 1
        gesamt = gesamt + 1
print(zaehlungen)
print("Wörter insgesamt:", gesamt)
# Fügen Sie eine dritte Spam-Nachricht hinzu.

Ein Wort in einer Klasse zählen

Befehl
docker exec jupyter python3 -c "print('gratis geld jetzt geld gewinnen jetzt'.split().count('geld'))"

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

Jedes Wort bekommt eine Wahrscheinlichkeit je Klasse

Teilen Sie die Zählung eines Wortes durch die Zahl aller Wörter der Klasse. So wird aus „geld“ im Spam 2 von 6.

Ein Wort, das in der Klasse nie vorkam, hätte 0 und löschte das ganze Produkt aus. Deshalb addiert man 1 zur Zählung und die Größe des Vokabulars zum Nenner. Das heißt Glättung.

Beispiel: die Wörter „geld“ und „jetzt“

WortKlasseZählung plus 1Wörter plus VokabularWahrscheinlichkeit
geldSpam2 + 1 = 36 + 10 = 163 / 16
jetztSpam2 + 1 = 36 + 10 = 163 / 16
geldnormal0 + 1 = 18 + 10 = 181 / 18
jetztnormal1 + 1 = 28 + 10 = 182 / 18

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

Eine geglättete Wahrscheinlichkeit

Befehl
docker exec jupyter python3 -c "print((2 + 1) / (6 + 10))"

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

Ein häufiger Fehler

Warnung

Viele denken, ein einzelnes Wort wie „gratis“ entscheide. Das Verfahren multipliziert die Wahrscheinlichkeiten aller Wörter. Ein Wort kann in beiden Klassen vorkommen, und die übrigen Wörter geben den Ausschlag.

Die Klasse mit dem größeren Wert gewinnt

Multiplizieren Sie für einen neuen Text die Wahrscheinlichkeiten seiner Wörter, einmal je Klasse. Das ist der Wert einer Klasse. Die Klasse mit dem größeren Wert bekommt den Text.

Hier gibt es gleich viele Trainingstexte je Klasse. Sonst käme noch die Häufigkeit der Klasse selbst dazu.

Den Wert einer Klasse berechnen

Code: python
# Zählungen der Klasse Spam aus dem Beispiel.
zaehlungen = {"gratis": 1, "geld": 2, "jetzt": 2, "gewinnen": 1}
gesamt = 6
groesse = 10
text = "geld jetzt"
ergebnis = 1.0
for wort in text.split():
    anzahl = 0
    if wort in zaehlungen:
        anzahl = zaehlungen[wort]
    ergebnis = ergebnis * (anzahl + 1) / (gesamt + groesse)
print(round(ergebnis, 4))
# Setzen Sie text auf "vorlesung". Wie ändert sich der Wert?

Beide Werte für „geld jetzt“

Befehl
docker exec jupyter python3 -c "print(round(3 / 16 * 3 / 16, 4), round(1 / 18 * 2 / 18, 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.

Das Verfahren ist so gut wie seine Beispiele

Messen Sie die Genauigkeit an Texten, die nicht zum Training gehörten. Sonst lobt man nur das Auswendiglernen.

Das Verfahren kennt keine Bedeutung und keine Wortreihenfolge. Hat der Trainingstext eine Schlagseite, hat sie auch der Filter.

Ü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.