Einführung in die Sentimentanalyse mit Python

Die Sentimentanalyse ist eine der meistverwendeten Arten der Textanalyse. Sie ermöglicht es uns, auf einen Blick zu erkennen, wie sich Menschen in Bezug auf eine Vielzahl von Aspekten fühlen, und die Anwendungsbereiche umfassen unter anderem den Kundenservice, die Markt- und Produktforschung sowie die Wettbewerbsanalyse.
Wie alle Teilgebiete der linguistischen Datenverarbeitung (natural language processing, NLP) kann auch die Sentimentanalyse komplex sein. Glücklicherweise gibt es hervorragende Python-Pakete und -Tools, die den Zugang zu diesem NLP-Teilgebiet erheblich erleichtern.
In diesem Blogartikel erkunden wir einige der gängigsten Pakete für die Sentimentanalyse in Python, wie sie funktionieren und wie Sie mit modernsten Techniken Ihr eigenes Sentiment-Analysemodell trainieren können. Wir sehen uns auch einige Funktionen von PyCharm an, die die Arbeit mit diesen Paketen einfacher und schneller machen.
Was ist Sentimentanalyse?
Bei der Sentimentanalyse wird ein Text auf seinen emotionalen Ton hin untersucht. Bereits aus dieser Definition ist ersichtlich, dass die Sentimentanalyse ein sehr weites Feld ist, das eine Vielzahl von Methoden im Bereich der linguistischen Datenverarbeitung umfasst.
Es gibt viele Möglichkeiten, „emotionalen Ton“ zu definieren. Die meistverwendeten Methoden bestimmen die Valenz oder Polarität eines Textes – das heißt, wie positiv oder negativ die in einem Text ausgedrückte Stimmung ist. Emotionaler Ton wird in der Regel auch als Textklassifizierungsproblem behandelt, bei dem der Text entweder als positiv oder als negativ kategorisiert wird.
Nehmen wir einmal die folgende Amazon-Produktrezension:

Dies ist offenbar kein zufriedener Kunde, und mit Techniken der Sentimentanalyse würde diese Rezension als negativ eingestuft.
Der folgende Käufer hingegen ist viel zufriedener:

Diesmal würden die Techniken der Sentimentanalyse diese Rezension als positiv einstufen.
Unterschiedliche Arten der Sentimentanalyse
Es gibt verschiedene Möglichkeiten, emotionale Informationen aus Texten zu extrahieren. Sehen wir uns einige der wichtigsten davon an.
Mögliche Definitionen von „Sentiment“
Bei den Ansätzen zur Sentimentanalyse gibt es unterschiedliche Definitionen von Sentiment bzw. Emotion.
Binär: Hier wird die Valenz eines Dokuments in zwei Kategorien unterteilt, entweder positiv oder negativ – wie etwa bei der Datensammlung SST-2. Damit verwandt sind Valenzklassifizierungen, die eine neutrale Klasse (wenn ein Text keine Haltung zu einem Thema ausdrückt) oder sogar eine Konflikt-Klasse (wenn ein Text sowohl positive als auch negative Gefühle zu einem Thema ausdrückt) hinzufügen.
Einige Sentiment-Analyzer verwenden ein verwandtes Maß, um Texte als subjektiv oder objektiv zu klassifizieren.
Abgestuft: Dieser Begriff erstreckt sich auf mehrere unterschiedliche Herangehensweisen an die Sentimentanalyse, aber hier bezieht er sich auf die Aufschlüsselung der positiven bzw. negativen Valenz auf einer Likert-Skala. Ein bekanntes Beispiel hierfür ist die Datensammlung SST-5, die eine fünfstufige Likert-Skala mit den Klassen sehr positiv, positiv, neutral, negativ und sehr negativ verwendet.
Kontinuierlich: Die Valenz eines Textes kann auch kontinuierlich gemessen werden, wobei ein Zahlenwert angibt, wie positiv oder negativ die Haltung der Autorin oder des Autors ist. Zum Beispiel vergibt der Sentiment-Analyzer VADER Werte zwischen -1 (stark negativ) und 1 (stark positiv), wobei Werte nahe 0 auf eine neutrale Haltung hinweisen.
Emotionsbasiert: Dieser Ansatz, der auch als Emotionserkennung oder Emotionsidentifizierung bezeichnet wird, versucht, die spezifische Emotion zu erkennen, die in einem Text ausgedrückt wird. Dabei sind zwei Herangehensweisen möglich. Die kategoriale Emotionserkennung versucht, die in einem Text ausgedrückte Stimmung in eine von wenigen diskreten Emotionen zu klassifizieren, in der Regel auf Grundlage des Ekman-Modells, das Angst, Ekel, Furcht, Freude, Trauer und Überraschung umfasst. Es gibt eine Reihe von Datensammlungen für diese Art der Emotionserkennung. Die dimensionale Emotionserkennung, die in der Sentimentanalyse seltener zum Einsatz kommt, versucht stattdessen, drei emotionale Aspekte eines Textes zu messen: Polarität, Erregung (wie aufregend ein Gefühl ist) und Dominanz (wie eingeschränkt der emotionale Ausdruck ist).
Analyseebenen
Wir können auch unterschiedliche Ebenen definieren, auf denen ein Text analysiert werden kann. Um dies zu veranschaulichen, sehen wir uns eine weitere Rezension zur Kaffeemaschine an:

