Sprachverarbeitung, klassisch
Tokenisieren, Stammformen, TF-IDF, BM25 und Entitätenerkennung: Verfahren, die vor den Sprachmodellen da waren und in vielen Fällen weiterhin die bessere Wahl sind.
Die Idee
Lange bevor Sprachmodelle existierten, wurde Text maschinell verarbeitet: in Wörter zerlegt, auf Grundformen zurückgeführt, gezählt und gewichtet. Diese Verfahren sind nicht überholt, sondern erledigen einen Teil der Arbeit besser.
Was sie gut können
| Aufgabe | Klassisch | Sprachmodell |
|---|---|---|
| Aktenzeichen finden | sehr gut, exakt | unzuverlässig |
| IBAN prüfen | perfekt, mit Prüfsumme | unnötig |
| Häufigkeiten zählen | perfekt | ungeeignet |
| Nach Stichwort suchen | sehr gut | überflüssig |
| Sinn erfassen | schwach | sehr gut |
| Umformulieren | ungeeignet | sehr gut |
Die Verarbeitungskette
- 01
Normalisieren
Kleinschreibung, Unicode vereinheitlichen, Umlaute behandeln. Bei deutschen Texten gehört hierhin auch die Entscheidung über Komposita.
- 02
Zerlegen
In Wörter und Sätze. Für Deutsch gehören Abkürzungen mit Punkt in eine Ausnahmeliste, sonst zerfallen Sätze an „z. B." und „Abs.".
- 03
Grundformen bilden
Lemmatisierung ist bei Deutsch der Stammformbildung deutlich überlegen, weil die Flexion reicher ist.
- 04
Gewichten
TF-IDF oder BM25, je nachdem ob nur verglichen oder gesucht wird.
import re
# Muster, die ein Sprachmodell nicht zuverlaesser erkennt als eine Regel:
MUSTER = {
"IBAN": r"\b[A-Z]{2}\d{2}(?:[ ]?[A-Za-z0-9]{4}){2,7}\b",
"USt-IdNr": r"\b(?:ATU\d{8}|DE\d{9})\b",
"Datum": r"\b\d{1,2}\.\s?\d{1,2}\.\s?\d{2,4}\b",
"Aktenzeichen": r"\b\d+\s?[A-Za-z]{1,3}\s?\d+/\d{2}\b",
}
def extrahieren(text):
return {name: re.findall(p, text) for name, p in MUSTER.items()}TF-IDF und BM25
Die Sättigung ist der entscheidende Unterschied: Bei TF-IDF ist ein Dokument mit zwanzig Vorkommen doppelt so relevant wie eines mit zehn. Bei BM25 nähert sich der Beitrag einer Obergrenze, was der Wirklichkeit entspricht, weil das zwanzigste Vorkommen kaum neue Information trägt.
Deutsche Besonderheiten
- Komposita. „Rechnungsprüfungsverfahren" wird von einer Volltextsuche nicht gefunden, wenn nach „Prüfung" gesucht wird. Ein Zerlegungsverfahren für Komposita hebt den Recall deutlich.
- Flexion. „Vertrages", „Verträge", „Vertrag" gehören zusammengeführt. Ohne Lemmatisierung sinkt der Recall spürbar.
- Umlaute. Sowohl „Prüfung" als auch „Pruefung" müssen gefunden werden. Eine Normalisierung in beide Richtungen ist nötig.
- Fugen-s. Regelbasierte Zerlegung scheitert daran regelmäßig; ein Wörterbuchansatz ist verlässlicher.
Die Kombination
In der Praxis gewinnt fast immer eine hybride Suche: BM25 für genaue Begriffe, Vektorsuche für Bedeutung, und eine Zusammenführung über die Ränge. Der gemessene Recall@10 liegt dabei regelmäßig 5 bis 15 Punkte über jedem der beiden Verfahren allein. Siehe Vektordatenbanken.
Passende Kurse und Quellen
Hugging Face NLP-Kurs
Tokenisierung, Transformer, Feinabstimmung und Bereitstellung, durchgehend mit Code. Setzt Python voraus, dafür arbeitet man am Ende mit echten Modellen.
Für Entwicklung mit Sprachmodellen, wenn es über das Aufrufen einer Schnittstelle hinausgehen soll.
spaCy
Bibliothek für klassische Sprachverarbeitung. Für Erkennung von Namen, Wortarten und Struktur oft schneller, billiger und prüfbarer als ein Sprachmodell.
Wenn Namen, Wortarten oder Struktur gebraucht werden: oft schneller, billiger und prüfbarer als ein Sprachmodell.
Speech and Language Processing
Jurafsky und Martin, das Standardwerk der Sprachverarbeitung, kapitelweise frei. Deckt klassische Verfahren und Sprachmodelle in einem Bogen ab.
Für alle, die Sprachverarbeitung systematisch lernen wollen, klassisch und modern in einem Bogen.