Machine Learning: Besser kategorisieren mit Topic Modeling

Machine Learning kann dabei helfen, Texte zu kategorisieren. Ein gutes Framework für das Topic Modeling ist BERTopic.​

In Pocket speichern vorlesen Druckansicht

(Bild: Shutterstock.com/calimedia)

Lesezeit: 17 Min.
Von
  • Manuel Hartenfels
Inhaltsverzeichnis

Beim Bearbeiten von Kundenanfragen spielt die Kategorisierung eine zentrale Rolle. In vielen Prozessen ist das Einordnen in Themengebiete entscheidend für die korrekte Zuordnung zu einer Personengruppe, die die Anfrage bearbeiten soll.

Diese Klassifizierung bietet einen idealen Ansatzpunkt, um den Kundenanfrageprozess schrittweise zu automatisieren. Verfahren des maschinellen Lernens und insbesondere künstliche neuronale Netze sind gut geeignet. Da es sich bei den Anfragen häufig um Texte wie E-Mails handelt, ist vor allem das Teilgebiet Natural Language Processing (NLP) interessant. Es umfasst diverse Techniken zum Erfassen und Verarbeiten natürlicher Sprache.

Das Kategorisieren läuft üblicherweise folgendermaßen ab: Zunächst legt das Team ein Schema aus hierarchisch geordneten Kategorien fest, wofür es meist das Domänenwissen des Fachbereichs nutzt. Anschließend sammelt es Kundenanfragen und bestimmt deren Kategorie manuell (Labeling). Mit diesen Daten kann es einen geeigneten Algorithmus trainieren, um künftige Anfragen möglichst akkurat zu kategorisieren. Um die Qualität der Kategorisierung abschätzen zu können, nutzt das Team unterschiedliche Metriken wie die Genauigkeit (Accuracy).

Bei dieser Vorgehensweise liegt der Fokus auf dem Anlegen und Evaluieren eines geeigneten Klassifizierungsalgorithmus. Dabei verliert man jedoch schnell einen der Faktoren aus den Augen: das Erstellen des Kategorienschemas. Da es häufig eine Aufgabe des Fachbereiches ist, kann die algorithmische Sichtweise zu kurz kommen. Wenn die Verantwortlichen die Kategorien beispielsweise anhand des Organigramms oder nach Produktarten festlegen, kann es für einen Algorithmus schwierig sein, diese Zusammenhänge durch die Analyse von Kundenanfragen zu erkennen.

Wenn beispielsweise die Verantwortung für die Kategorien "Reklamation Produktverpackung" und "Reklamation Versandverpackung" in unterschiedlichen Abteilungen liegt, kann der Algorithmus Anfragen eventuell nicht passend zuordnen.

Um ein besseres Klassifizierungsergebnis zu erreichen, liegt es daher nahe, einem Algorithmus ohne Vorwissen das Erstellen eines Kategorienschemas zu überlassen.

Der gebräuchlichste Ansatz dafür ist das Topic Modeling. Dabei erhält der Algorithmus einen (ungelabelten) Datensatz, aus dem er die dominanten Themenfelder selbstständig extrahieren soll. Besonders einfach ist eine Umsetzung mit dem Framework BERTopic, das im Folgenden als Grundlage dient.

Damit ein Algorithmus mit geschriebenen Wörtern umgehen kann, gilt es zunächst, die Texte in eine numerische Repräsentation umzuwandeln. Häufig kommen dafür Embeddings zum Einsatz, die versuchen, Fragmente des Textes wie Wörter, Sätze, Abschnitte und Dokumente in Vektoren umzuwandeln und semantisch ähnliche Elemente innerhalb des Embedding-Raums nahe zueinander platzieren. Dafür existieren unterschiedliche Varianten wie Bag of Words, Word2Vec und Transformer-Modelle. Die Stärke von Letzteren liegt in ihrer Fähigkeit Kontext besonders gut abbilden zu können, weshalb sie bei BERTopic vornehmlich zum Einsatz kommen.