Dokumentebene: Dies ist die einfachste Analyseebene, bei der einem ganzen Textabschnitt eine einzige Haltung zugeschrieben wird. Eine Analyse auf der Dokumentebene kann sich zwar für sehr kurze Textstücke, wie z. B. Tweets, eignen, aber bei gemischten Gefühlen kann sie irreführende Ergebnissen liefern. Wenn wir zum Beispiel die Sentimentanalyse dieser Rezension auf das gesamte Dokument beziehen würden, kämen wir wahrscheinlich zum Ergebnis „Neutral“ oder „Konflikt“, da hier zwei gegensätzliche Haltungen zur selben Kaffeemaschine vorliegen.
Satzebene: Hier erfolgt die Sentimentanalyse für jeden Satz separat. Bei der Rezension der Kaffeemaschine würde die Analyse auf Satzebene zeigen, dass einige Aspekte des Produkts positiv, andere hingegen negativ bewertet wurden. Diese Analyse verrät uns jedoch nicht, was der Rezensentin oder dem Rezensenten an der Kaffeemaschine gefallen bzw. nicht gefallen hat.
Aspektbasiert: Diese Art der Sentimentanalyse dringt tiefer in einen Text vor und versucht, die Haltung der schreibenden Person zu bestimmten Aspekten zu verstehen. In unserer Kaffeemaschinenrezension wurden zwei Aspekte erwähnt: Aussehen und Geräuschentwicklung. Durch die Extraktion dieser Aspekte erhalten wir konkretere Informationen darüber, was der Rezensentin oder dem Rezensenten gefallen bzw. nicht gefallen hat. Das Aussehen der Maschine wurde positiv bewertet, während die Geräuschentwicklung negativ beurteilt wurde.
Kopplung der Sentimentanalyse mit anderen NLP-Techniken
Intentionbasiert: Bei dieser letzten Art der Sentimentanalyse wird der Text auf zweierlei Art und Weise klassifiziert: in Bezug auf die zum Ausdruck gebrachte Haltung und in Bezug auf das Thema des Textes. Wenn zum Beispiel ein Telekommunikationsunternehmen eine Supportanfrage mit einer Beschwerde über einen Netzausfall erhält, könnte die Intention oder das Thema als Zuverlässigkeit des Dienstes und die Haltung als negativ klassifiziert werden. Wie bei der aspektbasierten Sentimentanalyse gibt diese Analyse dem Unternehmen viel mehr Informationen als nur die Auskunft, ob die Kundin oder der Kunde eher zufrieden oder eher unzufrieden ist.
Anwendungen der Sentimentanalyse
Wahrscheinlich fallen Ihnen jetzt schon einige mögliche Anwendungsfälle für die Sentimentanalyse ein. Im Grunde kann sie überall dort eingesetzt werden, wo man Textinhalte mit Feedback oder Meinungen zu einem Thema erhalten kann. Organisationen oder Einzelpersonen können die Sentimentanalyse nutzen, um die sozialen Medien zu beobachten und herauszufinden, wie die Menschen über eine Marke, eine Behörde oder ein Thema denken.
Die Kundenfeedback-Analyse kann verwendet werden, um die in Rückmeldungen oder Supportanfragen geäußerten Haltungen zu ermitteln. Produktbewertungen können analysiert werden, um festzustellen, wie zufrieden oder unzufrieden die Menschen mit den Produkten eines Unternehmens sind. Und schließlich kann die Sentimentanalyse ein zentrales Instrument der Marktforschung und der Wettbewerbsanalyse sein, denn in diesen Bereichen können die Meinungen der Menschen über neue Trends, Funktionen und Konkurrenten die Strategien eines Unternehmens beeinflussen.
Wie funktioniert die Sentimentanalyse?
Auf einer allgemeinen Ebene werden bei der Sentimentanalyse Wörter (oder, in komplexeren Modellen, der Gesamtton eines Textes) einer Emotion zugeordnet. Die gebräuchlichsten Ansätze zur Sentimentanalyse lassen sich einer der drei folgenden Methoden zuordnen.
Lexikonbasierte Ansätze
Diese Methoden verwenden ein Lexikon, das Sentimentwerte für eine Liste von Wörtern enthält. Sie kombinieren diese Werte anhand einiger Regeln, um die Gesamtstimmung eines Textes zu ermitteln. Diese Methoden sind in der Regel sehr schnell und haben außerdem den Vorteil, dass sie genauere Stimmungsbewertungen liefern. Die Lexika werden jedoch in Handarbeit erstellt, und dies kann zeitaufwändig und teuer sein.
Machine-Learning-Modelle
Bei diesen Methoden wird ein maschinelles Lernmodell – meist ein naiver Bayes-Klassifikator – mit einer Datensammlung trainiert, die Texte – z. B. Filmkritiken – und deren Sentimentkennzeichnungen enthält. In diesem Modell werden Texte meist als positiv oder negativ eingestuft, und manchmal kommt noch eine neutrale Einstufung hinzu. Auch diese Modelle sind in der Regel sehr schnell, aber da sie im Normalfall die Beziehungen zwischen den Wörtern im Eingabetext nicht berücksichtigen, können sie bei komplexeren Texten, die Modifikatoren und Negationen enthalten, ins Straucheln kommen.
Große Sprachmodelle
Bei diesen Methoden wird ein vorab trainiertes transformationsbasiertes großes Sprachmodell mit denselben Datensammlungen optimiert, die für das Training der weiter oben erwähnten Machine-Learning-Klassifizierungsmodelle verwendet werden. Diese ausgefeilten Modelle können komplexe Beziehungen zwischen den Wörtern eines Textes modellieren, sind aber in der Regel langsamer als die beiden anderen Methoden.
Sentimentanalyse in Python
Python verfügt über ein reichhaltiges Ökosystem von NLP-Paketen. Wenn Sie Sentimentanalysen in dieser Sprache durchführen wollen, haben Sie also die Qual der Wahl.
Sehen wir uns nun einige der gängigsten Python-Pakete für die Sentimentanalyse an.
Die besten Python-Bibliotheken für die Sentimentanalyse
VADER
VADER (Valence Aware Dictionary and Sentiment Reasoner) ist ein beliebter lexikonbasierter Sentiment-Analyzer. Dieser Analyzer ist im leistungsstarken NLTK-Paket enthalten und liefert vier Sentimentwertungen: positiv, neutral und negativ sowie einen Gesamtscore. Die Werte für positiv, neutral und negativ reichen von 0 bis 1 und geben den Anteil des Textes an, der positiv, neutral bzw. negativ war. Der Gesamtscore reicht von -1 (extrem negativ) bis 1 (extrem positiv) und gibt die allgemeine Stimmungsvalenz des Textes an.
Sehen wir uns an einem einfachen Beispiel an, wie es funktioniert:
from nltk.sentiment.vader import SentimentIntensityAnalyzer import nltk
Zunächst müssen wir das VADER-Lexikon herunterladen.
nltk.download('vader_lexicon')
Anschließend können wir den SentimentIntensityAnalyzer()
von VADER instanziieren und die Sentimentwerte mit der Methode polarity_scores()
extrahieren.
analyzer = SentimentIntensityAnalyzer() sentence = "I love PyCharm! It's my favorite Python IDE." sentiment_scores = analyzer.polarity_scores(sentence) print(sentiment_scores)
{'neg': 0.0, 'neu': 0.572, 'pos': 0.428, 'compound': 0.6696}
Wir sehen, dass VADER diesem Text eine Gesamtbewertung von 0,67 gegeben und den Inhalt als zu 43% positiv, zu 57% neutral und zu 0% negativ eingestuft hat.
Die Funktionsweise von VADER besteht darin, die Sentimentwerte jedes Wortes im eigenen Lexikon nachzuschlagen und sie anhand von detaillierten Regeln zu kombinieren. Modifikatoren können zum Beispiel die Sentimentintensität eines Wortes erhöhen oder verringern. Ein Modifikator wie „ein bisschen“ vor einem Wort verringert die Sentimentintensität, während „extrem“ sie verstärkt.
Das VADER-Lexikon enthält auch Abkürzungen wie „smh“ (Kopfschütteln) sowie Emojis und eignet sich damit besonders gut für Texte in sozialen Medien. Die größte Einschränkung von VADER ist, dass es nur mit Englisch funktioniert, aber als Alternative können Sie Projekte wie vader-multi
verwenden. Ich habe über die Funktionsweise von VADER bereits geschrieben, falls Sie an einem tieferen Einblick in dieses Paket interessiert sein sollten.
NLTK
Mit NLTK können Sie auch Ihren eigenen ML-basierten Sentiment-Klassifikator trainieren, indem Sie Klassifikatoren aus scikit-learn
verwenden.
Es gibt viele Möglichkeiten zur Verarbeitung des Textes, der diesen Modellen zugeführt wird. Am einfachsten ist es, anhand der im Text vorkommenden Wörter vorzugehen. Diese Art der Textmodellierung wird Bag-of-Words-Ansatz genannt. Die einfachste Art der Bag-of-Words-Modellierung ist die binäre Vektorisierung. Dabei wird jedes Wort als ein Merkmal behandelt, wobei der Wert dieses Merkmals entweder 0 oder 1 ist (je nachdem, ob das Wort im Text vorkommt oder nicht).
Wenn Sie gerade erst beginnen, mit Textdaten und NLP zu arbeiten, und mehr darüber erfahren möchten, wie Textinhalte als Eingabedaten für ML-Modelle aufbereitet werden können, empfehle ich Ihnen meinen Vortrag zu diesem Thema, der eine einfache Einführung bietet.
Ein Beispiel finden Sie in der NLTK-Dokumentation, wo ein naiver Bayes-Klassifikator trainiert wird, um zu bestimmen, ob ein Text subjektiv oder objektiv ist. In diesem Beispiel wird einigen Begriffen ein zusätzlicher Verneinungsmodifikator hinzugefügt, basierend auf Regeln, die angeben, ob das jeweilige Wort oder Zeichen wahrscheinlich zur Verneinung einer an anderer Stelle im Text ausgedrückten Haltung verwendet wird. Wenn Sie mehr über dieses Thema erfahren möchten, finden Sie bei Real Python zudem ein Tutorial zur Sentimentanalyse, das auf das Training eigener Klassifikatoren mit NLTK eingeht.
Pattern und TextBlob
Das Pattern-Paket stellt einen weiteren lexikonbasierten Ansatz zur Sentimentanalyse bereit. Es verwendet das Lexikon SentiWordNet, in dem jeder Synonymgruppe (synset) aus WordNet jeweils ein Wert für Positivität, Negativität und Objektivität zugeordnet ist. Die positiven und negativen Werte der einzelnen Wörter werden anhand bestimmter Regeln kombiniert, um einen finalen Polaritätswert zu erhalten. Auf ähnliche Weise werden die Objektivitätswerte der einzelnen Wörter kombiniert, um eine finale Subjektivitätsbewertung zu erhalten.
Da WordNet Wortart-Informationen enthält, können die Regeln berücksichtigen, wenn Adjektive oder Adverbien, die einem Wort vorausgehen, dessen Sentiment modifizieren. Der Regelsatz berücksichtigt auch Negationen, Ausrufezeichen und Emojis und enthält sogar einige Regeln für Idiome und Sarkasmus.
Als eigenständige Bibliothek ist Pattern jedoch nur mit Python 3.6 kompatibel. Daher wird Pattern meist über TextBlob verwendet. Standardmäßig verwendet der TextBlob-Analyzer seine eigene Implementierung der Pattern-Bibliothek zur Generierung von Sentimentwertungen.
Sehen wir uns das einmal in Aktion an:
from textblob import TextBlob
Wie Sie sehen, lassen wir die TextBlob-Methode auf unseren Text los und extrahieren dann den Sentimentwert aus dem Attribut sentiment
.
pattern_blob = TextBlob("I love PyCharm! It's my favorite Python IDE.") sentiment = pattern_blob.sentiment print(f"Polarity: {sentiment.polarity}") print(f"Subjectivity: {sentiment.subjectivity}")
Polarity: 0.625 Subjectivity: 0.6
Für unseren Beispielsatz gibt uns Pattern in TextBlob einen Polaritätswert von 0,625 (relativ nahe am von VADER ermittelten Wert) sowie einen Subjektivitätswert von 0,6 zurück.
Aber es gibt noch eine zweite Möglichkeit, in TextBlob Sentimentwerte zu erhalten. Dieses Paket enthält auch einen vortrainierten naiven Bayes-Klassifikator, der einen Text als positiv oder negativ einstuft und angibt, wie wahrscheinlich es ist, dass der Text positiv oder negativ ist.
Um diese Methode zu verwenden, müssen wir zunächst das Modul punkt
und die Datensammlung movie-reviews
von NLTK herunterladen, die zum Trainieren dieses Modells verwendet wird.
import nltk nltk.download('movie_reviews') nltk.download('punkt') from textblob import TextBlob from textblob.sentiments import NaiveBayesAnalyzer
Erneut lassen wir TextBlob
über unseren Text laufen, dieses Mal jedoch mit dem Argument analyzer=NaiveBayesAnalyzer()
. Dann extrahieren wir wie zuvor die Sentimentwerte aus dem sentiment-Attribut.
nb_blob = TextBlob("I love PyCharm! It's my favorite Python IDE.", analyzer=NaiveBayesAnalyzer()) sentiment = nb_blob.sentiment print(sentiment)
Sentiment(classification='pos', p_pos=0.5851800554016624, p_neg=0.4148199445983381)
Diesmal erhalten wir die Kennzeichnung pos
(positiv), wobei das Modell schätzt, dass der Text mit einer Wahrscheinlichkeit von 59% positiv und mit einer Wahrscheinlichkeit von 41% negativ ist.
spaCy
Eine andere Option zur Durchführung von Sentimentanalysen ist spaCy. spaCy ist ein weiteres gängiges NLP-Paket für Python, mit einer Vielzahl von Optionen für die Textverarbeitung.
Die erste Methode besteht in der Verwendung des spacytextblob-Plugins, um den Sentiment-Analyzer TextBlob innerhalb Ihrer spaCy-Pipeline zu verwenden. Als Vorbereitung müssen wir spacy
und spacytextblob
installieren und das passende Sprachmodell herunterladen.
import spacy import spacy.cli from spacytextblob.spacytextblob import SpacyTextBlob spacy.cli.download("en_core_web_sm")
Anschließend laden wir dieses Sprachmodell und nehmen spacytextblob
in unsere Textverarbeitungs-Pipeline auf. TextBlob lässt sich über die pipe
-Methode von SpaCy verwenden und so in eine komplexere Textverarbeitungs-Pipeline einbinden, die Vorverarbeitungsschritte wie Wortart-Tagging, Lemmatisierung und Eigennamenerkennung enthalten kann. Durch die Vorverarbeitung kann der Text normalisiert und angereichert werden, sodass nachgelagerte Modelle das Maximum aus dem Textinput herausholen können.
nlp = spacy.load('en_core_web_sm') nlp.add_pipe('spacytextblob')
Vorerst analysieren wir unseren Beispielsatz ohne Vorverarbeitung:
doc = nlp("I love PyCharm! It's my favorite Python IDE.") print('Polarity: ', doc._.polarity) print('Subjectivity: ', doc._.subjectivity)
Polarity: 0.625 Subjectivity: 0.6
Wir erhalten die gleichen Ergebnisse wie bei der Verwendung von TextBlob weiter oben.
Eine zweite Möglichkeit, die Sentimentanalyse in SpaCy durchzuführen, ist das Training eines eigenen Modells mit der TextCategorizer-Klasse. Damit können wir eine Reihe von in spaCY erstellten Modellen mit einem Sentimentanalyse-Trainingssatz trainieren. Da auch hier die spaCy-Pipeline verwendet werden kann, haben Sie viele Möglichkeiten, Ihren Text vor dem Training Ihres Modells einer Vorverarbeitung zu unterziehen.
Schließlich können wir mit spacy-llm große Sprachmodelle für die Sentimentanalyse verwenden. Damit können wir verschiedene proprietäre große Sprachmodelle (LLMs) von OpenAI, Anthropic, Cohere oder Google zu einer Sentimentanalyse unserer Texte auffordern.
Dieser Ansatz funktioniert etwas anders als die bisher besprochenen Methoden. Anstatt das Modell zu trainieren, verwenden wir allgemeine Modelle wie GPT-4 zur Sentimenteinschätzung eines Textes. Dabei haben wir die Wahl zwischen Zero-Shot-Learning (hier wird ein Prompt ohne Beispiele an das Modell übermittelt) oder Little-Shot-Learning (bei dem ein Prompt und einige Beispiele an das Modell übergeben werden).
Transformers
Das letzte Sentimentanalyse-Paket für Python, das wir besprechen werden, ist Transformers von Hugging Face.
Hugging Face hostet (neben anderen Modellen, einschließlich Computer Vision und Audiomodellen) alle wichtigen quelloffenen LLMs zur kostenlosen Verwendung und bietet eine Plattform für das Training, Deployment und Teilen dieser Modelle. Das Transformers-Paket bietet ein breites Spektrum von Funktionen (einschließlich Sentimentanalyse) unter Verwendung der von Hugging Face gehosteten LLMs.
Ergebnisse von Sentimentanalysen verstehen
Nachdem wir nun auf die verschiedenen Möglichkeiten zur Sentimentanalyse in Python eingegangen sind, fragen Sie sich vielleicht: „Wie kann ich das auf meine eigenen Daten anwenden?“
Um dies zu verstehen, werden wir PyCharm verwenden, um zwei Pakete – VADER und TextBlob – miteinander zu vergleichen. Ihre verschiedenen Sentimentbewertungen bieten uns mehrere unterschiedliche Perspektiven auf unsere Daten. Wir werden diese Pakete verwenden, um die Datensammlung der Amazon-Rezensionen zu analysieren.
PyCharm Professional ist eine leistungsstarke Python-IDE für Data Science, die umfassende Code-Completion, Inspektionen und Debugging für Python bietet, ergänzt durch umfangreiche Unterstützung für Datenbanken, Jupyter, Git, Conda und mehr – alles im Standard-Installationsumfang. Darüber hinaus erhalten Sie unglaublich nützliche Funktionen wie Spaltenstatistiken und eine Diagrammansicht für DataFrames sowie Hugging-Face-Integrationen, die das Arbeiten mit LLMs erheblich beschleunigen und vereinfachen. In diesem Blogartikel erkunden wir die erweiterten Funktionen von PyCharm für die Arbeit mit Dataframes, die uns einen schnellen Überblick darüber verschaffen, welche Sentimentwerte die beiden Pakete liefern.
Sollten Sie jetzt Ihr eigenes Sentiment-Analyseprojekt in Angriff nehmen wollen, können Sie ein kostenloses dreimonatiges Abonnement für PyCharm aktivieren. Klicken Sie auf den nachstehenden Link und geben Sie diesen Aktionscode ein: PCSA24. Sie erhalten dann einen Aktivierungscode per E-Mail.
Als Erstes müssen wir die Daten laden. Mit der Methode load_dataset()
aus dem Datasets-Paket können wir diese Daten aus dem Hugging Face Hub herunterladen.
from datasets import load_dataset amazon = load_dataset("fancyzhx/amazon_polarity")
Sie können den Mauszeiger auf den Namen der Datensammlung bewegen, um die Beschreibung der Hugging-Face-Datensammlung direkt in PyCharm zu sehen. So können Sie unkompliziert Informationen über Hugging-Face-Assets abrufen, ohne die IDE zu verlassen.

