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



Text Mining oder genauer Text Data Mining ist ein Bün­del von Algo­rith­mus basier­ten Ana­ly­se­ver­fah­ren zur Ent­de­ckung von Bedeu­tungs­struk­tu­ren aus schwach­struk­tu­rier­ten Text­da­ten. Mit KI-basier­ten und lin­gu­is­ti­schen Mit­teln (NLP) erschließt Text-Mining-Soft­ware aus Tex­ten Struk­tu­ren, die die Benut­zer in die Lage ver­set­zen sol­len, Kern­in­for­ma­tio­nen der ver­ar­bei­te­ten Texte schnell zu erkennen.

Da ca. 80% aller sich im Umlauf befin­den­der Daten in schwach- bis unstruk­tu­rier­ter Form exis­tie­ren, gibt es Use Cases für Text­mi­ning wie Sand am Meer.

Seit den Erfol­gen 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 basie­rend auf der Large Lan­guage Models-Tech­no­lo­gie, kurz LLM, eine rie­sige Nach­frage. Dabei ist es 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 wei­tere NLP-Anwen­dun­gen und damit das von Google ent­wi­ckelte Trans­for­mer-Modell BERT, wel­ches sich über einige 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 vor allem auf einen bestimm­ten Text Mining Use Case näm­lich den der Ana­lyse von Kun­den­be­wer­tun­gen in Form von Kommentaren. 

Moti­va­tion

Nicht erst seit ges­tern sind Reviews oder all­ge­mei­ner gefasst Kun­den­kom­men­tare ein wich­ti­ger Bestand­teil von Unter­neh­men, um auf ver­schie­de­nen Ebe­nen Opti­mie­rungs­po­ten­ziale abzu­lei­ten. Durch die in dem 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 die oben bereits erwähn­ten Kun­den­kom­men­tare ver­viel­facht. Wäh­rend die Kom­men­tar­ana­lyse von weni­gen hun­dert Kom­men­ta­ren noch von ein­zel­nen Men­schen durch­ge­führt wer­den kann, wird diese bei Men­gen dar­über hin­aus immer zeit- und ressourcenintensiver.

Hier kom­men maschi­nelle Tex­terken­nungs­an­wen­dun­gen ins Spiel. Mit Ihnen ist es mög­lich inner­halb von Minu­ten, tau­sende Texte zu ana­ly­sie­ren und Infor­ma­tio­nen zu extrahieren.

Bis­her war ein Nach­teil die­ser Anwen­dun­gen die­ser Anwen­dun­gen Ihre Genau­ig­keit und der Schwie­rig­keit Tona­li­tät wie zum Bei­spiel Sar­kas­mus aus dem Text her­aus zu verstehen.

Wäh­rend mit immer grö­ße­ren Sprach­kör­per und vor­trai­nier­ten Model­len die Genau­ig­keit ver­bes­sert wer­den kann, blieb das Pro­blem mit der Tona­li­tät lange bestehen.

Erst mit dem Google-ent­wi­ckel­ten BERT-Modell gab es hier­für einen 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 der vor­her­ge­hen­den als auch der nach­fol­gen­den Wör­ter. Es wurde auch dar­auf trai­niert, zu erken­nen, ob ein Satz auf einen ande­ren folgt. Damit ist BERT in der Lage ein tie­fes Ver­ständ­nis des zugrun­de­lie­gen­den Tex­tes zu entwickeln.

Wei­ter basiert es auf der Trans­for­mer-Archi­tek­tur, die auf dem Auf­merk­sam­keits­me­cha­nis­mus beruht. Mit die­ser ist es BERT mög­lich, effi­zi­ent und par­al­lel zu arbeiten.

Ein wei­te­rer gro­ßer Vor­teil von BERT ist seine Mul­ti­l­in­gua­li­tät, so dass Deutsch, Eng­lisch, Umgangs­spra­che, den bereits ange­spro­che­nen Sar­kas­mus, aber auch Emo­jis erkannt werden.

Auf­grund sei­ner kom­bi­nier­ten Eigen­schaf­ten hat sich BERT inner­halb kur­zer Zeit als „State of the Art“-Lösung inner­halb der NLP-Enco­der-Anwen­dun­gen etabliert.

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

Es wird nun gezeigt, wie BERT in 2 ver­schie­de­nen Use Cases der Text­ana­lyse zum Ein­satz kommt.

Text Clas­si­fi­ca­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 Sen­ti­ment­ana­lyse.

Mit ihr ist es mög­lich, Text­da­ten zu sor­tie­ren und wert­volle Infor­ma­tio­nen aus vie­len Tex­ten zu extra­hie­ren, aber auch bei Anwen­dun­gen zur Spamer­ken­nung kommt Text­klas­si­fi­ka­tion zum Einsatz.