Die daraus resultierenden Vektoren sind hochdimensional. BERT-Modelle liefern beispielsweise Vektoren mit 768 Dimensionen oder mehr. Die hohe Zahl der Dimensionen birgt einige Herausforderungen, die sogenannte Curse of Dimensionality. Die offensichtlichsten sind eine höhere Komplexität der Modelle und damit einhergehend eine höhere Anforderung an die Rechenleistung. Weniger offensichtlich ist das Verhalten von Distanzmetriken in höherdimensionalen Räumen. Das Verhältnis zwischen dem Abstand eines Punktes zu seinem nächsten und zu dem am weitesten entfernten Nachbarn verliert an Aussagekraft, da es je nach gewählter Metrik entweder gegen null, gegen einen bestimmten Wert oder gegen unendlich tendiert. Daher gilt die Faustregel: Je höher die Dimension ist, desto niedriger sollte die Norm sein.

Das Ziel der Dimensionalitätenreduktion ist es, die Vektoren in einen Raum mit weniger Dimensionen zu transformieren und dabei möglichst wenige Informationen zu verlieren.

Ein passender Algorithmus, der auch häufig für die Visualisierung von Embeddings zum Einsatz kommt, ist t-Distributed Stochastic Neighbor Embedding (t-SNE). Er projiziert die hochdimensionalen Vektoren in einen zwei- oder dreidimensionalen Raum und versucht dabei, keine Informationen über deren Lokalität zu verlieren.

t-SNE projiziert in einem ersten Schritt die Daten beliebig in den neuen Raum. Anschließend berechnet er ein Ähnlichkeitsmaß für alle Punkte im ursprünglichen Raum. Dazu zentriert er eine Wahrscheinlichkeitsfunktion (im Fall von t-SNE meist eine T-Verteilung) um einen Punkt. Sie dient dazu, die Ähnlichkeit zu anderen Datenpunkten zu ermitteln. Die Metrik drückt aus, wie wahrscheinlich es ist, dass ein Punkt einen anderen als seinen Nachbarn auswählt. Anschließend verschiebt t-SNE die Daten in dem neuen Raum in einer Weise, bei der das Ähnlichkeitsmaß der Punkte möglichst gleich bleibt.

Eine Weiterentwicklung von t-SNE ist Uniform Manifold Approximation and Projection (UMAP). Der Algorithmus hat viele Gemeinsamkeiten mit t-SNE, optimiert jedoch zusätzlich einige Details. Unter anderem initialisiert er die Datenpunkte in dem neuen Raum nicht zufällig, und die Platzierung erfolgt nicht für alle Punkte gleichzeitig, sondern immer nur für einen kleinen Teil.

Diese Verbesserungen sorgen dafür, dass sich UMAP für größere Datensätze mit mehr Dimensionen eignet. Außerdem zeigt sich, dass der Algorithmus im Vergleich zu t-SNE lokale und globale Strukturen besser abbilden kann. Bei UMAP lässt sich die Anzahl der Dimensionen des Raums, in den der Algorithmus die Punkte projiziert, als Hyperparameter angeben. Bei BERTopic ist dieser Wert beispielsweise standardmäßig auf fünf eingestellt.

Um Gruppen mit ähnlichen Datenpunkten zu selektieren, kommt der Cluster-Algorithmus Hierarchical Density-Based Spatial Clustering of Applications with Noise (HDBSCAN) zum Einsatz. Dabei handelt es sich um ein dichtebasiertes, hierarchisches Clustering-Verfahren, das anders als Algorithmen wie k-Means keine Annahmen über die Form der Cluster macht. Zur Veranschaulichung soll ein Datensatz mit lediglich einer Dimension dienen.

Der beispielhafte Datensatz mit einer Dimension wurde mit einer Wahrscheinlichkeitsverteilung generiert, die aus drei Normalverteilungen zusammengesetzt ist (Abb.1 ).

Die Wahrscheinlichkeitsverteilung in Abbildung 2 zeigt, dass Bereiche mit einer hohen Punktdichte eine hohe Wahrscheinlichkeit haben.

Die Wahrscheinlichkeitsverteilung dient als Grundlage für den eindimensionalen Datensatz (Abb. 2).

Das bedeutet im Umkehrschluss, dass sich für eine bekannte Wahrscheinlichkeitsfunktion recht einfach Cluster, also Punkte mit einer hohen Dichte, extrahieren lassen. Dazu bestimmt man einfach einen beliebigen Grenzwert λ und definiert alle zusammenhängenden Punkte mit einer höheren Wahrscheinlichkeit als λ als Cluster. Das Bestimmen dieses Grenzwerts gestaltet sich jedoch schwierig und wenig intuitiv.

