Aufgabenspezifisches Encoder-Modell

Um den Beispielcode selbst auszuführen oder zu modifizieren, können Sie das dieser Seite zugrundeliegende Jupyter Notebook über die Seitenleiste öffnen und herunterladen.

Kein Problem! Erklärungen zu den einzelnen Schritten des Codes verbergen sich hinter den Nummern an der rechten Seite. Einfach mit der Maus über die Nummer fahren, um die Erklärung zu sehen. Wo der jeweilige Code ausgeführt wird (in Python, R, oder dem Terminal), steht in der Kopfzeile des Codeblocks.

Python
print("Hallo! 👋")
1
Das ist ein einfacher Python-Befehl, der den Text “Hallo” in der Konsole ausgibt. Der Output erscheint unter dem Codeblock.
Hallo! 👋

Daten laden

Unabhängig vom verwendeten Modell laden wir zunächst die bereits installierten Pakete sowie unsere Textdaten und speichern diese in einem Listenobjekt:

Python
import pandas as pd
from transformers import pipeline

daten = pd.read_csv("data/example_dataset.csv")
datenliste = list(daten["text"])
1
Importieren der benötigten Bibliotheken
2
Laden der Textdaten aus einer CSV-Datei und Speichern in einer Liste

Modell laden

Im Gegensatz zu kategoriespezifischen Modellen können wir mit aufgabenspezifischen Encoder-Modellen jede beliebige Kategorie codieren. Als Beispiel verwenden wir hier das NLI-Modell von Laurer et al. (2024).

TippGut zu wissen

Anstelle des hier verwendeten Modells MoritzLaurer/bge-m3-zeroshot-v2.0 können Sie auch andere aufgabenspezifische Encoder-Modelle (üblicherweise gekennzeichnet für “Zero-Shot-Classification”) für verschiedene Sprachen und Anwendungsfälle verwenden. Eine Übersicht über verfügbare Modelle finden Sie auf Hugging Face. Achten Sie darauf, dass das gewählte Modell für Ihre spezifische Aufgabe geeignet ist (z. B. Sentiment-Analyse, Themenklassifikation etc.) und die Sprache Ihrer Texte unterstützt.

Python
zeroshot_classifier = pipeline("zero-shot-classification",
                                model = "MoritzLaurer/bge-m3-zeroshot-v2.0")
3
Laden des aufgabenspezifischen Encoder-Modells für Zero-Shot-Klassifikation

Klassifikation

Für die Klassifikation mit dem NLI-Modell spezifizieren wir zusätzlich zum Modell noch die Ausprägungen der Kategorie (candidate_labels) und eine “Hypothese”, die auf Grundlage des Textes geprüft werden soll (hypothesis_template). Bei der Ausführung des pipeline()-Befehls werden die zu codierenden Ausprägungen der Kategorie automatisch anstelle der geschwungenen Klammern in die Hypothese eingesetzt. Auf diese Weise wird der Befehl für jede Ausprägung einzeln durchgeführt (hier für “positiv”, “negativ” und “neutral”). Wir erhalten also als Ergebnis einen Datensatz, der uns pro Text für jede spezifizierte Ausprägung einen Wahrscheinlichkeitswert ausgibt (in unserem Beispiel die Wahrscheinlichkeit für “positiv”, “negativ” und “neutral”). Nun erfolgt die eigentliche Klassifikation, indem wir den zuvor definierten zeroshot_classifier-Befehl auf unsere Textdaten anwenden. Anschließend extrahieren wir die vergebenen Labels. Das Ergebnis speichern wir in einem DataFrame-Objekt, um es übersichtlich darstellen zu können. Über den Parameter multi_label können wir festlegen, ob prinzipiell mehrere Kategorien gleichzeitig in einem Text vorkommen können.

template = "Die Stimmung beziehungsweise Tonalität des Textes ist {}"
labels = ["positiv", "neutral", "negativ"]

results = zeroshot_classifier(datenliste, candidate_labels=labels,
                               hypothesis_template=template, multi_label=False)

labels = set(label for item in results for label in item['labels'])
out_dict = {label: [] for label in labels}
out_dict['sequence'] = []

for item in results:
    out_dict['sequence'].append(item['sequence'])
    for label in labels:
        if label in item['labels']:
            out_dict[label].append(item['scores'][item['labels'].index(label)])
        else:
            out_dict[label].append(None)

ergebnis = pd.DataFrame(out_dict)
print(ergebnis)
4
Definieren der Hypothese mit Platzhalter für die Kategorieausprägungen
5
Definieren der Kategorieausprägungen
6
Anwenden des Klassifikationsbefehls auf die Textdaten mit den spezifizierten Kategorieausprägungen und der Hypothese
7
Initialisieren eines Wörterbuchs zur Speicherung der Ergebnisse
8
Extrahieren der Labels und Wahrscheinlichkeitswerte aus dem Klassifikationsergebnis
9
Speichern der Ergebnisse in einem DataFrame und Ausgabe
    positiv   negativ   neutral                                           sequence
0  0.707576  0.006816  0.285608  Die orthodoxe Gemeinde feiert heute #Ostern. I...
1  0.654405  0.003431  0.342164  Vielen Dank Gregor Rutz für die Unterstützung ...
2  0.010227  0.809285  0.180488  Wird ja immer schlimmer mit den Intoleranten d...
3  0.350793  0.387819  0.261388  Liebe Junge, geht wählen. Kann ja nicht sein, ...
4  0.440438  0.019927  0.539635  ‘— Das war unser EU-Wahl-Abschluss der SP– mit...
5  0.985130  0.002250  0.012621  Aufschlussreicher Blick hinter die Mauern! Tol...
6  0.007550  0.790673  0.201777  Denn ein Hard-Brexit würde der #EU, aber noch ...
7  0.375643  0.056651  0.567706  Familienbonus: Es ist erstaunlich wie viele Me...
8  0.301832  0.008279  0.689889  Integration passiert vor Ort. Deshalb arbeitet...
9  0.044657  0.208825  0.746518  Ich frage mich: Wer ist als nächstes dran Frau...
Quelle: 04_aufgabenspezifisches_Encoder-Modell.ipynb

Literatur

Laurer, M., Atteveldt, W. van, Casas, A., & Welbers, K. (2024, März 22). Building Efficient Universal Classifiers with Natural Language Inference. https://doi.org/10.48550/arXiv.2312.17543