{"id":572210,"date":"2025-06-02T02:04:23","date_gmt":"2025-06-02T01:04:23","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=pycharm&#038;p=572210"},"modified":"2025-06-02T02:04:31","modified_gmt":"2025-06-02T01:04:31","slug":"einfuehrung-in-die-sentimentanalyse-mit-python","status":"publish","type":"pycharm","link":"https:\/\/blog.jetbrains.com\/de\/pycharm\/2025\/06\/einfuehrung-in-die-sentimentanalyse-mit-python\/","title":{"rendered":"Einf\u00fchrung in die Sentimentanalyse mit Python"},"content":{"rendered":"<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-534190\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/12\/pc-featured_blog_1280x720_en.png\" alt=\"Einf\u00fchrung in die Sentimentanalyse mit Python\" width=\"2560\" height=\"1440\" \/><\/figure>\n<p>Die Sentimentanalyse ist eine der meistverwendeten Arten der Textanalyse. Sie erm\u00f6glicht es uns, auf einen Blick zu erkennen, wie sich Menschen in Bezug auf eine Vielzahl von Aspekten f\u00fchlen, und die Anwendungsbereiche umfassen unter anderem den Kundenservice, die Markt- und Produktforschung sowie die Wettbewerbsanalyse.<\/p>\n<p>Wie alle Teilgebiete der linguistischen Datenverarbeitung (natural language processing, NLP) kann auch die Sentimentanalyse komplex sein. Gl\u00fccklicherweise gibt es hervorragende <a href=\"https:\/\/www.jetbrains.com\/guide\/python\/\" target=\"_blank\" rel=\"noopener\">Python<\/a>-Pakete und -Tools, die den Zugang zu diesem NLP-Teilgebiet erheblich erleichtern.<\/p>\n<p>In diesem Blogartikel erkunden wir einige der g\u00e4ngigsten Pakete f\u00fcr die Sentimentanalyse in Python, wie sie funktionieren und wie Sie mit modernsten Techniken Ihr eigenes Sentiment-Analysemodell trainieren k\u00f6nnen. Wir sehen uns auch einige Funktionen von <a href=\"https:\/\/www.jetbrains.com\/pycharm\/data-science\/\" target=\"_blank\" rel=\"noopener\" data-type=\"link\" data-id=\"https:\/\/www.jetbrains.com\/de-de\/pycharm\/data-science\/\">PyCharm<\/a> an, die die Arbeit mit diesen Paketen einfacher und schneller machen.<\/p>\n<h2 class=\"wp-block-heading\">Was ist Sentimentanalyse?<\/h2>\n<p>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.<\/p>\n<p>Es gibt viele M\u00f6glichkeiten, \u201eemotionalen Ton\u201c zu definieren. Die meistverwendeten Methoden bestimmen die <em>Valenz<\/em> oder <em>Polarit\u00e4t<\/em> eines Textes \u2013 das hei\u00dft, wie positiv oder negativ die in einem Text ausgedr\u00fcckte Stimmung ist. Emotionaler Ton wird in der Regel auch als Textklassifizierungsproblem behandelt, bei dem der Text entweder als positiv oder als negativ kategorisiert wird.<\/p>\n<p>Nehmen wir einmal die folgende <a href=\"https:\/\/www.amazon.com\/AmazonBasics-12-Cup-Coffee-Reusable-Stainless\/dp\/B084ZH769P\/ref=sr_1_1_ffob_sspa?th=1\" target=\"_blank\" rel=\"noopener\">Amazon-Produktrezension<\/a>:<\/p>\n<figure class=\"wp-block-image size-full is-resized\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-532284\" style=\"aspect-ratio: 3.373529411764706; width: 840px; height: auto;\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/11\/Screenshot-2024-07-24-at-15.14.00.png\" alt=\"\" width=\"2294\" height=\"680\" \/><\/figure>\n<p>Dies ist offenbar kein zufriedener Kunde, und mit Techniken der Sentimentanalyse w\u00fcrde diese Rezension als negativ eingestuft.<\/p>\n<p>Der folgende K\u00e4ufer hingegen ist viel zufriedener:<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-532295\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/11\/Screenshot-2024-07-24-at-15.13.21.png\" alt=\"\" width=\"1566\" height=\"408\" \/><\/figure>\n<p>Diesmal w\u00fcrden die Techniken der Sentimentanalyse diese Rezension als positiv einstufen.<\/p>\n<h3 class=\"wp-block-heading\">Unterschiedliche Arten der Sentimentanalyse<\/h3>\n<p>Es gibt verschiedene M\u00f6glichkeiten, emotionale Informationen aus Texten zu extrahieren. Sehen wir uns einige der wichtigsten davon an.<\/p>\n<h4 class=\"wp-block-heading\">M\u00f6gliche Definitionen von \u201eSentiment\u201c<\/h4>\n<p>Bei den Ans\u00e4tzen zur Sentimentanalyse gibt es unterschiedliche Definitionen von Sentiment bzw. Emotion.<\/p>\n<p><strong>Bin\u00e4r<\/strong>: Hier wird die Valenz eines Dokuments in zwei Kategorien unterteilt, entweder <em>positiv<\/em> oder <em>negativ<\/em> \u2013 wie etwa bei der Datensammlung <a href=\"https:\/\/huggingface.co\/datasets\/stanfordnlp\/sst2\" target=\"_blank\" rel=\"noopener\">SST-2<\/a>. Damit verwandt sind Valenzklassifizierungen, die eine <em>neutrale<\/em> Klasse (wenn ein Text keine Haltung zu einem Thema ausdr\u00fcckt) oder sogar eine <em>Konflikt<\/em>-Klasse (wenn ein Text sowohl positive als auch negative Gef\u00fchle zu einem Thema ausdr\u00fcckt) hinzuf\u00fcgen.<\/p>\n<p>Einige Sentiment-Analyzer verwenden ein verwandtes Ma\u00df, um Texte als <em>subjektiv<\/em> oder <em>objektiv<\/em> zu klassifizieren.<\/p>\n<p><strong>Abgestuft<\/strong>: Dieser Begriff erstreckt sich auf mehrere unterschiedliche Herangehensweisen an die Sentimentanalyse, aber hier bezieht er sich auf die Aufschl\u00fcsselung der positiven bzw. negativen Valenz auf einer Likert-Skala. Ein bekanntes Beispiel hierf\u00fcr ist die Datensammlung <a href=\"https:\/\/huggingface.co\/datasets\/SetFit\/sst5\" target=\"_blank\" rel=\"noopener\">SST-5<\/a>, die eine f\u00fcnfstufige Likert-Skala mit den Klassen <em>sehr positiv<\/em>, <em>positiv<\/em>, <em>neutral<\/em>, <em>negativ<\/em> und <em>sehr negativ<\/em> verwendet.<\/p>\n<p><strong>Kontinuierlich<\/strong>: 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 <a href=\"https:\/\/github.com\/cjhutto\/vaderSentiment\" target=\"_blank\" rel=\"noopener\">VADER<\/a> Werte zwischen -1 (<em>stark negativ<\/em>) und 1 (<em>stark positiv<\/em>), wobei Werte nahe 0 auf eine neutrale Haltung hinweisen.<\/p>\n<p><strong>Emotionsbasiert<\/strong>: Dieser Ansatz, der auch als Emotionserkennung oder Emotionsidentifizierung bezeichnet wird, versucht, die spezifische Emotion zu erkennen, die in einem Text ausgedr\u00fcckt wird. Dabei sind zwei Herangehensweisen m\u00f6glich. Die kategoriale Emotionserkennung versucht, die in einem Text ausgedr\u00fcckte Stimmung in eine von wenigen diskreten Emotionen zu klassifizieren, in der Regel auf Grundlage des <a href=\"https:\/\/www.tandfonline.com\/doi\/abs\/10.1080\/02699939208411068\" target=\"_blank\" rel=\"noopener\">Ekman<\/a>-Modells, das <em>Angst<\/em>, <em>Ekel<\/em>, <em>Furcht<\/em>, <em>Freude<\/em>, <em>Trauer<\/em> und <em>\u00dcberraschung<\/em> umfasst. Es gibt eine <a href=\"https:\/\/huggingface.co\/j-hartmann\/emotion-english-distilroberta-base#appendix-%F0%9F%93%9A\" target=\"_blank\" rel=\"noopener\">Reihe von Datensammlungen<\/a> f\u00fcr diese Art der Emotionserkennung. Die dimensionale Emotionserkennung, die in der Sentimentanalyse seltener zum Einsatz kommt, versucht stattdessen, <a href=\"https:\/\/link.springer.com\/article\/10.1007\/s12144-014-9219-4\" target=\"_blank\" rel=\"noopener\">drei emotionale Aspekte<\/a> eines Textes zu messen: <em>Polarit\u00e4t<\/em>, <em>Erregung<\/em> (wie aufregend ein Gef\u00fchl ist) und <em>Dominanz<\/em> (wie eingeschr\u00e4nkt der emotionale Ausdruck ist).<\/p>\n<h4 class=\"wp-block-heading\">Analyseebenen<\/h4>\n<p>Wir k\u00f6nnen auch unterschiedliche Ebenen definieren, auf denen ein Text analysiert werden kann. Um dies zu veranschaulichen, sehen wir uns eine weitere Rezension zur Kaffeemaschine an:<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-532307\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/11\/Screenshot-2024-07-24-at-16.43.21.png\" alt=\"\" width=\"1438\" height=\"374\" \/><\/figure>\n<p><strong>Dokumentebene<\/strong>: Dies ist die einfachste Analyseebene, bei der einem ganzen Textabschnitt eine einzige Haltung zugeschrieben wird. Eine Analyse auf der Dokumentebene kann sich zwar f\u00fcr sehr kurze Textst\u00fccke, wie z.\u00a0B. Tweets, eignen, aber bei gemischten Gef\u00fchlen kann sie irref\u00fchrende Ergebnissen liefern. Wenn wir zum Beispiel die Sentimentanalyse dieser Rezension auf das gesamte Dokument beziehen w\u00fcrden, k\u00e4men wir wahrscheinlich zum Ergebnis \u201eNeutral\u201c oder \u201eKonflikt\u201c, da hier zwei gegens\u00e4tzliche Haltungen zur selben Kaffeemaschine vorliegen.<\/p>\n<p><strong>Satzebene<\/strong>: Hier erfolgt die Sentimentanalyse f\u00fcr jeden Satz separat. Bei der Rezension der Kaffeemaschine w\u00fcrde die Analyse auf Satzebene zeigen, dass einige Aspekte des Produkts positiv, andere hingegen negativ bewertet wurden. Diese Analyse verr\u00e4t uns jedoch nicht, was der Rezensentin oder dem Rezensenten an der Kaffeemaschine gefallen bzw. nicht gefallen hat.<\/p>\n<p><strong>Aspektbasiert<\/strong>: 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\u00e4hnt: <em>Aussehen<\/em> und <em>Ger\u00e4uschentwicklung<\/em>. Durch die Extraktion dieser Aspekte erhalten wir konkretere Informationen dar\u00fcber, was der Rezensentin oder dem Rezensenten gefallen bzw. nicht gefallen hat. Das Aussehen der Maschine wurde positiv bewertet, w\u00e4hrend die Ger\u00e4uschentwicklung negativ beurteilt wurde.<\/p>\n<h4 class=\"wp-block-heading\">Kopplung der Sentimentanalyse mit anderen NLP-Techniken<\/h4>\n<p><strong>Intentionbasiert<\/strong>: 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 \u00fcber einen Netzausfall erh\u00e4lt, k\u00f6nnte die Intention oder das Thema als <em>Zuverl\u00e4ssigkeit des Dienstes<\/em> und die Haltung als <em>negativ<\/em> 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.<\/p>\n<h3 class=\"wp-block-heading\">Anwendungen der Sentimentanalyse<\/h3>\n<p>Wahrscheinlich fallen Ihnen jetzt schon einige m\u00f6gliche Anwendungsf\u00e4lle f\u00fcr die Sentimentanalyse ein. Im Grunde kann sie \u00fcberall dort eingesetzt werden, wo man Textinhalte mit Feedback oder Meinungen zu einem Thema erhalten kann. Organisationen oder Einzelpersonen k\u00f6nnen die Sentimentanalyse nutzen, um die sozialen Medien zu beobachten und herauszufinden, wie die Menschen \u00fcber eine Marke, eine Beh\u00f6rde oder ein Thema denken.<\/p>\n<p>Die Kundenfeedback-Analyse kann verwendet werden, um die in R\u00fcckmeldungen oder Supportanfragen ge\u00e4u\u00dferten Haltungen zu ermitteln. Produktbewertungen k\u00f6nnen analysiert werden, um festzustellen, wie zufrieden oder unzufrieden die Menschen mit den Produkten eines Unternehmens sind. Und schlie\u00dflich kann die Sentimentanalyse ein zentrales Instrument der Marktforschung und der Wettbewerbsanalyse sein, denn in diesen Bereichen k\u00f6nnen die Meinungen der Menschen \u00fcber neue Trends, Funktionen und Konkurrenten die Strategien eines Unternehmens beeinflussen.<\/p>\n<h2 class=\"wp-block-heading\">Wie funktioniert die Sentimentanalyse?<\/h2>\n<p>Auf einer allgemeinen Ebene werden bei der Sentimentanalyse W\u00f6rter (oder, in komplexeren Modellen, der Gesamtton eines Textes) einer Emotion zugeordnet. Die gebr\u00e4uchlichsten Ans\u00e4tze zur Sentimentanalyse lassen sich einer der drei folgenden Methoden zuordnen.<\/p>\n<h3 class=\"wp-block-heading\">Lexikonbasierte Ans\u00e4tze<\/h3>\n<p>Diese Methoden verwenden ein Lexikon, das Sentimentwerte f\u00fcr eine Liste von W\u00f6rtern enth\u00e4lt. 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\u00dferdem den Vorteil, dass sie genauere Stimmungsbewertungen liefern. Die Lexika werden jedoch in Handarbeit erstellt, und dies kann zeitaufw\u00e4ndig und teuer sein.<\/p>\n<h3 class=\"wp-block-heading\">Machine-Learning-Modelle<\/h3>\n<p>Bei diesen Methoden wird ein maschinelles Lernmodell \u2013 meist ein naiver Bayes-Klassifikator \u2013 mit einer Datensammlung trainiert, die Texte \u2013 z.\u00a0B. Filmkritiken \u2013 und deren Sentimentkennzeichnungen enth\u00e4lt. 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\u00f6rtern im Eingabetext nicht ber\u00fccksichtigen, k\u00f6nnen sie bei komplexeren Texten, die Modifikatoren und Negationen enthalten, ins Straucheln kommen.<\/p>\n<h3 class=\"wp-block-heading\">Gro\u00dfe Sprachmodelle<\/h3>\n<p>Bei diesen Methoden wird ein vorab trainiertes transformationsbasiertes gro\u00dfes Sprachmodell mit denselben Datensammlungen optimiert, die f\u00fcr das Training der weiter oben erw\u00e4hnten Machine-Learning-Klassifizierungsmodelle verwendet werden. Diese ausgefeilten Modelle k\u00f6nnen komplexe Beziehungen zwischen den W\u00f6rtern eines Textes modellieren, sind aber in der Regel langsamer als die beiden anderen Methoden.<\/p>\n<h2 class=\"wp-block-heading\">Sentimentanalyse in Python<\/h2>\n<p><a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/python.html\" target=\"_blank\" rel=\"noopener\">Python<\/a> verf\u00fcgt \u00fcber ein reichhaltiges \u00d6kosystem von <a href=\"https:\/\/blog.jetbrains.com\/pycharm\/tag\/nlp\/\">NLP<\/a>-Paketen. Wenn Sie Sentimentanalysen in dieser Sprache durchf\u00fchren wollen, haben Sie also die Qual der Wahl.<\/p>\n<p>Sehen wir uns nun einige der g\u00e4ngigsten <a href=\"https:\/\/www.jetbrains.com\/guide\/python\/tutorials\/getting-started-pycharm\/installing-and-managing-python-packages\/\" target=\"_blank\" rel=\"noopener\">Python-Pakete<\/a> f\u00fcr die Sentimentanalyse an.<\/p>\n<h3 class=\"wp-block-heading\">Die besten Python-Bibliotheken f\u00fcr die Sentimentanalyse<\/h3>\n<h4 class=\"wp-block-heading\">VADER<\/h4>\n<p><a href=\"https:\/\/www.nltk.org\/api\/nltk.sentiment.vader.html\" target=\"_blank\" rel=\"noopener\">VADER (Valence Aware Dictionary and Sentiment Reasoner)<\/a> ist ein beliebter lexikonbasierter Sentiment-Analyzer. Dieser Analyzer ist im leistungsstarken <a href=\"https:\/\/www.nltk.org\/index.html\" target=\"_blank\" rel=\"noopener\">NLTK<\/a>-Paket enthalten und liefert vier Sentimentwertungen: <em>positiv<\/em>, <em>neutral<\/em> und <em>negativ<\/em> sowie einen <em>Gesamtscore<\/em>. Die Werte f\u00fcr 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.<\/p>\n<p>Sehen wir uns an einem einfachen Beispiel an, wie es funktioniert:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from nltk.sentiment.vader import SentimentIntensityAnalyzer\nimport nltk<\/pre>\n<p>Zun\u00e4chst m\u00fcssen wir das VADER-Lexikon herunterladen.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">nltk.download('vader_lexicon')<\/pre>\n<p>Anschlie\u00dfend k\u00f6nnen wir den <code>SentimentIntensityAnalyzer()<\/code> von VADER instanziieren und die Sentimentwerte mit der Methode <code>polarity_scores()<\/code> extrahieren.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">analyzer = SentimentIntensityAnalyzer()\n\nsentence = \"I love PyCharm! It's my favorite Python IDE.\"\nsentiment_scores = analyzer.polarity_scores(sentence)\nprint(sentiment_scores)<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">{'neg': 0.0, 'neu': 0.572, 'pos': 0.428, 'compound': 0.6696}<\/pre>\n<p>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.<\/p>\n<p>Die Funktionsweise von VADER besteht darin, die Sentimentwerte jedes Wortes im eigenen Lexikon nachzuschlagen und sie anhand von detaillierten Regeln zu kombinieren. Modifikatoren k\u00f6nnen zum Beispiel die Sentimentintensit\u00e4t eines Wortes erh\u00f6hen oder verringern. Ein Modifikator wie \u201eein bisschen\u201c vor einem Wort verringert die Sentimentintensit\u00e4t, w\u00e4hrend \u201eextrem\u201c sie verst\u00e4rkt.<\/p>\n<p>Das VADER-Lexikon enth\u00e4lt auch Abk\u00fcrzungen wie \u201esmh\u201c (Kopfsch\u00fctteln) sowie Emojis und eignet sich damit besonders gut f\u00fcr Texte in sozialen Medien. Die gr\u00f6\u00dfte Einschr\u00e4nkung von VADER ist, dass es nur mit Englisch funktioniert, aber als Alternative k\u00f6nnen Sie Projekte wie <a href=\"https:\/\/github.com\/brunneis\/vader-multi\" target=\"_blank\" rel=\"noopener\"><code>vader-multi<\/code><\/a> verwenden. Ich habe \u00fcber die <a href=\"https:\/\/t-redactyl.io\/blog\/2017\/04\/using-vader-to-handle-sentiment-analysis-with-social-media-text.html\" target=\"_blank\" rel=\"noopener\">Funktionsweise von VADER<\/a> bereits geschrieben, falls Sie an einem tieferen Einblick in dieses Paket interessiert sein sollten.<\/p>\n<h4 class=\"wp-block-heading\">NLTK<\/h4>\n<p>Mit NLTK k\u00f6nnen Sie auch Ihren eigenen ML-basierten Sentiment-Klassifikator trainieren, indem Sie Klassifikatoren aus <code>scikit-learn<\/code> verwenden.<\/p>\n<p>Es gibt viele M\u00f6glichkeiten zur Verarbeitung des Textes, der diesen Modellen zugef\u00fchrt wird. Am einfachsten ist es, anhand der im Text vorkommenden W\u00f6rter vorzugehen. Diese Art der Textmodellierung wird Bag-of-Words-Ansatz genannt. Die einfachste Art der Bag-of-Words-Modellierung ist die <em>bin\u00e4re Vektorisierung<\/em>. 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).<\/p>\n<p>Wenn Sie gerade erst beginnen, mit Textdaten und NLP zu arbeiten, und mehr dar\u00fcber erfahren m\u00f6chten, wie Textinhalte als Eingabedaten f\u00fcr ML-Modelle aufbereitet werden k\u00f6nnen, empfehle ich Ihnen meinen <a href=\"https:\/\/www.youtube.com\/live\/WYmyZBg2VFI?feature=shared&amp;t=261\" target=\"_blank\" rel=\"noopener\">Vortrag zu diesem Thema<\/a>, der eine einfache Einf\u00fchrung bietet.<\/p>\n<p>Ein Beispiel finden Sie in der <a href=\"https:\/\/www.nltk.org\/howto\/sentiment.html#sentiment-analysis\" target=\"_blank\" rel=\"noopener\">NLTK-Dokumentation<\/a>, 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\u00e4tzlicher Verneinungsmodifikator hinzugef\u00fcgt, basierend auf Regeln, die angeben, ob das jeweilige Wort oder Zeichen wahrscheinlich zur Verneinung einer an anderer Stelle im Text ausgedr\u00fcckten Haltung verwendet wird. Wenn Sie mehr \u00fcber dieses Thema erfahren m\u00f6chten, finden Sie bei Real Python zudem ein <a href=\"https:\/\/realpython.com\/python-nltk-sentiment-analysis\/#customizing-nltks-sentiment-analysis\" target=\"_blank\" rel=\"noopener\">Tutorial zur Sentimentanalyse<\/a>, das auf das Training eigener Klassifikatoren mit NLTK eingeht.<\/p>\n<h4 class=\"wp-block-heading\">Pattern und TextBlob<\/h4>\n<p>Das <a href=\"https:\/\/github.com\/clips\/pattern\" target=\"_blank\" rel=\"noopener\">Pattern<\/a>-Paket stellt einen weiteren lexikonbasierten Ansatz zur <a href=\"https:\/\/github.com\/clips\/pattern\/blob\/d25511f9ca7ed9356b801d8663b8b5168464e68f\/pattern\/text\/__init__.py#L2316\" target=\"_blank\" rel=\"noopener\">Sentimentanalyse<\/a> bereit. Es verwendet das Lexikon <a href=\"https:\/\/github.com\/aesuli\/SentiWordNet\" target=\"_blank\" rel=\"noopener\">SentiWordNet<\/a>, in dem jeder Synonymgruppe (<em>synset<\/em>) aus <a href=\"https:\/\/github.com\/clips\/pattern\" target=\"_blank\" rel=\"noopener\">WordNet<\/a> jeweils ein Wert f\u00fcr Positivit\u00e4t, Negativit\u00e4t und Objektivit\u00e4t zugeordnet ist. Die positiven und negativen Werte der einzelnen W\u00f6rter werden anhand bestimmter Regeln kombiniert, um einen finalen Polarit\u00e4tswert zu erhalten. Auf \u00e4hnliche Weise werden die Objektivit\u00e4tswerte der einzelnen W\u00f6rter kombiniert, um eine finale Subjektivit\u00e4tsbewertung zu erhalten.<\/p>\n<p>Da WordNet Wortart-Informationen enth\u00e4lt, k\u00f6nnen die Regeln ber\u00fccksichtigen, wenn Adjektive oder Adverbien, die einem Wort vorausgehen, dessen Sentiment modifizieren. Der Regelsatz ber\u00fccksichtigt auch Negationen, Ausrufezeichen und Emojis und enth\u00e4lt sogar einige Regeln f\u00fcr Idiome und Sarkasmus.<\/p>\n<p>Als eigenst\u00e4ndige Bibliothek ist Pattern jedoch nur mit Python 3.6 kompatibel. Daher wird Pattern meist \u00fcber <a href=\"https:\/\/textblob.readthedocs.io\/en\/dev\/\" target=\"_blank\" rel=\"noopener\">TextBlob<\/a> verwendet. Standardm\u00e4\u00dfig verwendet der <a href=\"https:\/\/github.com\/sloria\/TextBlob\/blob\/e19171014bfba910d1e33527f46d514837da234e\/src\/textblob\/en\/sentiments.py#L15\" target=\"_blank\" rel=\"noopener\">TextBlob-Analyzer<\/a> seine eigene Implementierung der Pattern-Bibliothek zur Generierung von Sentimentwertungen.<\/p>\n<p>Sehen wir uns das einmal in Aktion an:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from textblob import TextBlob<\/pre>\n<p>Wie Sie sehen, lassen wir die TextBlob-Methode auf unseren Text los und extrahieren dann den Sentimentwert aus dem Attribut <code>sentiment<\/code>.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">pattern_blob = TextBlob(\"I love PyCharm! It's my favorite Python IDE.\")\nsentiment = pattern_blob.sentiment\n\nprint(f\"Polarity: {sentiment.polarity}\")\nprint(f\"Subjectivity: {sentiment.subjectivity}\")<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Polarity: 0.625\nSubjectivity: 0.6<\/pre>\n<p>F\u00fcr unseren Beispielsatz gibt uns Pattern in TextBlob einen Polarit\u00e4tswert von 0,625 (relativ nahe am von VADER ermittelten Wert) sowie einen Subjektivit\u00e4tswert von 0,6 zur\u00fcck.<\/p>\n<p>Aber es gibt noch eine zweite M\u00f6glichkeit, in TextBlob Sentimentwerte zu erhalten. Dieses Paket enth\u00e4lt auch einen <a href=\"https:\/\/github.com\/sloria\/TextBlob\/blob\/e19171014bfba910d1e33527f46d514837da234e\/src\/textblob\/en\/sentiments.py#L53\" target=\"_blank\" rel=\"noopener\">vortrainierten naiven Bayes-Klassifikator<\/a>, der einen Text als positiv oder negativ einstuft und angibt, wie wahrscheinlich es ist, dass der Text positiv oder negativ ist.<\/p>\n<p>Um diese Methode zu verwenden, m\u00fcssen wir zun\u00e4chst das Modul <code>punkt<\/code> und die Datensammlung <code>movie-reviews<\/code> von NLTK herunterladen, die zum Trainieren dieses Modells verwendet wird.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import nltk\nnltk.download('movie_reviews')\nnltk.download('punkt')\n\nfrom textblob import TextBlob\nfrom textblob.sentiments import NaiveBayesAnalyzer<\/pre>\n<p>Erneut lassen wir <code>TextBlob<\/code> \u00fcber unseren Text laufen, dieses Mal jedoch mit dem Argument <code>analyzer=NaiveBayesAnalyzer()<\/code>. Dann extrahieren wir wie zuvor die Sentimentwerte aus dem sentiment-Attribut.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">nb_blob = TextBlob(\"I love PyCharm! It's my favorite Python IDE.\", analyzer=NaiveBayesAnalyzer())\nsentiment = nb_blob.sentiment\nprint(sentiment)<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Sentiment(classification='pos', p_pos=0.5851800554016624, p_neg=0.4148199445983381)<\/pre>\n<p>Diesmal erhalten wir die Kennzeichnung <code>pos<\/code> (positiv), wobei das Modell sch\u00e4tzt, dass der Text mit einer Wahrscheinlichkeit von 59% positiv und mit einer Wahrscheinlichkeit von 41% negativ ist.<\/p>\n<h4 class=\"wp-block-heading\">spaCy<\/h4>\n<p>Eine andere Option zur Durchf\u00fchrung von Sentimentanalysen ist <a href=\"https:\/\/spacy.io\/\" target=\"_blank\" rel=\"noopener\">spaCy<\/a>. spaCy ist ein weiteres g\u00e4ngiges NLP-Paket f\u00fcr Python, mit einer Vielzahl von Optionen f\u00fcr die Textverarbeitung.<\/p>\n<p>Die erste Methode besteht in der Verwendung des <a href=\"https:\/\/spacy.io\/universe\/project\/spacy-textblob\" target=\"_blank\" rel=\"noopener\">spacytextblob<\/a>-Plugins, um den Sentiment-Analyzer TextBlob innerhalb Ihrer spaCy-Pipeline zu verwenden. Als Vorbereitung m\u00fcssen wir <code>spacy<\/code> und <code>spacytextblob<\/code> installieren und das passende Sprachmodell herunterladen.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import spacy\nimport spacy.cli\nfrom spacytextblob.spacytextblob import SpacyTextBlob\n\nspacy.cli.download(\"en_core_web_sm\")<\/pre>\n<p>Anschlie\u00dfend laden wir dieses Sprachmodell und nehmen <code>spacytextblob<\/code> in unsere Textverarbeitungs-Pipeline auf. TextBlob l\u00e4sst sich \u00fcber die <code>pipe<\/code>-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\u00f6nnen.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">nlp = spacy.load('en_core_web_sm')\nnlp.add_pipe('spacytextblob')<\/pre>\n<p>Vorerst analysieren wir unseren Beispielsatz ohne Vorverarbeitung:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">doc = nlp(\"I love PyCharm! It's my favorite Python IDE.\")\n\nprint('Polarity: ', doc._.polarity)\nprint('Subjectivity: ', doc._.subjectivity)<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Polarity:  0.625\nSubjectivity:  0.6<\/pre>\n<p>Wir erhalten die gleichen Ergebnisse wie bei der Verwendung von TextBlob weiter oben.<\/p>\n<p>Eine zweite M\u00f6glichkeit, die Sentimentanalyse in SpaCy durchzuf\u00fchren, ist das Training eines eigenen Modells mit der <a href=\"https:\/\/spacy.io\/api\/textcategorizer\" target=\"_blank\" rel=\"noopener\">TextCategorizer<\/a>-Klasse. Damit k\u00f6nnen wir eine Reihe von in <a href=\"https:\/\/spacy.io\/api\/architectures\" target=\"_blank\" rel=\"noopener\">spaCY erstellten Modellen<\/a> mit einem Sentimentanalyse-Trainingssatz trainieren. Da auch hier die spaCy-Pipeline verwendet werden kann, haben Sie viele M\u00f6glichkeiten, Ihren Text vor dem Training Ihres Modells einer Vorverarbeitung zu unterziehen.<\/p>\n<p>Schlie\u00dflich k\u00f6nnen wir mit <a href=\"https:\/\/spacy.io\/api\/large-language-models#sentiment\" target=\"_blank\" rel=\"noopener\">spacy-llm<\/a> gro\u00dfe Sprachmodelle f\u00fcr die Sentimentanalyse verwenden. Damit k\u00f6nnen wir verschiedene propriet\u00e4re gro\u00dfe Sprachmodelle (LLMs) von OpenAI, Anthropic, Cohere oder Google zu einer Sentimentanalyse unserer Texte auffordern.<\/p>\n<p>Dieser Ansatz funktioniert etwas anders als die bisher besprochenen Methoden. Anstatt das Modell zu trainieren, verwenden wir allgemeine Modelle wie GPT-4 zur Sentimenteinsch\u00e4tzung eines Textes. Dabei haben wir die Wahl zwischen Zero-Shot-Learning (hier wird ein Prompt ohne Beispiele an das Modell \u00fcbermittelt) oder Little-Shot-Learning (bei dem ein Prompt und einige Beispiele an das Modell \u00fcbergeben werden).<\/p>\n<h4 class=\"wp-block-heading\">Transformers<\/h4>\n<p>Das letzte Sentimentanalyse-Paket f\u00fcr Python, das wir besprechen werden, ist <a href=\"https:\/\/huggingface.co\/docs\/transformers\/en\/index\" target=\"_blank\" rel=\"noopener\">Transformers<\/a> von <a href=\"https:\/\/huggingface.co\/\" target=\"_blank\" rel=\"noopener\">Hugging Face<\/a>.<\/p>\n<p>Hugging Face hostet (neben anderen Modellen, einschlie\u00dflich Computer Vision und Audiomodellen) alle wichtigen quelloffenen LLMs zur kostenlosen Verwendung und bietet eine Plattform f\u00fcr das Training, Deployment und Teilen dieser Modelle. Das Transformers-Paket bietet ein breites Spektrum von Funktionen (einschlie\u00dflich Sentimentanalyse) unter Verwendung der von Hugging Face gehosteten LLMs.<\/p>\n<h2 class=\"wp-block-heading\">Ergebnisse von Sentimentanalysen verstehen<\/h2>\n<p>Nachdem wir nun auf die verschiedenen M\u00f6glichkeiten zur Sentimentanalyse in Python eingegangen sind, fragen Sie sich vielleicht: \u201eWie kann ich das auf meine eigenen Daten anwenden?\u201c<\/p>\n<p>Um dies zu verstehen, werden wir PyCharm verwenden, um zwei Pakete \u2013 VADER und TextBlob \u2013 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.<\/p>\n<p>PyCharm Professional ist eine leistungsstarke Python-IDE f\u00fcr <a href=\"https:\/\/www.jetbrains.com\/de-de\/pycharm\/data-science\/\" target=\"_blank\" rel=\"noopener\">Data Science<\/a>, die umfassende <a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/auto-completing-code.html\" target=\"_blank\" rel=\"noopener\">Code-Completion<\/a>, Inspektionen und <a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/debugging-code.html\" target=\"_blank\" rel=\"noopener\">Debugging<\/a> f\u00fcr Python bietet, erg\u00e4nzt durch umfangreiche Unterst\u00fctzung f\u00fcr <a href=\"https:\/\/www.jetbrains.com\/pycharm\/integrations\/#databases\" target=\"_blank\" rel=\"noopener\">Datenbanken<\/a>, <a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/running-jupyter-notebook-cells.html\" target=\"_blank\" rel=\"noopener\">Jupyter<\/a>, <a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/using-git-integration.html\" target=\"_blank\" rel=\"noopener\">Git<\/a>, <a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/conda-support-creating-conda-virtual-environment.html\" target=\"_blank\" rel=\"noopener\">Conda<\/a> und mehr \u2013 alles im Standard-Installationsumfang. Dar\u00fcber hinaus erhalten Sie unglaublich n\u00fctzliche Funktionen wie <em>Spaltenstatistiken<\/em> und eine <em>Diagrammansicht<\/em> f\u00fcr DataFrames sowie <a href=\"https:\/\/www.jetbrains.com\/de-de\/pycharm\/integrations\/\" target=\"_blank\" rel=\"noopener\">Hugging-Face-Integrationen<\/a>, die das Arbeiten mit LLMs erheblich beschleunigen und vereinfachen. In diesem Blogartikel erkunden wir die erweiterten Funktionen von PyCharm f\u00fcr die Arbeit mit Dataframes, die uns einen schnellen \u00dcberblick dar\u00fcber verschaffen, welche Sentimentwerte die beiden Pakete liefern.<\/p>\n<p>Sollten Sie jetzt Ihr eigenes Sentiment-Analyseprojekt in Angriff nehmen wollen, k\u00f6nnen Sie ein kostenloses dreimonatiges Abonnement f\u00fcr PyCharm aktivieren. Klicken Sie auf den nachstehenden Link und geben Sie diesen Aktionscode ein: <strong>PCSA24<\/strong>. Sie erhalten dann einen Aktivierungscode per E-Mail.<\/p>\n<div class=\"buttons\">\n<div class=\"buttons__row\"><a class=\"btn\" href=\"https:\/\/www.jetbrains.com\/de-de\/store\/redeem\/\" target=\"\" rel=\"noopener\">3-Monats-Abonnement aktivieren<\/a><\/div>\n<\/div>\n<p>Als Erstes m\u00fcssen wir die Daten laden. Mit der Methode <code>load_dataset()<\/code> aus dem Datasets-Paket k\u00f6nnen wir diese <a href=\"https:\/\/huggingface.co\/datasets\/fancyzhx\/amazon_polarity\" target=\"_blank\" rel=\"noopener\">Daten aus dem Hugging Face Hub<\/a> herunterladen.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from datasets import load_dataset\namazon = load_dataset(\"fancyzhx\/amazon_polarity\")<\/pre>\n<p>Sie k\u00f6nnen den Mauszeiger auf den Namen der Datensammlung bewegen, um die Beschreibung der Hugging-Face-Datensammlung direkt in PyCharm zu sehen. So k\u00f6nnen Sie unkompliziert Informationen \u00fcber Hugging-Face-Assets abrufen, ohne die IDE zu verlassen.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-532334\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/11\/Screenshot-2024-11-29-at-16.59.07.png\" alt=\"\" width=\"2354\" height=\"1372\" \/><\/figure>\n<p>Hier ist der Inhalt dieser Datensammlung:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">amazon<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">DatasetDict({\n    train: Dataset({\n        features: ['label', 'title', 'content'],\n        num_rows: 3600000\n    })\n    test: Dataset({\n        features: ['label', 'title', 'content'],\n        num_rows: 400000\n    })\n})<\/pre>\n<p>Die Trainingsdatensammlung enth\u00e4lt 3,6 Millionen und die Testdatensammlung 400.000 Beobachtungen. In diesem Tutorial werden wir mit der Trainingsdatensammlung arbeiten.<\/p>\n<p>Wir verwenden nun den <code>SentimentIntensityAnalyzer<\/code> von VADER und die Methode TextBlob.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from nltk.sentiment.vader import SentimentIntensityAnalyzer\nimport nltk\n\nnltk.download(\"vader_lexicon\")\n\nanalyzer = SentimentIntensityAnalyzer()<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from textblob import TextBlob<\/pre>\n<p>Die Trainingsdatensammlung hat zu viele Beobachtungen, um sie \u00fcbersichtlich darzustellen. Daher nehmen wir eine Zufallsstichprobe von 1.000 Rezensionen, die die allgemeine Haltung der Rezensierenden repr\u00e4sentieren sollen.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from random import sample\nsample_reviews = sample(amazon[\"train\"][\"content\"], 1000)<\/pre>\n<p>Ermitteln wir nun die VADER- und TextBlob-Bewertungen f\u00fcr jede dieser Rezensionen. Wir durchlaufen alle Rezensionen in einer Schleife, lassen sie durch die Sentiment-Analyzer laufen und f\u00fcgen die Ergebnisse dann in eine spezielle Liste ein.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">vader_neg = []\nvader_neu = []\nvader_pos = []\nvader_compound = []\ntextblob_polarity = []\ntextblob_subjectivity = []\n\nfor review in sample_reviews:\n   vader_sent = analyzer.polarity_scores(review)\n   vader_neg += [vader_sent[\"neg\"]]\n   vader_neu += [vader_sent[\"neu\"]]\n   vader_pos += [vader_sent[\"pos\"]]\n   vader_compound += [vader_sent[\"compound\"]]\n  \n   textblob_sent = TextBlob(review).sentiment\n   textblob_polarity += [textblob_sent.polarity]\n   textblob_subjectivity += [textblob_sent.subjectivity]<\/pre>\n<p>Dann f\u00fcgen wir diese Listen in einen <a href=\"https:\/\/pandas.pydata.org\/\" target=\"_blank\" rel=\"noopener\">pandas<\/a>-DataFrame als separate Spalten ein:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import pandas as pd\n\nsent_scores = pd.DataFrame({\n   \"vader_neg\": vader_neg,\n   \"vader_neu\": vader_neu,\n   \"vader_pos\": vader_pos,\n   \"vader_compound\": vader_compound,\n   \"textblob_polarity\": textblob_polarity,\n   \"textblob_subjectivity\": textblob_subjectivity\n})<\/pre>\n<p>Jetzt k\u00f6nnen wir uns die Ergebnisse ansehen.<\/p>\n<p>An diesem Punkt machen wir uns in der Regel daran, umfangreichen Code f\u00fcr die explorative Datenanalyse zu programmieren. Dazu k\u00f6nnten wir die <code>describe<\/code>-Methode von pandas verwenden, um Statistiken \u00fcber unsere Spalten zu erhalten, und <a href=\"https:\/\/matplotlib.org\/\" target=\"_blank\" rel=\"noopener\">Matplotlib<\/a>&#8211; oder <a href=\"https:\/\/seaborn.pydata.org\/\" target=\"_blank\" rel=\"noopener\">seaborn<\/a>-Code schreiben, um unsere Ergebnisse zu visualisieren. PyCharm verf\u00fcgt jedoch \u00fcber einige Funktionen, die das Ganze beschleunigen.<\/p>\n<p>Geben wir nun unseren DataFrame mit einer print-Anweisung aus.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sent_scores<\/pre>\n<p>In der oberen rechten Ecke sehen wir eine Schaltfl\u00e4che mit der Bezeichnung <em>Show Column Statistics<\/em>. Wenn wir das anklicken, erhalten wir zwei unterschiedliche Optionen: <em>Compact<\/em> und <em>Detailed<\/em>. Wir entscheiden uns f\u00fcr <em>Detailed<\/em>.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-532356\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/11\/Screenshot-2024-11-29-at-17.10.32.png\" alt=\"\" width=\"898\" height=\"420\" \/><\/figure>\n<p>Jetzt k\u00f6nnen 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\u00e4hrend die TextBlob-Polarit\u00e4t einen Mittelwert von 0,2 (Median = 0,2) aufweist.<\/p>\n<p>Dies deutet darauf hin, dass VADER Rezensionen im Durchschnitt positiver bewertet als TextBlob. Au\u00dferdem ist zu erkennen, dass beide Analyzer wahrscheinlich mehr positive als negative Rezensionen gefunden haben \u2013 mit einigen Visualisierungen k\u00f6nnen wir das genauer untersuchen.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-532367\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/11\/Screenshot-2024-11-29-at-17.33.49.png\" alt=\"\" width=\"2816\" height=\"1534\" \/><\/figure>\n<p>Eine weitere Funktion von PyCharm, die wir nutzen k\u00f6nnen, ist die <em>Chart View<\/em> f\u00fcr DataFrames. Die Schaltfl\u00e4che f\u00fcr diese Funktion befindet sich in der oberen linken Ecke.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-532378\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/11\/Screenshot-2024-11-29-at-17.55.46.png\" alt=\"\" width=\"764\" height=\"454\" \/><\/figure>\n<\/div>\n<p>Durch Anklicken der Schaltfl\u00e4che wechseln wir zum Diagrammeditor. Hier k\u00f6nnen wir ganz ohne Code Visualisierungen aus unserem DataFrame erstellen.<\/p>\n<p>Beginnen wir mit dem VADER-Gesamtscore. Um dieses Diagramm zu erstellen, w\u00e4hlen Sie in der oberen rechten Ecke <em>Show Series Settings<\/em> aus.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-532389\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/11\/Screenshot-2024-11-29-at-17.57.11.png\" alt=\"\" width=\"634\" height=\"368\" \/><\/figure>\n<\/div>\n<p>Entfernen Sie die Standardwerte f\u00fcr <em>X Axis<\/em> und <em>Y Axis<\/em>. Ersetzen Sie den Wert f\u00fcr <em>X Axis<\/em> und <em>Y Axis<\/em> durch <code>vader_compound<\/code>. Klicken Sie auf den Pfeil neben dem Variablennamen im Feld <em>Y Axis<\/em> und w\u00e4hlen Sie <code>count<\/code>.<\/p>\n<p>W\u00e4hlen Sie schlie\u00dflich unter den Diagrammsymbolen direkt unterhalb von <em>Series Settings<\/em> die Option <em>Histogram<\/em> aus. Wir haben wahrscheinlich eine bimodale Verteilung f\u00fcr den VADER-Gesamtscore, mit einem leichten H\u00f6hepunkt bei ca. -0,8 und einer viel ausgepr\u00e4gteren H\u00f6hepunkt bei 0,9. Diese H\u00f6hepunkte sind wahrscheinlich auf die Zweiteilung in negative und positive Rezensionen zur\u00fcckzuf\u00fchren. Au\u00dferdem gibt es weit mehr positive als negative Rezensionen.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-532401\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/12\/Screenshot-2024-12-02-at-09.26.23.png\" alt=\"\" width=\"2856\" height=\"1534\" \/><\/figure>\n<p>Wir wiederholen die gleiche \u00dcbung und erstellen nur ein Histogramm, das die Verteilung der TextBlob-Polarit\u00e4ten visualisiert.<\/p>\n<p>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.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-532412\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/12\/Screenshot-2024-12-02-at-09.32.45.png\" alt=\"\" width=\"2850\" height=\"1528\" \/><\/figure>\n<p>Wir rufen den Index der ersten Rezension ab, die VADER als positiv und TextBlob als neutral bewertet hat:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sent_scores[(sent_scores[\"vader_compound\"] &gt;= 0.8) &amp; (sent_scores[\"textblob_polarity\"].between(-0.1, 0.1))].index[0]<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">42<\/pre>\n<p>Dann lassen wir uns den Index der ersten Rezension geben, die VADER als negativ und TextBlob als neutral bewertet hat:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sent_scores[(sent_scores[\"vader_compound\"] &lt;= -0.8) &amp; (sent_scores[\"textblob_polarity\"].between(-0.1, 0.1))].index[0]<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">0<\/pre>\n<p>Sehen wir uns zun\u00e4chst die positive Rezension an:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sample_reviews[42]<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\"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.\"<\/pre>\n<p>Diese Rezension erscheint gemischt, ist aber insgesamt leicht positiv.<\/p>\n<p>Sehen wir uns nun die negative Rezension an:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sample_reviews[0]<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">'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.'<\/pre>\n<p>Diese Rezension ist eindeutig negativ. Im Vergleich scheint VADER richtiger zu liegen, aber es neigt bei der Textanalyse zur \u00dcberbewertung von positiven Begriffen.<\/p>\n<p>Als letzten Aspekt k\u00f6nnen wir uns ansehen, wie subjektiv oder objektiv die einzelnen Rezensionen sind. Dazu erstellen wir ein Histogramm der TextBlob-Subjektivit\u00e4tswerte.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-532423\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/12\/Screenshot-2024-12-02-at-09.36.19.png\" alt=\"\" width=\"2848\" height=\"1524\" \/><\/figure>\n<p>Interessanterweise ist die Subjektivit\u00e4t 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).<\/p>\n<p>Zusammengenommen geben uns diese Werte gute M\u00f6glichkeiten zum Aufschl\u00fcsseln der Daten. Wenn wir die objektiven Aspekte erfahren m\u00f6chten, die den Leuten an den Produkten gefallen oder nicht gefallen haben, k\u00f6nnten wir uns die Rezensionen mit einem niedrigen Subjektivit\u00e4tswert und einem VADER-Gesamtscore in der N\u00e4he von 1 bzw. -1 ansehen.<\/p>\n<p>Wenn wir dagegen wissen m\u00f6chten, wie die Menschen emotional auf die Produkte reagieren, k\u00f6nnten wir uns die Rezensionen mit einem hohen Subjektivit\u00e4tswert und einem hohen oder niedrigen VADER-Gesamtscore vornehmen.<\/p>\n<h2 class=\"wp-block-heading\">Folgendes ist zu beachten<\/h2>\n<p>Wie bei jedem Problem der linguistischen Datenverarbeitung sind auch bei der Sentimentanalyse verschiedene Punkte zu beachten.<\/p>\n<p>Eine der wichtigsten \u00dcberlegungen 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\u00fctzt werden, m\u00fcssen Sie m\u00f6glicherweise einen anderen Ansatz w\u00e4hlen, z.\u00a0B. ein bestehendes LLM optimieren oder Ihre eigenen Modelle trainieren.<\/p>\n<p>Au\u00dferdem k\u00f6nnen bei zunehmender Textkomplexit\u00e4t auch lexikonbasierte Analyzer und Bag-of-Words-basierte Modelle bei der Sentimenterkennung auf Schwierigkeiten sto\u00dfen. Sarkasmus oder subtilere Kontextindikatoren k\u00f6nnen 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\u00f6nnen m\u00f6glicherweise auch mit komplexeren Texten umgehen, aber dazu m\u00fcssen Sie mit unterschiedlichen Modellen experimentieren.<\/p>\n<p>Und schlie\u00dflich treten bei der Sentimentanalyse die gleichen Probleme wie bei jeder anderen Machine-Learning-Aufgabe auf. Ihre Modelle k\u00f6nnen nur so gut sein wie die Trainingsdaten, die Sie verwenden. Wenn Sie nicht an qualitativ hochwertige, f\u00fcr Ihren Problembereich geeignete Trainings- und Testdatensammlungen herankommen, wird es Ihnen nicht gelingen, die Haltung Ihrer Zielgruppe korrekt einzusch\u00e4tzen.<\/p>\n<p>Au\u00dferdem sollten Ihre Ziele auf Ihr Gesch\u00e4ftsproblem abgestimmt sein. Es mag attraktiv erscheinen, ein Modell zu erstellen, um zu erfahren, ob Ihre Produkte in Ihrer Kundschaft \u201eTrauer\u201c, \u201eWut\u201c oder \u201eAbscheu\u201c ausl\u00f6sen. Wenn Ihnen das jedoch nicht hilft, Entscheidungen dar\u00fcber zu treffen, wie Sie Ihre Produkte verbessern k\u00f6nnen, dann ist das keine L\u00f6sung f\u00fcr Ihr Problem.<\/p>\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n<p>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\u00e4nglicher macht.<\/p>\n<p>Wir sind auf die m\u00f6glichen Anwendungen der Sentimentanalyse, unterschiedliche M\u00f6glichkeiten zur Sentimentbewertung und die wichtigsten Methoden zur Extraktion der in einem Text ausgedr\u00fcckten Haltung eingegangen. Wir haben auch einige hilfreiche Funktionen in PyCharm kennengelernt, die das Arbeiten mit Modellen und die Interpretation der Ergebnisse vereinfachen und beschleunigen.<\/p>\n<p>Auch wenn im Bereich der linguistischen Datenverarbeitung derzeit gro\u00dfe Sprachmodelle im Fokus stehen, haben die \u00e4lteren 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\u00e4rken bei der Analyse einfacherer Texte oder wenn Geschwindigkeit, Vorhersagen oder eine einfache Bereitstellung im Vordergrund stehen. LLMs eignen sich insbesondere f\u00fcr komplexere oder nuanciertere Texte.<\/p>\n<p>Jetzt, da Sie mit den Grundlagen vertraut sind, k\u00f6nnen Sie in unserem Tutorial lernen, wie Sie <a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2024\/12\/how-to-do-sentiment-analysis-with-large-language-models\/\" data-type=\"link\" data-id=\"https:\/\/blog.jetbrains.com\/pycharm\/2024\/12\/how-to-do-sentiment-analysis-with-large-language-models\/\">mit LLMs Sentimentanalysen durchf\u00fchren<\/a> k\u00f6nnen. Unsere Schritt-f\u00fcr-Schritt-Anleitung zeigt Ihnen, wie Sie das richtige Modell f\u00fcr Ihr Problem ausw\u00e4hlen, wie Sie es f\u00fcr die Sentimentanalyse verwenden und sogar selbst Optimierungen am Modell vornehmen k\u00f6nnen.<\/p>\n<p>Wenn Sie nach diesem Blogartikel noch mehr \u00fcber linguistische Datenverarbeitung oder maschinelles Lernen erfahren m\u00f6chten, finden Sie hier einige Ressourcen:<\/p>\n<ul>\n<li><a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2024\/12\/how-to-do-sentiment-analysis-with-large-language-models\/\" data-type=\"link\" data-id=\"https:\/\/blog.jetbrains.com\/pycharm\/2024\/12\/how-to-do-sentiment-analysis-with-large-language-models\/\">Einf\u00fchrung in die Sentimentanalyse mit gro\u00dfen Sprachmodellen<\/a><\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2022\/06\/start-studying-machine-learning-with-pycharm\/\">Einstieg in das maschinelle Lernen mit PyCharm<\/a><\/li>\n<li><a href=\"https:\/\/lp.jetbrains.com\/research\/ml_methods\/\" target=\"_blank\" rel=\"noopener\" data-type=\"link\" data-id=\"https:\/\/lp.jetbrains.com\/research\/ml_methods\/\">Maschinelle Lernmethoden in der Softwareentwicklung<\/a><\/li>\n<\/ul>\n<h2 class=\"wp-block-heading\">Steigen Sie mit PyCharm direkt in die Sentimentanalyse ein<\/h2>\n<p>Sollten Sie jetzt Ihr eigenes Sentiment-Analyseprojekt in Angriff nehmen wollen, k\u00f6nnen Sie ein kostenloses dreimonatiges Abonnement f\u00fcr PyCharm aktivieren. Klicken Sie auf den nachstehenden Link und geben Sie diesen Aktionscode ein: <strong>PCSA24<\/strong>. Sie erhalten dann einen Aktivierungscode per E-Mail.<\/p>\n<div class=\"buttons\">\n<div class=\"buttons__row\"><a class=\"btn\" href=\"https:\/\/www.jetbrains.com\/de-de\/store\/redeem\/\" target=\"\" rel=\"noopener\">3-Monats-Abonnement aktivieren<\/a><\/div>\n<\/div>\n<p>\u00a0<\/p>\n<p><strong>Autorin des urspr\u00fcnglichen Blogposts<\/strong><\/p>\n\n    <div class=\"about-author \">\n        <div class=\"about-author__box\">\n            <div class=\"row\">\n                <div class=\"about-author__box-img\">\n                    <img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/11\/BK7A9876_korr_sRGB_8_1000x1500px_square_resized-200x200.jpg\" width=\"200\" height=\"200\" alt=\"Jodie Burchell\" loading=\"lazy\"  class=\"avatar avatar-200 wp-user-avatar wp-user-avatar-200 photo avatar-default\">\n                <\/div>\n                <div class=\"about-author__box-text\">\n                                            <h4>Jodie Burchell<\/h4>\n                                        <p>Dr. Jodie Burchell is the Developer Advocate in Data Science at JetBrains, and was previously a Lead Data Scientist at Verve Group Europe. She completed a PhD in clinical psychology and a postdoc in biostatistics, before leaving academia for a data science career. She has worked for 7 years as a data scientist in both Australia and Germany, developing a range of products including recommendation systems, analysis platforms, search engine improvements and audience profiling. She has held a broad range of responsibilities in her career, doing everything from data analytics to maintaining machine learning solutions in production. She is a long time content creator in data science, across conference and user group presentations, books, webinars, and posts on both her own and JetBrain&#8217;s blogs.<\/p>\n                <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n","protected":false},"author":811,"featured_media":572215,"comment_status":"closed","ping_status":"closed","template":"","categories":[952],"tags":[8557,3252,5377,8652],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/pycharm\/572210"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/pycharm"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/types\/pycharm"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/users\/811"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/comments?post=572210"}],"version-history":[{"count":5,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/pycharm\/572210\/revisions"}],"predecessor-version":[{"id":572239,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/pycharm\/572210\/revisions\/572239"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/media\/572215"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/media?parent=572210"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/categories?post=572210"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/tags?post=572210"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/cross-post-tag?post=572210"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}