Außerdem funktioniert diese Herangehensweise bei Clustern mit unterschiedlichen Dichten nur eingeschränkt. Hinzu kommt, dass die Wahrscheinlichkeitsdichtefunktion eines Datensatzes selten bekannt ist. Um sie anzunähern, verwendet HDBSCAN den Abstand zu den n nächsten Nachbarpunkten. Anschaulich betrachtet sucht der Algorithmus für jeden Punkt einen Kreis, der eine Anzahl n nächster Nachbarn einschließt. Das Ergebnis heißt Core Distance. Je niedriger der Wert für einen Punkt, desto dichter ist die Region um ihn herum.

Dabei kommt die vorher durchgeführte Dimensionsreduktion zum Tragen, da bei einer zu hohen Zahl der Dimensionen die Gefahr bestünde, dass der Abstand zwischen allen Punkten ähnlich ist (Curse of Dimensionality). Der Kehrwert der Core Distance approximiert die tatsächliche Wahrscheinlichkeitsverteilung recht gut.

Um Regionen mit einer hohen Dichte besser von denen mit einer geringen Dichte separieren zu können, verwendet HDBSCAN eine Metrik namens Mutual Reachability Distance (MRD), die folgendermaßen definiert ist:

dmreach-k (a,b)=max{ corek(a),corek(b), d(a,b)}

Ziel ist es, Punkte mit einer geringen Dichte weiter voneinander zu entfernen, um bessere Cluster finden zu können. Abbildung 3 zeigt das Konzept mit drei Punkten und deren Core Distance.

Das Diagramm zeigt die Mutual Reachability Distance für drei Punkte (Abb. 3).

Die MRD zwischen dem blauen und dem grünen Punkt in der Abbildung ist die Core Distance des grünen Punkts, da sie größer ist als die Core Distance des blauen und als der Abstand der beiden Punkte zueinander. Somit wird der grüne Punkt weiter von dem blauen weggeschoben. Anders ist es zwischen dem roten und dem grünen Punkt: Da die MRD dem Abstand zwischen den beiden Punkten entspricht, ändert sich nichts.

Der Algorithmus ermittelt die einzelnen Cluster, indem er zunächst alle Punkte filtert, deren Core Distance niedriger als der Wert λ ist. Die damit selektierten Punkte verbindet er zu einem Cluster, wenn ihr Abstand nicht größer als λ ist. Allgemein ausgedrückt: Zwei Punkte werden miteinander verbunden, wenn sie zwei Bedingungen erfüllen: Sie müssen einen geringen Abstand zueinander haben und sich in einer dichten Region befinden. Diese Voraussetzungen spiegeln sich in der Formel zur Mutual Reachability Distance wieder. Die ersten beiden Terme beschreiben die Core Distance und der letzte den benötigten Abstand der Punkte zueinander. Nach einem Durchlauf, wiederholt man den Vorgang mit einem höheren λ.

Durch das Verändern von λ können neue Verbindungen zwischen Punkten entstehen, die sich bereits in einem Cluster befinden, sozusagen als Abkürzung. Diese sind jedoch irrelevant, da nur neu geschaffene Beziehungen zwischen einzelnen Regionen von Bedeutung sind.

Zusammengefasst gilt am Anfang des Prozesses jeder Punkt als separates Cluster, und durch das Verändern von λ sucht der Algorithmus die kürzesten Verbindungen zwischen den Clustern. Beendet ist der Prozess, wenn nur noch ein Cluster vorhanden ist, also alle Punkte miteinander verbunden sind. Das Resultat ist ein minimaler Spannbaum (Minimum Spanning Tree, MST): ein Graph, der alle Knoten enthält. Die Kanten zwischen den Punkten sind dabei durch die MRD gewichtet.

Um aus dem Graphen eine Hierarchie zu erstellen, sortieren man die Kanten aufsteigend nach Distanz beziehungsweise MRD. Nun verbindet ein Algorithmus schrittweise diejenigen Punkte miteinander, die die gleiche Mutual Reachability Distance haben. Das Resultat lässt sich als Dendrogramm visualisieren.

Das Dendrogramm visualisiert die Hierarchie (Abb. 4).

DBSCAN, eine Variante von HDBSCAN, verwendet vereinfacht dargestellt das Dendrogramm, zieht eine horizontale Linie und selektiert alle Kanten als Cluster, die die Linie durchschneiden. Die Schwierigkeit liegt einerseits im Bestimmen der Linie. Andererseits ist auf die Weise das Ermitteln von Clustern mit unterschiedlichen Dichten schwierig.

