0 Daumen
610 Aufrufe

Ich habe einen Dataframe, der täglich Neuigkeiten enthält. Ich versuche, die Intensität des Tagesgefühls zu analysieren : wenn das allgemeine Gefühl des Tages aus den Nachrichten positiv, negativ oder neutral ist. Hier ist der Datenrahmen df_news :

    Date    name

0  2017-10-20  Gucci debuts art installation at its Ginza sto...
1  2018-08-01  Gucci Joins Paris Fashion Week for Its Spring ...
2  2018-04-20  Gucci launches its new creative hub Gucci ArtL...
3  2017-10-20  Gucci to launch homeware line Gucci Decor - CP...
4  2017-12-07  GUCCI opens new store at Miami Design District...
5  2018-01-12  Gucci opens Gucci Garden in Florence - LUXUO
6  2018-02-26  GUCCI's wild experiment with the Fall Winter 2...
7  2018-08-09  Gucci Revamped London Flagship Store | The Imp...
8  2018-08-01  Alessandro Michele Announces new Gucci Home co...
9  2017-10-20  Before He Picks Up the CFDA’s International Aw...

Mit dem folgenden Code, den er verwendet, versuchte er, die Intensität des Gefühls zu erfassen SentimentIntensityAnalyzer von nltk.sentiment.vader :

from nltk.sentiment.vader import SentimentIntensityAnalyzer

import unicodedata
sid = SentimentIntensityAnalyzer()
for date, row in df_news.T.iteritems():
    try:
        sentence = unicodedata.normalize('NFKD', df_news.loc[date, 'name']).encode('ascii','ignore')
        #print((sentence))
        ss = sid.polarity_scores(str(sentence))
        df_news.set_value(date, 'compound', ss['compound'])
        df_news.set_value(date, 'neg', ss['neg'])
        df_news.set_value(date, 'neu', ss['neu'])
        df_news.set_value(date, 'pos', ss['pos'])
    except TypeError:
        print(df_news.loc[date, 'name'])
        print(date)



Jedoch bekomme ich für bestimmte Datumsangaben einen TypeError. Dank dem Try-Catch berücksichtigt er dies nicht und zieht mir folgende Tabelle:

    name    compound    neg neu pos

Date                    
2017-10-20  Gucci debuts art installation at its Ginza sto...             
2018-08-01  Gucci Joins Paris Fashion Week for Its Spring ...             
2018-04-20  Gucci launches its new creative hub Gucci ArtL...  0.4404  0  0.756  0.244
2017-10-20  Gucci to launch homeware line Gucci Decor - CP...             
2017-12-07  GUCCI opens new store at Miami Design District...  0  0  1  0
2018-01-12  Gucci opens Gucci Garden in Florence - LUXUO    0  0  1  0
2018-02-26  GUCCI's wild experiment with the Fall Winter 2...  0  0  1  0
2018-08-09  Gucci Revamped London Flagship Store | The Imp...  0.3182  0  0.602  0.398
2018-08-01  Alessandro Michele Announces new Gucci Home co...             
2017-10-20  Before He Picks Up the CFDA’s International Aw...

Ich eliminiere try catch, um zu verstehen, warum es fehlgeschlagen ist. Ich erhalte folgende Fehlermeldung:

    ---------------------------------------------------------------------------
    TypeError                                Traceback (most recent call last)
    <ipython-input-26-2e9dbfc62bce> in <module>
          4 for date, row in df_news.T.iteritems():
          5 #    try:
    ----> 6    sentence = unicodedata.normalize('NFKD', df_news.loc[date, 'name']).encode('ascii','ignore')
          7    #print((sentence))
          8    ss = sid.polarity_scores(str(sentence))
   
    TypeError: normalize() argument 2 must be str, not Series

Dann dachte ich, dass das Problem mit den Zeilen war, die keine Strin waren. Aber zum Beispiel beim ersten :

    >>>type(df_news['name'][0])
    str

Avatar von

1 Antwort

0 Daumen

Antwort mit KI erzeugt

Fehlerursache verstehen

Das Hauptproblem in Ihrem Code liegt in der Art und Weise, wie Sie den Dataframe iterieren und auf Elemente zugreifen. Der Fehler TypeError: normalize() argument 2 must be str, not Series deutet darauf hin, dass die normalize Funktion einen String als zweites Argument erwartet, aber stattdessen eine pandas Series erhält.

Wenn Sie df_news.T.iteritems() verwenden, bekommen Sie das Transponierte des Dataframes, was bedeutet, dass Ihre Iterationsvariable date eigentlich die Spaltennamen (also 'Date' und 'name') und row die jeweiligen Werte in jeder Zeile sind.

Das Problem tritt auf, weil df_news.loc[date, 'name'] versucht, auf eine Zeile mit dem Index date (welcher tatsächlich ein Spaltenname ist) und die Spalte name zuzugreifen. Da date nicht als Index in Ihrem DataFrame existiert, gibt df_news.loc[date, 'name'] eine Series zurück statt eines einzelnen Wertes. Das führt dazu, dass normalize den Fehler wirft, da es erwartet, einen String zu erhalten, nicht eine Series.

Lösung

Um das Problem zu beheben, sollten Sie den Dataframe direkt iterieren, ohne ihn zu transponieren. Sie können iterrows() verwenden, um durch die Zeilen des Dataframes zu iterieren:

python
from nltk.sentiment.vader import SentimentIntensityAnalyzer
import pandas as pd
import unicodedata

# Annahme, dass df_news ein vordefinierter DataFrame mit Ihren Daten ist

sid = SentimentIntensityAnalyzer()

# Hinzufügen neuer Spalten für Sentiment Scores
df_news['compound'] = None
df_news['neg'] = None
df_news['neu'] = None
df_news['pos'] = None

for index, row in df_news.iterrows():
    try:
        sentence = unicodedata.normalize('NFKD', row['name']).encode('ascii','ignore')
        # Umwandlung byte zu str
        sentence = sentence.decode('utf-8')
        ss = sid.polarity_scores(sentence)
        df_news.at[index, 'compound'] = ss['compound']
        df_news.at[index, 'neg'] = ss['neg']
        df_news.at[index, 'neu'] = ss['neu']
        df_news.at[index, 'pos'] = ss['pos']
    except TypeError as e:
        print(row['name'])
        print(index)
        print(str(e))

# Überprüfung der Ergebnisse
print(df_news.head())


Beachten Sie die Verwendung von df_news.at[index, 'compound'] zum Setzen der Werte. set_value ist seit pandas 0.21.0 veraltet und sollte vermieden werden.

Zusätzlich wurde die Byte-Ausgabe von encode mit decode('utf-8') in einen String umgewandelt, weil polarity_scores einen String erwartet. Dies behebt das Formatproblem, sodass der Sentiment Analyzer korrekt mit den String-Werten arbeiten kann.
Avatar von 4,6 k

Ein anderes Problem?

Stell deine Frage

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community