Text Mining im Kun­den­ge­schäft mit BERT



Text Mining, genauer Text Data Mining, ist ein Bün­del algo­rith­mus­ba­sier­ter Ana­ly­se­ver­fah­ren zur Ent­de­ckung von Bedeu­tungs­struk­tu­ren in schwach struk­tu­rier­ten Text­da­ten. Mit KI-basier­ten und lin­gu­is­ti­schen Mit­teln (Natu­ral Lan­guage Pro­ces­sing, NLP) erschließt Text-Mining-Soft­ware Struk­tu­ren aus Tex­ten, die es Nut­zern ermög­li­chen sol­len, die Kern­in­for­ma­tio­nen der ver­ar­bei­te­ten Texte schnell zu erkennen.

Da ca. 80 % aller im Umlauf befind­li­chen Daten in schwach struk­tu­rier­ter oder unstruk­tu­rier­ter Form vor­lie­gen, gibt es Use Cases für Text Mining wie Sand am Meer.

Seit dem Erfolg von Ope­nAIs ChatGPT und dem damit ver­bun­de­nen KI-Hype erle­ben Machine-Lear­ning-Anwen­dun­gen und Neu­ent­wick­lun­gen auf Basis von Large Lan­guage Models (LLMs) eine rie­sige Nach­frage, egal ob es sich um Chat­bots, Such­al­go­rith­men oder Pro­zess­op­ti­mie­run­gen mit­hilfe von KI handelt.

Von die­ser Nach­frage pro­fi­tie­ren auch andere NLP-Anwen­dun­gen und damit das von Google ent­wi­ckelte Trans­for­mer-Modell BERT, das sich über Jahre als eines der meist­ge­nutz­ten Modelle für NLP-Anwen­dun­gen eta­bliert hat.

Die­ser Bei­trag kon­zen­triert sich auf einen bestimm­ten Text-Mining-Use-Case: die Ana­lyse von Kun­den­be­wer­tun­gen in Form von Kommentaren.

Moti­va­tion

Nicht erst seit ges­tern sind Reviews, all­ge­mei­ner gesagt Kun­den­kom­men­tare, für Unter­neh­men eine wich­tige Quelle, um auf ver­schie­de­nen Ebe­nen Opti­mie­rungs­po­ten­ziale abzu­lei­ten. Durch die im letz­ten Jahr­zehnt stark gestie­gene Online­prä­senz von Unter­neh­men und Kon­su­men­ten haben sich text­ba­sierte Inhalte wie Kun­den­kom­men­tare ver­viel­facht. Wäh­rend wenige hun­dert Kom­men­tare noch von ein­zel­nen Per­so­nen ana­ly­siert wer­den kön­nen, wird die Ana­lyse grö­ße­rer Men­gen immer zeit- und ressourcenintensiver.

Hier kom­men maschi­nelle Text­ana­lyse-Anwen­dun­gen ins Spiel. Mit ihnen las­sen sich inner­halb von Minu­ten Tau­sende Texte ana­ly­sie­ren und Infor­ma­tio­nen extrahieren.

Ein Nach­teil die­ser Anwen­dun­gen war bis­her ihre Genau­ig­keit sowie die Schwie­rig­keit, Tona­li­tät wie zum Bei­spiel Sar­kas­mus zu erken­nen. Wäh­rend sich die Genau­ig­keit mit immer grö­ße­ren Text­kor­pora und vor­trai­nier­ten Model­len ver­bes­sern ließ, blieb das Pro­blem der Tona­li­tät lange bestehen. Erst mit dem von Google ent­wi­ckel­ten BERT-Modell gelang hier ein Durchbruch.

BERT