Hier ist der Inhalt dieser Datensammlung:
amazon
DatasetDict({ train: Dataset({ features: ['label', 'title', 'content'], num_rows: 3600000 }) test: Dataset({ features: ['label', 'title', 'content'], num_rows: 400000 }) })
Die Trainingsdatensammlung enthält 3,6 Millionen und die Testdatensammlung 400.000 Beobachtungen. In diesem Tutorial werden wir mit der Trainingsdatensammlung arbeiten.
Wir verwenden nun den SentimentIntensityAnalyzer
von VADER und die Methode TextBlob.
from nltk.sentiment.vader import SentimentIntensityAnalyzer import nltk nltk.download("vader_lexicon") analyzer = SentimentIntensityAnalyzer()
from textblob import TextBlob
Die Trainingsdatensammlung hat zu viele Beobachtungen, um sie übersichtlich darzustellen. Daher nehmen wir eine Zufallsstichprobe von 1.000 Rezensionen, die die allgemeine Haltung der Rezensierenden repräsentieren sollen.
from random import sample sample_reviews = sample(amazon["train"]["content"], 1000)
Ermitteln wir nun die VADER- und TextBlob-Bewertungen für jede dieser Rezensionen. Wir durchlaufen alle Rezensionen in einer Schleife, lassen sie durch die Sentiment-Analyzer laufen und fügen die Ergebnisse dann in eine spezielle Liste ein.
vader_neg = [] vader_neu = [] vader_pos = [] vader_compound = [] textblob_polarity = [] textblob_subjectivity = [] for review in sample_reviews: vader_sent = analyzer.polarity_scores(review) vader_neg += [vader_sent["neg"]] vader_neu += [vader_sent["neu"]] vader_pos += [vader_sent["pos"]] vader_compound += [vader_sent["compound"]] textblob_sent = TextBlob(review).sentiment textblob_polarity += [textblob_sent.polarity] textblob_subjectivity += [textblob_sent.subjectivity]
Dann fügen wir diese Listen in einen pandas-DataFrame als separate Spalten ein:
import pandas as pd sent_scores = pd.DataFrame({ "vader_neg": vader_neg, "vader_neu": vader_neu, "vader_pos": vader_pos, "vader_compound": vader_compound, "textblob_polarity": textblob_polarity, "textblob_subjectivity": textblob_subjectivity })
Jetzt können wir uns die Ergebnisse ansehen.
An diesem Punkt machen wir uns in der Regel daran, umfangreichen Code für die explorative Datenanalyse zu programmieren. Dazu könnten wir die describe
-Methode von pandas verwenden, um Statistiken über unsere Spalten zu erhalten, und Matplotlib– oder seaborn-Code schreiben, um unsere Ergebnisse zu visualisieren. PyCharm verfügt jedoch über einige Funktionen, die das Ganze beschleunigen.
Geben wir nun unseren DataFrame mit einer print-Anweisung aus.
sent_scores
In der oberen rechten Ecke sehen wir eine Schaltfläche mit der Bezeichnung Show Column Statistics. Wenn wir das anklicken, erhalten wir zwei unterschiedliche Optionen: Compact und Detailed. Wir entscheiden uns für Detailed.