HDBSCAN löst die Probleme durch das sogenannte Kondensieren des Baums. Von oben nach unten gelesen wird im Dendrogramm deutlich, dass häufig wenige Punkte die Cluster teilen. An der Stelle setzt HDBSCAN an: Statt Cluster zu teilen, verliert der Cluster einzelne Punkte. Bei jedem Split eines Clusters prüft die Methode, ob das neue Cluster die Minimum Cluster Size unterschreitet. In dem Fall behält sie das ursprüngliche Cluster bei und entfernt lediglich die Punkte. Ist das Cluster größer, teilt der Algorithmus es in zwei Cluster auf. Auf die Weise erhält man eine bessere Darstellung über die Cluster und deren Persistenz.

Abschließend selektiert die Methode die Cluster mit einer hohen Persistenz – diejenigen, die in der Darstellung besonders hervortreten. Bei der Auswahl gilt es zu beachten, dass der Algorithmus keine Cluster selektieren darf, deren Vorgänger er bereits selektiert hat.

Das Diagramm zeigt den kondensierten Baum aus Abbildung 4 (Abb. 5).

Um die Schlüsselwörter zu finden, die das Cluster charakterisieren, kommt mit c-Tf-idf eine Variante von Tf-idf zum Einsatz. Tf-idf ist insbesondere im Bereich der Verarbeitung natürlicher Sprache weit verbreitet, da es ein einfaches und robustes Verfahren ist, um Terme aus Texten zu extrahieren.

Tf steht für Term Frequency und beschreibt die Häufigkeit eines Worts innerhalb eines Textes. IDF bedeutet Inverse Document Frequency und gibt die Spezifität eines Worts im gesamten Textkorpus an. Je näher der Wert bei null ist, desto häufiger kommt das Wort und desto weniger Aussagekraft hat es. Stoppwörter wie "und", "der" und "die" haben beispielsweise einen sehr niedrigen Wert. Die Formel für den Wert lautet folgendermaßen:

N gibt die Anzahl der Dokumente im Korpus an. Die Summe im Nenner entspricht der Anzahl der Dokumente, die das Wort t enthalten. Durch das Kombinieren beider Werte ergibt sich eine Aussage über die Relevanz des Worts für ein Dokument. BERTopic wendet diese Metrik nun auf alle Dokumente des Korpus an. Dazu hängt er sie aneinander und ermittelt die Tf-idf Scores. Die Wörter mit den höchsten Scores sind die ermittelten Topics.

Wie in jedem Machine-Learning-Algorithmus gibt es auch bei BERTopic eine ganze Reihe an Parametern, um das Modell anzupassen. Diese Hyperparameter können das Ergebnis des Clustering und damit der resultierenden Topics wesentlich zum Positiven oder Negativen beeinflussen.

Die folgenden Beispiele sind im Notebook zum Artikel verfügbar. Als Grundlage dient der Datensatz 10kGNAD, der etwa 10.000 deutsche Nachrichtenartikel enthält, die in neun Themengebiete unterteilt sind.

Zu Beginn gilt es, die Texte durch ein geeignetes Embedding-Modell zu konvertieren. Es findet sich wie viele andere nützliche Modelle im Hub von Hugging Face und zwar bei den Sentence-Similarity-Modellen. Das Laden erfolgt über das Framework SentenceTransformers:

sentence_model = 
  SentenceTransformer("Sahajtomar/German-semantic", device="cuda")

Die encode-Funktion des Modells kann den Text nun umwandeln. Je nach Größe des Modells, dem Umfang des Datensatzes und der Leistungsfähigkeit des verwendeten Systems kann das einigen Minuten in Anspruch nehmen. Empfehlenswert ist der Einsatz einer GPU.

Mit den generierten Vektoren lassen sich die Hyperparameter von UMAP optimieren. Folgende Methoden initialisieren das Modell zunächst mit den Hyperparametern und starten anschließend das Training:

umap_model = UMAP(n_neighbors=30, n_components=2,
                  min_dist=0.0, metric='cosine')
umap_model.fit(embeddings)
umap_embeddings = umap_model.transform(embeddings)

Der Parameter n_components gibt an, wie viele Dimensionen der neue Projektionsraum haben soll. Für eine visuelle Evaluierung verwendet der Code zwei Dimensionen. Jenseits der Visualisierung, beispielsweise für das Topic Modeling bietet es sich jedoch durchaus an, diesen Wert zu verändern.