Für Unter­neh­men mit einem brei­ten Port­fo­lio an Pro­duk­ten 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.

Show Case:

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 mit wie vie­len Daten­sätze wird das Modell trainiert
  • Daten­qua­li­tät

In die­sem Bei­spiel wer­den Kun­den­kom­men­tare eines Elek­tro­händ­lers betrach­tet. Diese sol­len je einer der 4 Kate­go­rien „Aus­wahl“, „Qua­li­tät“, „Ange­bot“ und „Spam“ zuge­ord­net 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 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 u.a. 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 wie­der­keh­rende Mus­ter von Wör­tern, wel­che mit­hilfe von Scan-Algo­rith­men inner­halb der zugrun­de­lie­gen­den Text­samm­lung ermit­telt werden.

Anders als in der Text­klas­si­fi­ka­tion kann auf­grund der unbe­kann­ten Kategorien/Themen nicht mit Labe­l­ing gear­bei­tet wer­den. Statt­des­sen bedient man sich hier an soge­nann­ten unüber­wach­ten Lern­me­tho­den, um Mus­ter und Insights anhand von sta­ti­schen Mit­teln zu erkennen.

Anders als in der Text­klas­si­fi­ka­tion kann auf­grund der unbe­kann­ten Kategorien/Themen nicht mit Labe­l­ing gear­bei­tet wer­den. Statt­des­sen bedient man sich hier an soge­nann­ten unüber­wach­ten Lern­me­tho­den, um Mus­ter und Insights anhand von sta­ti­schen Mit­teln zu erken­nen. Etwas ver­ein­fachte Dar­stel­lun­gen von Topics wür­den fol­gen­der­ma­ßen 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)]

, wobei p1 bis p8 das sta­tis­tisch rela­tive Vor­kom­men des jewei­li­gen Wor­tes darstellt.

Häu­fig geht das Topic Mode­ling mit der Text­klas­si­fi­ka­tion Hand in Hand. Aus gefun­de­nen Topics las­sen sich Kate­go­rien ablei­ten, mit dem sich wie­der ein Modell zur Text­klas­si­fi­ka­tion trai­nie­ren lässt.

BER­To­pic

Auch Topic Mode­ling-Anwen­dun­gen wer­den mitt­ler­weile mit BERT, ins­be­son­dere durch die Methode BER­To­pic, umgesetzt.

Lange war mit den klas­si­schen Metho­den zu Topic Mode­ling nur mög­lich aus län­ge­ren Tex­ten Topics zu ermit­teln. Mit BER­To­pic änderte sich dies allerdings.

Bei BER­To­pic kom­bi­niert das tiefe Ver­ständ­nis des zugrun­de­lie­gen­den Tex­tes von BERT mit tra­di­tio­nel­len Tech­ni­ken des Topic Mode­lings (u.a. Term Fre­quency-Inverse Docu­ment Fre­quency Uni­form Mani­fold Appro­xi­ma­tion and Pro­jec­tion und clus­te­ring (HDBSCAN)), um inter­pre­tier­bare The­men­clus­ter zu erstellen.

Die ers­ten Tests zeig­ten, dass diese Kom­bi­na­tion aus dem tie­fen Sprach- und Text­ver­ständ­nis von BERT und den tra­di­tio­nel­len Metho­den gute Ergeb­nisse auch bei weni­ger lan­gen Tex­ten erzielte.

Dadurch öff­ne­ten sich für die Aus­wer­tung von Kun­den­kom­men­ta­ren neue Möglichkeiten.

Show Case

Wir blei­ben bei dem Bei­spiel mit den Kun­den­kom­men­ta­ren eines Elek­tro­händ­lers. Das

Dies­mal wol­len wir aus den Kom­men­ta­ren über Clus­te­rung Topics ermit­teln ohne vor­ge­ge­bene 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 Kom­men­tar­ana­lyse ist aus der aktu­el­len Zeit nicht mehr weg­zu­den­ken und für Unter­neh­men stra­te­gisch unverzichtbar.

Mit BERT ste­hen die­sen ein mäch­ti­ges Werk­zeug zur Ver­fü­gung. Der Ansatz von BER­To­pic wei­tet die Mög­lich­kei­ten des Topic Mode­lings auf Kun­den­kom­men­tare und kann so Unter­neh­men zusätz­lich wert­volle Infor­ma­tio­nen liefern.

Damit hat BERT aktu­ell in bei­den Ana­ly­se­me­tho­den eine Vor­macht­stel­lung eingenommen.

Inter­es­sant bleibt, inwie­fern sich Large Lan­guage Models wie dem neuen GPT‑4 auf die hier gezeig­ten Metho­den anwen­den las­sen kön­nen und, ob diese eine echte Kon­kur­renz für BERT oder eher ergän­zend zu BERT ein­ge­setzt werden.