BERT (Bidi­rec­tional Enco­der Repre­sen­ta­ti­ons from Trans­for­mers) ana­ly­siert den Kon­text von Wör­tern und Wort­pas­sa­gen unter Berück­sich­ti­gung sowohl der vor­her­ge­hen­den als auch der nach­fol­gen­den Wör­ter. Zudem wurde es dar­auf trai­niert, zu erken­nen, ob ein Satz auf einen ande­ren folgt. Dadurch ist BERT in der Lage, ein tie­fes Ver­ständ­nis des zugrunde lie­gen­den Tex­tes zu entwickeln.

Außer­dem basiert BERT auf der Trans­for­mer-Archi­tek­tur, die auf dem Auf­merk­sam­keits­me­cha­nis­mus (Atten­tion) beruht. Dadurch kann BERT effi­zi­ent und par­al­lel arbeiten.

Ein wei­te­rer gro­ßer Vor­teil von BERT ist seine Mehr­spra­chig­keit: Es erkennt Deutsch und Eng­lisch ebenso wie Umgangs­spra­che, den bereits ange­spro­che­nen Sar­kas­mus und sogar Emojis.

Auf­grund die­ser kom­bi­nier­ten Eigen­schaf­ten hat sich BERT inner­halb kur­zer Zeit als State-of-the-Art-Lösung unter den NLP-Enco­der-Model­len etabliert.

Häu­fig wird BERT als Vor­läu­fer der heu­ti­gen LLMs betrach­tet, obwohl es mit sei­nen 110 Mil­lio­nen Para­me­tern deut­lich klei­ner und kom­pak­ter ist als etwa GPT‑3. Das hat aller­dings den Vor­teil, dass Anwen­dun­gen mit BERT deut­lich weni­ger Res­sour­cen benö­ti­gen, ohne signi­fi­kant an Genau­ig­keit einzubüßen.

Im Fol­gen­den zei­gen wir, wie BERT in zwei ver­schie­de­nen Use Cases der Text­ana­lyse zum Ein­satz kommt.

Text­klas­si­fi­ka­tion

Die Text­klas­si­fi­ka­tion beschreibt die seman­tisch kor­rekte Zuord­nung vor­de­fi­nier­ter, the­men­ba­sier­ter Kate­go­rien oder Grup­pen zu Text­do­ku­men­ten. Sie bil­det damit eine Ver­all­ge­mei­ne­rung der Sentimentanalyse.

Mit ihr las­sen sich Text­da­ten sor­tie­ren und wert­volle Infor­ma­tio­nen aus vie­len Tex­ten extra­hie­ren. Auch bei der Spamer­ken­nung kommt Text­klas­si­fi­ka­tion zum Einsatz.

Für Unter­neh­men mit einem brei­ten Pro­dukt­port­fo­lio bie­tet es sich an, Text­klas­si­fi­ka­ti­ons-Apps zu nut­zen, um Pro­dukt­be­schrei­bun­gen auto­ma­tisch in vor­de­fi­nierte Kate­go­rien einzuordnen.

Pra­xis­bei­spiel

Grund­sätz­lich spie­len fol­gende Fak­to­ren für eine erfolg­rei­che Ent­wick­lung eine ent­schei­dende Rolle:

  • Trai­nings­vo­lu­men, also die Anzahl der Daten­sätze, mit denen das Modell trai­niert wird
  • Daten­qua­li­tät

In die­sem Bei­spiel betrach­ten wir Kun­den­kom­men­tare eines Elek­tro­händ­lers. Sie sol­len jeweils einer von vier Kate­go­rien zuge­ord­net wer­den: „Aus­wahl“, „Qua­li­tät“, „Ange­bot“ und „Spam“.

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 trainieren
trainer.train()


Nach dem Trai­ning kann die Funk­tion trainer.evaluate() genutzt wer­den, um die Per­for­mance auf dem Test­set zu prüfen.

Für wei­tere Tests liegt eine CSV-Datei mit gela­bel­ten 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 Mode­ling

Topic Mode­ling wird unter ande­rem auf Kun­den­feed­back ange­wandt, um ver­bor­gene The­men, Inhalte oder Struk­tu­ren zu identifizieren.

