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
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Klasse | eine Gruppe, der ein Text zugeordnet wird | spam |
| Trainingstexte | Texte, deren Klasse bekannt ist und aus denen gezählt wird | |
| Glättung | zu jeder Zählung 1 addieren, damit nie 0 herauskommt | |
| Wert einer Klasse | das Produkt der Wahrscheinlichkeiten aller Wörter des Textes | |
| Genauigkeit | der 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
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
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“
| Wort | Klasse | Zählung plus 1 | Wörter plus Vokabular | Wahrscheinlichkeit |
|---|---|---|---|---|
| geld | Spam | 2 + 1 = 3 | 6 + 10 = 16 | 3 / 16 |
| jetzt | Spam | 2 + 1 = 3 | 6 + 10 = 16 | 3 / 16 |
| geld | normal | 0 + 1 = 1 | 8 + 10 = 18 | 1 / 18 |
| jetzt | normal | 1 + 1 = 2 | 8 + 10 = 18 | 2 / 18 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Eine geglättete Wahrscheinlichkeit
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
# 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“
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.