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! 👋
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! 👋")Hallo! 👋
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
import json
daten = pd.read_csv("data/example_dataset.csv")
datenliste = list(daten["text"])Im Gegensatz zu kategoriespezifischen Modellen können wir mit universellen Decoder-Modellen jede beliebige Kategorie codieren. Als Beispiel verwenden wir hier das LLaMA 3.1 Modell von Meta (Grattafiori et al., 2024).
Anstelle des hier verwendeten Modells meta-llama/Meta-Llama-3.1-8B-Instruct können Sie auch andere universelle Decoder-Modelle (üblicherweise gekennzeichnet für “Text Generation”) 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
generate = pipeline("text-generation", model="meta-llama/Meta-Llama-3.1-8B-Instruct")Anders als bei den vorigen Ansätzen müssen wir bei einem universellen Decoder-Modell einen Prompt entwickeln, auf dessen Basis das Modell Text generiert (d. h. die Antwort auf die Codieranfrage), idealerweise in einem maschinenlesbaren Format. Der Prompt könnte bspw. folgendermaßen lauten: “Du bist ein trainierter Assistent für Inhaltsanalyse, der die allgemeine Stimmung beziehungsweise Tonalität von Texten analysiert. Antworte immer präzise im JSON-Format mit sentiment (positiv, neutral, negativ) und reasoning (eine Begründung auf Deutsch). Gib ausschließlich den JSON-Response, beginnend mit ‘{’ und endend mit ‘}’, mit diesen zwei Parametern zurück.” Diesen Prompt wenden wir nun iterativ auf jeden Text in unserem Datensatz an. Dies geht am einfachsten über eine for-Schleife.
Über den Parameter max_new_tokens können wir die Länge des generierten Outputs beschränken, do_sample sollten wir i. d. R. auf “False” setzen, um deterministische und somit replizierbare Antworten zu erhalten. Zu beachten ist außerdem, dass große Sprachmodelle wie das hier verwendete LLama-Modell 3.1 (model="meta-llama/Meta-Llama-3.1-8B-Instruct") über Hunggingface zwar prinzipiell frei verfügbar sind, oftmals jedoch eine Authentifizierung erfordern.
Das hier verwendete Modell meta-llama/Meta-Llama-3.1-8B-Instruct ist ein sehr großes Sprachmodell (also im wahrsten Sinne des Wortes ein Large Language Model, LLM), das erhebliche Rechenressourcen benötigt. Für die Ausführung dieses Modells ist eine GPU (Grafikkarte) mit mindestens 16 GB VRAM (Arbeitsspeicher) erforderlich. Auf einem Laptop oder Desktop-PC ohne entsprechende Hardware wird das Modell nicht ausgeführt werden können. Sollten Sie unsicher sein, können Sie die Voraussetzungen Ihrer Hardware i. d. R. über die Systemeinstellungen des Betriebssystems herausfinden. Im Zweifelsfall: Einfach ausprobieren — falls die Hardware nicht ausreicht, werden Sie eine entsprechende Fehlermeldung erhalten. Alternativ können Sie kleinere Modelle ausführen, die weniger Ressourcen benötigen, oder auf Cloud-Dienste zurückgreifen, die leistungsfähige Hardware bereitstellen. Allerdings: Selbst wenn das Modell auf Ihrer Hardware ausgeführt werden kann, wird die Verarbeitung je nach Textlänge und Modellgröße einige Zeit in Anspruch nehmen. Es bietet sich daher an, nicht alle Texte auf einmal zu verarbeiten, sondern die Liste der Texte in kleinere Chargen (Batches) aufzuteilen und diese nacheinander zu verarbeiten. Eine beispielhafte Batch-Verarbeitung finden Sie in der Umsetzung unserer Beispielstudie.
Python
ergebnis = []
for text in datenliste:
instructions = [
{"role": "system",
"content": "Du bist ein trainierter Assistent für Inhaltsanalyse, der die allgemeine Stimmung beziehungsweise Tonalität von Texten analysiert. Antworte immer präzise im JSON-Format mit sentiment (positiv, neutral, negativ) und reasoning (eine Begründung auf Deutsch). Gib ausschließlich den JSON-Response, beginnend mit '{' und endend mit '}', mit diesen zwei Parametern zurück"},
{"role": "user", "content": text}]
outputs = generate(instructions, max_new_tokens=256, do_sample=False)
ergebnis.append({"text": text, "response": outputs[0]["generated_text"][-1]['content']})Nachdem alle Antworten generiert wurden, können wir die Ergebnisse aus dem JSON-Format extrahieren. Wenn wir möchten, können wir die zusätzliche ausgegebene Begründung ebenfalls abspeichern, um uns diese anzusehen.
Es kann ab und an vorkommen, dass das Modell fehlerhaftes JSON zurückgibt (z. B. indem es Anführungszeichen “vergisst” oder Antworten bei Erreichen von max_new_tokens abgebrochen werden, sodass diese nicht durch eine geschwungene Klammer abschließen). Wie wir damit umgehen können, haben wir beispielhaft in der Umsetzung unserer Beispielstudie dokumentiert.
def parse_response(response):
parsed = json.loads(response)
return parsed['sentiment'], parsed['reasoning']
parsed_data = [(entry['text'], *parse_response(entry['response'])) for entry in ergebnis]
parsed_data = pd.DataFrame(parsed_data, columns=['text', 'sentiment', 'reasoning'])
print(parsed_data)