Der Parameter n_neighbours gibt das Verhältnis zwischen den lokalen und den globalen Strukturen an. Bei einem niedrigen Wert behält das Modell mehr lokale Strukturen bei. Je größer der Wert ist, umso mehr fokussiert sich der Algorithmus auf globale Strukturen. Abbildung 6 zeigt den Vergleich zwischen dem Wert 2 und 20.

Der n_components-Wert ist für das linke Diagramm 2 und für das rechte 20 (Abb. 6).

Ist der Wert zu niedrig eingestellt, lassen sich keine Cluster extrahieren, ist er dagegen zu hoch, erzeugt das Modell kaum abgrenzbare Bereiche mit einer hohen Dichte. Gute Startwerte sind 15 oder 20.

Schließlich erfolgt das Initialisieren und Trainieren von HDBSCAN:

clusterer = hdbscan.HDBSCAN(min_cluster_size=50)
clusterer.fit(umap_embeddings)

Anschließend lassen sich die gefundenen Cluster über clusterer.labels_ ausgeben. Der Parameter min_cluster_size hat großen Einfluss auf das Ergebnis. Er bestimmt beim Kondensieren des resultierenden Minimum Spanning Tree den Grenzwert der Punkte, ab der das bestehende Cluster geteilt wird. Je kleiner der Wert ist, umso kleiner sind die endgültigen Cluster.

Der Parameter min_samples geht mit dem Evaluieren der min_cluster_size einher. Er bestimmt, wie viele Punkte in der Nachbarschaft sein müssen, damit ein Punkt als Core Point gilt. Über ihn lässt sich somit steuern, wie viele Punkte das Modell als Outlier (Kategorie -1) ansieht. Je höher der Wert, desto mehr Punkte verwirft das Modell.

Generell lässt sich ableiten: Je spezifischer Cluster sein sollen, desto niedriger müssen die beiden Parameter sein. Möchte man die globale Struktur als generelle Cluster abbilden, aber trotzdem die Details innerhalb der Cluster erhalten, sollte man einen hohen Wert für min_cluster_size, aber einen niedrigen für min_samples wählen.

Mit der finalen Extraktion der Schlüsselwörter für die jeweiligen Cluster durch c-Tf-IDF lässt sich der Einfluss der angesprochenen Parameter beobachten. Dazu kann man die Implementierung von BERTopic verwenden, muss jedoch einige interne Variablen anpassen. Näheres findet sich im Notebook zum Artikel.

Den größten Effekt hat min_cluster_size: Je höher der Wert ist, desto weniger sind die Cluster spezifiziert, wodurch das Modell weniger und allgemeinere Topics findet. Wer eine hohe Zahl an Ausreißern erwartet, sollte den Parameter min_samples erhöhen, damit sie als Outlier gekennzeichnet sind und nicht in das Clustering einfließen.

Die Metrik Density-based Clustering Validation (DBCV) kann ein guter Anhaltspunkt für das Evaluieren der Hyperparameter sein. Sie setzt sich aus zwei Komponenten zusammen: dem Bereich mit der geringsten Dichte innerhalb der Cluster und der Region mit maximaler Dichte zwischen den Clustern.

Diese Metrik lässt sich in einer Hyperparameter-Suche wie der Methode GridSearchCV von scikit-learn verwenden, um einen ersten Anhaltspunkt für die Wahl der Parameter zu erhalten. Davon ausgehend lässt sich das Ergebnis je nach gewünschten Granularitäts-Level anpassen.

Auch wenn das Topic Modeling das manuelle Erstellen eines Kategorieschemas nicht vollständig ersetzt, kann es eine gute Unterstützung sein. Da es einfach zu verwenden ist und gute Visualisierungen bietet, lohnt sich ein Blick auf BERTopic, um dem Fachbereich durch KI-gestützte Methoden beim Erstellen des Kategorieschemas unter die Arme zu greifen. Nicht zuletzt können die Kategorien einen guten Startpunkt für eine erfolgreiche Kategorisierung darstellen.

Eine Fortsetzung zu diesem Artikel wird die Kategorisierung im zweiten Teil detaillierter vorstellen. Dabei steht insbesondere der als Few Shot Learning bezeichnete Umgang mit wenigen gelabelten Daten im Fokus.

Manuel Hartenfels
ist SAP-Entwickler bei der Würth Industrie Service mit dem Schwerpunkt CRM. In diesem Umfeld beschäftigt er sich auch mit NLP.

(rme)