Unter einem Topic ver­steht man ein wie­der­keh­ren­des Wort­mus­ter, das mit­hilfe von Algo­rith­men inner­halb der zugrunde lie­gen­den Text­samm­lung ermit­telt wird.

Anders als bei der Text­klas­si­fi­ka­tion kann hier auf­grund der unbe­kann­ten Kate­go­rien bzw. The­men nicht mit Labels gear­bei­tet wer­den. Statt­des­sen nutzt man soge­nannte unüber­wachte Lern­me­tho­den, um Mus­ter und Insights mit sta­tis­ti­schen Mit­teln zu erken­nen. Ver­ein­facht dar­ge­stellt könn­ten Topics etwa so aussehen:

Topic 0: [(leis­tungs­fä­hig, p1), (ipad, p2), (zufrie­den, p3), (hoch­wer­tig, p4)]

Topic 1: [(ser­vice, p5), (freund­lich, p6), (waren, p7), (bera­tung, p8)]

Dabei steht p1 bis p8 für die rela­tive Häu­fig­keit des jewei­li­gen Wortes.

Topic Mode­ling und Text­klas­si­fi­ka­tion gehen häu­fig Hand in Hand: Aus den gefun­de­nen Topics las­sen sich Kate­go­rien ablei­ten, mit denen wie­derum ein Modell zur Text­klas­si­fi­ka­tion trai­niert wer­den kann.

BER­To­pic

Auch Topic-Mode­ling-Anwen­dun­gen wer­den inzwi­schen mit BERT umge­setzt, ins­be­son­dere mit der Methode BERTopic.

Mit klas­si­schen Topic-Mode­ling-Metho­den war es lange nur mög­lich, Topics aus län­ge­ren Tex­ten zu ermit­teln. Mit BER­To­pic änderte sich das.

BER­To­pic kom­bi­niert das tiefe Text­ver­ständ­nis von BERT mit tra­di­tio­nel­len Tech­ni­ken des Topic Mode­lings, unter ande­rem Term Frequency–Inverse Docu­ment Fre­quency (TF-IDF), Uni­form Mani­fold Appro­xi­ma­tion and Pro­jec­tion (UMAP) und Clus­te­ring mit HDBSCAN, um inter­pre­tier­bare The­men­clus­ter zu erstellen.

Erste Tests zeig­ten, dass diese Kom­bi­na­tion auch bei kür­ze­ren Tex­ten gute Ergeb­nisse erzielt. Dadurch eröff­ne­ten sich neue Mög­lich­kei­ten für die Aus­wer­tung von Kundenkommentaren.

Pra­xis­bei­spiel

Wir blei­ben beim Bei­spiel der Kun­den­kom­men­tare eines Elek­tro­händ­lers. Dies­mal wol­len wir per Clus­te­ring Topics aus den Kom­men­ta­ren ermit­teln, ohne Kate­go­rien vorzugeben.

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 von Kom­men­tar­ana­ly­sen ist heute nicht mehr weg­zu­den­ken und für Unter­neh­men stra­te­gisch unver­zicht­bar. Mit BERT steht ihnen dafür ein mäch­ti­ges Werk­zeug zur Ver­fü­gung. BER­To­pic erwei­tert die Mög­lich­kei­ten des Topic Mode­lings auf Kun­den­kom­men­tare und kann Unter­neh­men so zusätz­lich wert­volle Infor­ma­tio­nen lie­fern. Damit hat BERT in bei­den Ana­ly­se­me­tho­den eine starke Stel­lung eingenommen.

Span­nend bleibt, inwie­fern sich aktu­elle Large Lan­guage Models auf die hier gezeig­ten Metho­den anwen­den las­sen und ob sie eine echte Kon­kur­renz zu BERT dar­stel­len oder eher ergän­zend ein­ge­setzt werden.