Jetzt können wir einfach in den Kopfzeilen auf statistische Daten zugreifen! Wir sehen, dass der VADER-Gesamtscore einen Mittelwert von 0,4 (Median = 0,6) hat, während die TextBlob-Polarität einen Mittelwert von 0,2 (Median = 0,2) aufweist.
Dies deutet darauf hin, dass VADER Rezensionen im Durchschnitt positiver bewertet als TextBlob. Außerdem ist zu erkennen, dass beide Analyzer wahrscheinlich mehr positive als negative Rezensionen gefunden haben – mit einigen Visualisierungen können wir das genauer untersuchen.

Eine weitere Funktion von PyCharm, die wir nutzen können, ist die Chart View für DataFrames. Die Schaltfläche für diese Funktion befindet sich in der oberen linken Ecke.

Durch Anklicken der Schaltfläche wechseln wir zum Diagrammeditor. Hier können wir ganz ohne Code Visualisierungen aus unserem DataFrame erstellen.
Beginnen wir mit dem VADER-Gesamtscore. Um dieses Diagramm zu erstellen, wählen Sie in der oberen rechten Ecke Show Series Settings aus.

Entfernen Sie die Standardwerte für X Axis und Y Axis. Ersetzen Sie den Wert für X Axis und Y Axis durch vader_compound
. Klicken Sie auf den Pfeil neben dem Variablennamen im Feld Y Axis und wählen Sie count
.
Wählen Sie schließlich unter den Diagrammsymbolen direkt unterhalb von Series Settings die Option Histogram aus. Wir haben wahrscheinlich eine bimodale Verteilung für den VADER-Gesamtscore, mit einem leichten Höhepunkt bei ca. -0,8 und einer viel ausgeprägteren Höhepunkt bei 0,9. Diese Höhepunkte sind wahrscheinlich auf die Zweiteilung in negative und positive Rezensionen zurückzuführen. Außerdem gibt es weit mehr positive als negative Rezensionen.

