Was heißt Texte aufbereiten?
Textaufbereitung (englisch text preprocessing) macht aus rohem Text saubere Tokens, mit denen ein Index und ein Ranking arbeiten können. Dazu gehören Kleinschreibung, das Entfernen von Satzzeichen und Stoppwörtern und das Zurückführen von Wörtern auf ihren Stamm.
Wer „Tische“ sucht, will auch „Tisch“ finden. Ohne Aufbereitung sind das zwei verschiedene Wörter, und die Suche übersieht Treffer.
Am Ende dieser Lektion
Notiz
Ich kann rohen Text in gute Tokens verwandeln.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Token | ein Stück Text, mit dem der Index arbeitet | mensa |
| Normalisierung | Text in eine einheitliche Form bringen, etwa alles klein schreiben | |
| Stoppwort | ein sehr häufiges Wort, das beim Suchen wenig hilft | die, und, der |
| Wortstamm | der Kern eines Wortes ohne Endung | tisch |
| Stemming | das Zurückführen von Wörtern auf den Stamm mit einfachen Regeln | |
| Kompositum | ein zusammengesetztes Wort | Mensaessen |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Satzzeichen und Großbuchstaben stören die Suche
Teilt man „Uhr!“ am Leerzeichen, bleibt das Ausrufezeichen am Wort hängen. Für ein Programm ist „Uhr!“ ein anderes Wort als „Uhr“. Ebenso unterscheidet es „Mensa“ von „mensa“.
Darum schreibt man alles klein und ersetzt Satzzeichen durch ein Leerzeichen. Bindestriche gehören dazu: Aus „Kaffee-Automat“ werden zwei Tokens.
Einen Text in saubere Tokens zerlegen
text = "Die Mensa (neu) oeffnet um 11 Uhr! Kaffee-Automat: 24 Stunden."
text = text.lower()
for zeichen in ".,;:!?()-":
text = text.replace(zeichen, " ")
tokens = text.split()
print(tokens)
print(len(tokens), "Tokens")
# Ersetzen Sie das Leerzeichen im Aufruf durch "". Was passiert mit "Kaffee-Automat"?
Der rohe Text im Terminal
docker exec jupyter python3 -c "print('Die Mensa (neu) oeffnet um 11 Uhr!'.lower().split())"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Zusammengesetzte Wörter bleiben ein einziges Token
Der Befehl zeigt: Die Klammern und das Ausrufezeichen kleben noch an den Wörtern. Eine einfache Zerlegung kennt also nur Leerzeichen und die Zeichen, die Sie ihr nennen.
Deutsch hat eine zweite Schwierigkeit: Es setzt Wörter zusammen. „Donaudampfschifffahrt“ bleibt ein einziges Token, und wer „Dampf“ sucht, findet es nicht. Dasselbe gilt für „Mensaessen“ und „essen“.
Ein zusammengesetztes Wort im Terminal
docker exec jupyter python3 -c "print('Donaudampfschifffahrt'.lower().split(), 'dampf' in 'Donaudampfschifffahrt'.lower().split())"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Stoppwörter tragen wenig Inhalt
Wörter wie „die“, „und“ oder „der“ stehen in fast jedem Text. Ihr idf ist nahe null, sie helfen also kaum beim Ranking. Man führt eine Liste solcher Stoppwörter und streicht sie vor dem Indexieren.
Das spart Platz im Index. Es ist aber eine Entscheidung: „Sein oder Nichtsein“ besteht fast nur aus Stoppwörtern.
Ein Wortstamm führt Formen eines Wortes zusammen
Im Deutschen ändert ein Wort seine Endung: Tisch, Tische, Tischen. Beim Stemming schneidet eine einfache Regel bekannte Endungen ab. Alle drei Formen werden zum Stamm „tisch“.
Die Regel ist grob. Sie vermischt manchmal Wörter und trennt manchmal Formen, die zusammengehören. Das zeigt die nächste Tabelle.
Beispiel: eine einfache Endungsregel in Aktion
| Wort | Stamm | Urteil |
|---|---|---|
| nudeln | nudel | gut, die Mehrzahl wird zurückgeführt |
| tische, tischen | tisch | gut, beide Formen treffen sich |
| mensa, mensen | mensa, mens | schlecht, die Formen treffen sich nicht |
| buecher, buch | buech, buch | schlecht, der Umlaut verhindert das Treffen |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Endungen mit einer Regel abschneiden
endungen = ["ern", "en", "er", "e", "n", "s"]
def kuerzen(wort):
for ende in endungen:
if wort.endswith(ende) and len(wort) - len(ende) >= 3:
return wort[:len(wort) - len(ende)]
return wort
for wort in ["nudeln", "tische", "tischen", "mensa", "mensen", "buecher", "buch"]:
print(wort, "->", kuerzen(wort))
# Welche Wörter führt diese Regel richtig zusammen, welche nicht?
Stoppwörter im Terminal streichen
docker exec jupyter python3 -c "print([w for w in 'die mensa und die bibliothek'.split() if w not in ['die', 'und']])"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 Stamm sei immer ein richtiges Wort. Das stimmt nicht. „Mensen“ wird zu „mens“. Das muss kein Wort sein, es muss nur für alle Formen gleich ausfallen.