Text Mining im Kundengeschäft mit BERT

Text Mining oder genauer Text Data Mining ist ein Bündel von Algorithmus basierten Analyseverfahren zur Entdeckung von Bedeutungsstrukturen aus schwachstrukturierten Textdaten. Mit KI-basierten und linguistischen Mitteln (NLP) erschließt Text-Mining-Software aus Texten Strukturen, die die Benutzer in die Lage versetzen sollen, Kerninformationen der verarbeiteten Texte schnell zu erkennen.
Da ca. 80% aller sich im Umlauf befindender Daten in schwach- bis unstrukturierter Form existieren, gibt es Use Cases für Textmining wie Sand am Meer.
Seit den Erfolgen von OpenAIs Chatgpt und dem damit verbundenen KI-Hype erleben Machine Learning-Anwendungen und Neuentwicklungen basierend auf der Large Language Models-Technologie, kurz LLM, eine riesige Nachfrage. Dabei ist es egal, ob es sich um Chatbots, Suchalgorithmen oder Prozessoptimierungen mithilfe von KI handelt.
Von dieser Nachfrage profitieren weitere NLP-Anwendungen und damit das von Google entwickelte Transformer-Modell BERT, welches sich über einige Jahre als eines der meistgenutzten Modelle für NLP-Anwendungen etabliert hat.
Dieser Beitrag konzentriert sich vor allem auf einen bestimmten Text Mining Use Case nämlich den der Analyse von Kundenbewertungen in Form von Kommentaren.
Motivation
Nicht erst seit gestern sind Reviews oder allgemeiner gefasst Kundenkommentare ein wichtiger Bestandteil von Unternehmen, um auf verschiedenen Ebenen Optimierungspotenziale abzuleiten. Durch die in dem letzten Jahrzehnt stark gestiegene Onlinepräsenz von Unternehmen und Konsumenten, haben sich textbasierte Inhalte wie die oben bereits erwähnten Kundenkommentare vervielfacht. Während die Kommentaranalyse von wenigen hundert Kommentaren noch von einzelnen Menschen durchgeführt werden kann, wird diese bei Mengen darüber hinaus immer zeit- und ressourcenintensiver.
Hier kommen maschinelle Texterkennungsanwendungen ins Spiel. Mit Ihnen ist es möglich innerhalb von Minuten, tausende Texte zu analysieren und Informationen zu extrahieren.
Bisher war ein Nachteil dieser Anwendungen dieser Anwendungen Ihre Genauigkeit und der Schwierigkeit Tonalität wie zum Beispiel Sarkasmus aus dem Text heraus zu verstehen.
Während mit immer größeren Sprachkörper und vortrainierten Modellen die Genauigkeit verbessert werden kann, blieb das Problem mit der Tonalität lange bestehen.
Erst mit dem Google-entwickelten BERT-Modell gab es hierfür einen Durchbruch.
BERT
BERT (Bidirectional Encoder Representations from Transformers) analysiert den Kontext von Wörtern und Wortpassagen unter Berücksichtigung der vorhergehenden als auch der nachfolgenden Wörter. Es wurde auch darauf trainiert, zu erkennen, ob ein Satz auf einen anderen folgt. Damit ist BERT in der Lage ein tiefes Verständnis des zugrundeliegenden Textes zu entwickeln.
Weiter basiert es auf der Transformer-Architektur, die auf dem Aufmerksamkeitsmechanismus beruht. Mit dieser ist es BERT möglich, effizient und parallel zu arbeiten.
Ein weiterer großer Vorteil von BERT ist seine Multilingualität, so dass Deutsch, Englisch, Umgangssprache, den bereits angesprochenen Sarkasmus, aber auch Emojis erkannt werden.
Aufgrund seiner kombinierten Eigenschaften hat sich BERT innerhalb kurzer Zeit als „State of the Art“-Lösung innerhalb der NLP-Encoder-Anwendungen etabliert.
Häufig wird BERT als Prototyp der heutigen LLMs betrachtet, obwohl es mit seinen 110 Millionen Parameter noch deutlich kleiner und kompakter ist als GPT‑3. Das hat allerdings den Vorteil, dass Anwendungen mit BERT eine deutlich weniger Ressourcen benötigen, ohne an signifikant an Genauigkeit einzubüßen.
Es wird nun gezeigt, wie BERT in 2 verschiedenen Use Cases der Textanalyse zum Einsatz kommt.
Text Classification
Die Textklassifikation beschreibt die semantisch korrekte Zuordnung vordefinierter themenbasierter Kategorien oder Gruppen zu Textdokumenten. Sie bildet damit eine Verallgemeinerung der Sentimentanalyse.
Mit ihr ist es möglich, Textdaten zu sortieren und wertvolle Informationen aus vielen Texten zu extrahieren, aber auch bei Anwendungen zur Spamerkennung kommt Textklassifikation zum Einsatz.
Für Unternehmen mit einem breiten Portfolio an Produkten bietet es sich an Textklassifikations-Apps zu nutzen, um Produktbeschreibungen automatisch in vordefinierte Kategorien einzuordnen.
Show Case:
Grundsätzlich spielen folgende Faktoren für eine erfolgreiche Entwicklung eine entscheidende Rolle:
- Trainingsvolumen, also mit wie vielen Datensätze wird das Modell trainiert
- Datenqualität
In diesem Beispiel werden Kundenkommentare eines Elektrohändlers betrachtet. Diese sollen je einer der 4 Kategorien „Auswahl“, „Qualität“, „Angebot“ und „Spam“ zugeordnet werden.
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from transformers import BertTokenizer
import torch
from transformers import BertForSequenceClassification, Trainer, TrainingArguments
class TextDataset(torch.utils.data.Dataset):
def __init__(self, encodings, labels):
self.encodings = encodings
self.labels = labels
def __getitem__(self, idx):
item = {key: torch.tensor(val[idx]) for key, val in self.encodings.items()}
item['labels'] = torch.tensor(self.labels[idx])
return item
def __len__(self):
return len(self.labels)
#Tokenisierung
tokenizer = BertTokenizer.from_pretrained('bert-base-german-cased')
def tokenize_texts(texts):
return tokenizer(
texts.tolist(),
padding=True,
truncation=True,
return_tensors='pt'
)
# Trainingsargumente
training_args = TrainingArguments(
output_dir='./',
num_train_epochs=3,
per_device_train_batch_size=8,
per_device_eval_batch_size=8,
warmup_steps=500,
weight_decay=0.01,
logging_dir='./',
)
# device setup
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
def predict(text):
inputs = tokenizer(text, return_tensors='pt', truncation=True, padding=True)
outputs = model(**inputs)
predictions = torch.argmax(outputs.logits, dim=1)
return label_encoder.inverse_transform(predictions.numpy())
# Lade den Datensatz
#fields=['label','Kommentar']
data='$FILEPATH$'+'\kundenkommentare_training_set.csv'
df = pd.read_csv(data)
# Modell laden
model = BertForSequenceClassification.from_pretrained('bert-base-german-cased', num_labels=df['kategorie'].nunique()).to(device)
# Kodieren der Labels
label_encoder = LabelEncoder()
df['labels'] = label_encoder.fit_transform(df['kategorie'])
# Aufteilen in Trainings- und Testdaten
train_texts, test_texts, train_labels, test_labels = train_test_split(
df['kommentar'].values, df['labels'].values, test_size=0.2
)
#Datensätze vorbereiten
train_encodings = tokenize_texts(train_texts)
test_encodings = tokenize_texts(test_texts)
train_dataset = TextDataset(train_encodings, train_labels)
test_dataset = TextDataset(test_encodings, test_labels)
# Trainer definieren
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_dataset,
eval_dataset=test_dataset,
)
# Modell tranieren
trainer.train()
Nach dem Training kann die Funktion trainer.evaluate() genutzt werden, um die Performance auf dem Testset zu prüfen.
Für weitere Tests liegt eine CSV-Datei mit gelabelten Daten bei.
results = trainer.evaluate()
print(results)
file='some_customer_comments.csv'
# Beispielvorhersage
df = pd.read_csv(file)
rdf=pd.DataFrame({'Kommentar': [Kommentar for Kommentar in df['kommentar']],'Kategorie' : [predict(Kommentar)[0] for Kommentar in df['kommentar']]})
compare_df=df.join(rdf['Kategorie'])
#print(compare_df)
false_positives=compare_df.query('kategorie!=Kategorie')
print(false_positives)
print(compare_df)
Topic modeling
Topic Modeling wird u.a. auf Kundenfeedback angewandt, um verborgene Themen, Inhalte oder Strukturen zu identifizieren.
Unter einem Topic versteht man wiederkehrende Muster von Wörtern, welche mithilfe von Scan-Algorithmen innerhalb der zugrundeliegenden Textsammlung ermittelt werden.
Anders als in der Textklassifikation kann aufgrund der unbekannten Kategorien/Themen nicht mit Labeling gearbeitet werden. Stattdessen bedient man sich hier an sogenannten unüberwachten Lernmethoden, um Muster und Insights anhand von statischen Mitteln zu erkennen.
Anders als in der Textklassifikation kann aufgrund der unbekannten Kategorien/Themen nicht mit Labeling gearbeitet werden. Stattdessen bedient man sich hier an sogenannten unüberwachten Lernmethoden, um Muster und Insights anhand von statischen Mitteln zu erkennen. Etwas vereinfachte Darstellungen von Topics würden folgendermaßen aussehen.
Topic 0: [(leistungsfähig, p1), (ipad, p2), (zufrieden, p3), (hochwertig, p4)]
Topic 1: [(service, p5), (freundlich, p6), (waren, p7), (beratung, p8)]
, wobei p1 bis p8 das statistisch relative Vorkommen des jeweiligen Wortes darstellt.
Häufig geht das Topic Modeling mit der Textklassifikation Hand in Hand. Aus gefundenen Topics lassen sich Kategorien ableiten, mit dem sich wieder ein Modell zur Textklassifikation trainieren lässt.
BERTopic
Auch Topic Modeling-Anwendungen werden mittlerweile mit BERT, insbesondere durch die Methode BERTopic, umgesetzt.
Lange war mit den klassischen Methoden zu Topic Modeling nur möglich aus längeren Texten Topics zu ermitteln. Mit BERTopic änderte sich dies allerdings.
Bei BERTopic kombiniert das tiefe Verständnis des zugrundeliegenden Textes von BERT mit traditionellen Techniken des Topic Modelings (u.a. Term Frequency-Inverse Document Frequency Uniform Manifold Approximation and Projection und clustering (HDBSCAN)), um interpretierbare Themencluster zu erstellen.
Die ersten Tests zeigten, dass diese Kombination aus dem tiefen Sprach- und Textverständnis von BERT und den traditionellen Methoden gute Ergebnisse auch bei weniger langen Texten erzielte.
Dadurch öffneten sich für die Auswertung von Kundenkommentaren neue Möglichkeiten.
Show Case
Wir bleiben bei dem Beispiel mit den Kundenkommentaren eines Elektrohändlers. Das
Diesmal wollen wir aus den Kommentaren über Clusterung Topics ermitteln ohne vorgegebene Kategorien.
from bertopic import BERTopic
import pandas as pd
import matplotlib.pyplot as plt
# 1. CSV-Datei laden
df = pd.read_csv('ungelabelte_kommentare.csv')
# 2. Texte extrahieren
texte = df['kommentar'].astype(str).tolist()
# 3. BERTopic-Modell erstellen
topic_model = BERTopic(language='multilingual', verbose=True)
# 4. Topics fitten
topics, probs = topic_model.fit_transform(texte)
# 5. Reduktion auf exakt 10 Topics
topic_model.reduce_topics(texte, nr_topics=10)
# 6. Top-N Topics anzeigen
print('\n📌 Top 10 Topics:')
for i in range(10):
print(f'Topic {i}: {topic_model.get_topic(i)}')
# 7. Topics in CSV exportieren
list=[topic_model.get_topic(topics[i]) for i in range(len(topics))]
df['topic'] = topics
df['topic_values']=list
df.to_csv('kundenkommentare_mit_topics.csv', index=False)
Fazit
Text Mining in Form der Kommentaranalyse ist aus der aktuellen Zeit nicht mehr wegzudenken und für Unternehmen strategisch unverzichtbar.
Mit BERT stehen diesen ein mächtiges Werkzeug zur Verfügung. Der Ansatz von BERTopic weitet die Möglichkeiten des Topic Modelings auf Kundenkommentare und kann so Unternehmen zusätzlich wertvolle Informationen liefern.
Damit hat BERT aktuell in beiden Analysemethoden eine Vormachtstellung eingenommen.
Interessant bleibt, inwiefern sich Large Language Models wie dem neuen GPT‑4 auf die hier gezeigten Methoden anwenden lassen können und, ob diese eine echte Konkurrenz für BERT oder eher ergänzend zu BERT eingesetzt werden.