Wir wiederholen die gleiche Übung und erstellen nur ein Histogramm, das die Verteilung der TextBlob-Polaritäten visualisiert.
TextBlob stuft die meisten Rezensionen als neutral ein; nur sehr wenige Rezensionen werden als stark positiv oder negativ bewertet. Um zu verstehen, warum die beiden Analyzer auf unterschiedliche Bewertungen kommen, sehen wir uns zwei Rezensionen an, die TextBlob als neutral eingestuft hat, VADER jedoch als stark positiv bzw. stark negativ.

Wir rufen den Index der ersten Rezension ab, die VADER als positiv und TextBlob als neutral bewertet hat:
sent_scores[(sent_scores["vader_compound"] >= 0.8) & (sent_scores["textblob_polarity"].between(-0.1, 0.1))].index[0]
42
Dann lassen wir uns den Index der ersten Rezension geben, die VADER als negativ und TextBlob als neutral bewertet hat:
sent_scores[(sent_scores["vader_compound"] <= -0.8) & (sent_scores["textblob_polarity"].between(-0.1, 0.1))].index[0]
0
Sehen wir uns zunächst die positive Rezension an:
sample_reviews[42]
"I love carpet sweepers for a fast clean up and a way to conserve energy. The Ewbank Multi-Sweep is a solid, well built appliance. However, if you have pets, you will find that it takes more time cleaning the sweeper than it does to actually sweep the room. The Ewbank does pick up pet hair most effectively but emptying it is a bit awkward. You need to take a rag to clean out both dirt trays and then you need a small tooth comb to pull the hair out of the brushes and the wheels. To do a proper cleaning takes quite a bit of time. My old Bissell is easier to clean when it comes to pet hair and it does a great job. If you do not have pets, I would recommend this product because it is definitely well made and for small cleanups, it would suffice. For those who complain about appliances being made of plastic, unfortunately, these days, that's the norm. It's not great and plastic definitely does not hold up but, sadly, product quality is no longer a priority in business."
Diese Rezension erscheint gemischt, ist aber insgesamt leicht positiv.
Sehen wir uns nun die negative Rezension an:
sample_reviews[0]
'The only redeeming feature of this Cuisinart 4-cup coffee maker is the sleek black and silver design. After that, it rapidly goes downhill. It is frustratingly difficult to pour water from the carafe into the chamber unless it's done extremely slow and with accurate positioning. Even then, water still tends to dribble out and create a mess. The lid, itself, is VERY poorly designed with it's molded, round "grip" to supposedly remove the lid from the carafe. The only way I can remove it is to insert a sharp pointed object into one of the front pouring holes and pry it off! I've also occasionally had a problem with the water not filtering down through the grounds, creating a coffee ground lake in the upper chamber and a mess below. I think the designer should go back to the drawing-board for this one.'
Diese Rezension ist eindeutig negativ. Im Vergleich scheint VADER richtiger zu liegen, aber es neigt bei der Textanalyse zur Überbewertung von positiven Begriffen.
Als letzten Aspekt können wir uns ansehen, wie subjektiv oder objektiv die einzelnen Rezensionen sind. Dazu erstellen wir ein Histogramm der TextBlob-Subjektivitätswerte.

Interessanterweise ist die Subjektivität in den Rezensionen breit verteilt, wobei die meisten Rezensionen eine Mischung aus subjektivem und objektivem Schreiben sind. Einige wenige Rezensionen sind sehr subjektiv (nahe 1) bzw. sehr objektiv (nahe 0).
Zusammengenommen geben uns diese Werte gute Möglichkeiten zum Aufschlüsseln der Daten. Wenn wir die objektiven Aspekte erfahren möchten, die den Leuten an den Produkten gefallen oder nicht gefallen haben, könnten wir uns die Rezensionen mit einem niedrigen Subjektivitätswert und einem VADER-Gesamtscore in der Nähe von 1 bzw. -1 ansehen.
Wenn wir dagegen wissen möchten, wie die Menschen emotional auf die Produkte reagieren, könnten wir uns die Rezensionen mit einem hohen Subjektivitätswert und einem hohen oder niedrigen VADER-Gesamtscore vornehmen.
Folgendes ist zu beachten
Wie bei jedem Problem der linguistischen Datenverarbeitung sind auch bei der Sentimentanalyse verschiedene Punkte zu beachten.
Eine der wichtigsten Überlegungen ist die Sprache der Texte, die es zu analysieren gilt. Viele der lexikonbasierten Methoden funktionieren nur mit bestimmten Sprachen. Wenn Sie also mit Sprachen arbeiten, die nicht von diesen Lexika unterstützt werden, müssen Sie möglicherweise einen anderen Ansatz wählen, z. B. ein bestehendes LLM optimieren oder Ihre eigenen Modelle trainieren.
Außerdem können bei zunehmender Textkomplexität auch lexikonbasierte Analyzer und Bag-of-Words-basierte Modelle bei der Sentimenterkennung auf Schwierigkeiten stoßen. Sarkasmus oder subtilere Kontextindikatoren können von einfacheren Modellen nur schwer erkannt werden, und daher sind diese Modelle eventuell nicht in der Lage, die Haltung in solchen Texten korrekt zu klassifizieren. LLMs können möglicherweise auch mit komplexeren Texten umgehen, aber dazu müssen Sie mit unterschiedlichen Modellen experimentieren.
Und schließlich treten bei der Sentimentanalyse die gleichen Probleme wie bei jeder anderen Machine-Learning-Aufgabe auf. Ihre Modelle können nur so gut sein wie die Trainingsdaten, die Sie verwenden. Wenn Sie nicht an qualitativ hochwertige, für Ihren Problembereich geeignete Trainings- und Testdatensammlungen herankommen, wird es Ihnen nicht gelingen, die Haltung Ihrer Zielgruppe korrekt einzuschätzen.
Außerdem sollten Ihre Ziele auf Ihr Geschäftsproblem abgestimmt sein. Es mag attraktiv erscheinen, ein Modell zu erstellen, um zu erfahren, ob Ihre Produkte in Ihrer Kundschaft „Trauer“, „Wut“ oder „Abscheu“ auslösen. Wenn Ihnen das jedoch nicht hilft, Entscheidungen darüber zu treffen, wie Sie Ihre Produkte verbessern können, dann ist das keine Lösung für Ihr Problem.
Fazit
In diesem Blogartikel sind wir tief in das faszinierende Gebiet der Python-Sentimentanalyse vorgedrungen und haben gesehen, wie eine Reihe leistungsstarker Pakete dieses komplexe Thema zugänglicher macht.
Wir sind auf die möglichen Anwendungen der Sentimentanalyse, unterschiedliche Möglichkeiten zur Sentimentbewertung und die wichtigsten Methoden zur Extraktion der in einem Text ausgedrückten Haltung eingegangen. Wir haben auch einige hilfreiche Funktionen in PyCharm kennengelernt, die das Arbeiten mit Modellen und die Interpretation der Ergebnisse vereinfachen und beschleunigen.
Auch wenn im Bereich der linguistischen Datenverarbeitung derzeit große Sprachmodelle im Fokus stehen, haben die älteren Techniken der lexikonbasierten Analyse oder traditionelle Machine-Learning-Modelle wie naive Bayes-Klassifikatoren immer noch ihren Platz in der Sentimentanalyse. Diese Techniken zeigen ihre Stärken bei der Analyse einfacherer Texte oder wenn Geschwindigkeit, Vorhersagen oder eine einfache Bereitstellung im Vordergrund stehen. LLMs eignen sich insbesondere für komplexere oder nuanciertere Texte.
Jetzt, da Sie mit den Grundlagen vertraut sind, können Sie in unserem Tutorial lernen, wie Sie mit LLMs Sentimentanalysen durchführen können. Unsere Schritt-für-Schritt-Anleitung zeigt Ihnen, wie Sie das richtige Modell für Ihr Problem auswählen, wie Sie es für die Sentimentanalyse verwenden und sogar selbst Optimierungen am Modell vornehmen können.
Wenn Sie nach diesem Blogartikel noch mehr über linguistische Datenverarbeitung oder maschinelles Lernen erfahren möchten, finden Sie hier einige Ressourcen:
- Einführung in die Sentimentanalyse mit großen Sprachmodellen
- Einstieg in das maschinelle Lernen mit PyCharm
- Maschinelle Lernmethoden in der Softwareentwicklung
Steigen Sie mit PyCharm direkt in die Sentimentanalyse ein
Sollten Sie jetzt Ihr eigenes Sentiment-Analyseprojekt in Angriff nehmen wollen, können Sie ein kostenloses dreimonatiges Abonnement für PyCharm aktivieren. Klicken Sie auf den nachstehenden Link und geben Sie diesen Aktionscode ein: PCSA24. Sie erhalten dann einen Aktivierungscode per E-Mail.
Autorin des ursprünglichen Blogposts