Regelbasierte Sentimentanalyse in Python für Data Scientists

Inhalt

Dieser Artikel wurde im Rahmen der Data Science Blogathon

50131Abdeckung-5049842
Das Bild des Autors wurde online auf befunky.com aufgenommen

Nach Meinung von Experten, das 80% der weltweiten Daten liegen in Form von unstrukturierten Daten vor (Bilder, Videos, Text, etc.). Diese Daten könnten durch Tweets generiert werden / Social-Media-Beiträge, Anrufprotokolle, Umfrage- oder Interviewbewertungen, Textnachrichten in Blogs, Foren, Nachrichten, etc.

Es ist menschlich unmöglich, den ganzen Text im Web zu lesen und Muster zu finden. Aber trotzdem, Es ist definitiv erforderlich, dass das Unternehmen diese Daten analysiert, um bessere Maßnahmen zu ergreifen.

Einer dieser Prozesse zur Gewinnung von Wissen aus Textdaten ist die Sentimentanalyse. Um die Daten für die Stimmungsanalyse zu erhalten, man kann Inhalte von Webseiten mit verschiedenen Web-Scraping-Techniken direkt abkratzen.

Wenn Sie neu im Web-Scraping sind, Zögern Sie nicht, meinen Artikel zu konsultieren „Web-Scraping mit Python: SchöneSuppe“.

Was ist Sentimentanalyse?

Stimmungsanalyse (auch bekannt als Opinion Mining oder Emotion AI) ist ein Teilbereich des NLP, der die Meinungsneigung der Menschen misst (positiv / Negativ / neutral) in unstrukturiertem Text.

Die Stimmungsanalyse kann mit zwei Ansätzen durchgeführt werden: regelbasiert, basierend auf maschinellem Lernen.

Einige Anwendungen der Stimmungsanalyse

  • Marktanalyse
  • Social-Media-Monitoring
  • Analyse von Kundenfeedback: Analyse der Markenmeinung oder Reputation
  • Marktforschung

Was ist natürliche Sprachverarbeitung? (PNL)?

Natürliche Sprache ist unser Weg, die Menschen, wir kommunizieren miteinander. Es kann Stimme oder Text sein. NLP ist die automatische Manipulation natürlicher Sprache durch Software. NLP ist ein Begriff auf höherer Ebene und ist die Kombination von Natürliches Sprachverständnis (NLU) Ja Natürliche Sprachgenerierung (NLG).

PNL = NLU + NLG

Einige von Pythons Bibliotheken zur Verarbeitung natürlicher Sprache (NLP) Sohn:

  • Toolkit für natürliche Sprache (NLTK)
  • TextBlob
  • PLATZ
  • Gensim
  • CoreNLP

Ich hoffe, wir haben ein grundlegendes Verständnis der Begriffe Stimmungsanalyse, PNL.

Dieser Artikel konzentriert sich auf den regelbasierten Ansatz der Sentiment-Analyse..

Regelbasierter Ansatz

Dies ist ein praktischer Ansatz zur Textanalyse ohne Schulung oder mit maschinellen Lernmodellen. Das Ergebnis dieses Ansatzes ist ein Regelwerk, auf dessen Grundlage Text als positiv gekennzeichnet wird. / Negativ / neutral. Diese Regeln werden auch als Lexika bezeichnet. Deswegen, der regelbasierte Ansatz wird als lexikalischer Ansatz bezeichnet.

Die weit verbreiteten lexikalischen Ansätze sind TextBlob, VADER, SentiWordNet.

Schritte zur Datenvorverarbeitung:

  1. Text aufräumen
  2. Tokenización
  3. Anreicherung: POS-Kennzeichnung
  4. Entfernen von Rauschwörtern
  5. Holen Sie sich die Wurzelwörter

Bevor Sie sich mit den obigen Schritten befassen, Lassen Sie mich die Textdaten aus einer TXT-Datei importieren.

Importieren Sie eine Textdatei mit Pandas lesen CSV Funktion

# Pandas-Bibliothek installieren und importieren
Pandas als pd importieren
# Erstellen eines Pandas-Datenrahmens aus der Datei reviews.txt
data = pd.read_csv('reviews.txt', sep='t')
daten.kopf()
48089Datensatz-1090908

Das sieht nicht gut aus. Dann, jetzt veröffentlichen wir die „Namenlos: 0 " Spalte mit der df.drop Funktion.

mydata = data.drop('Unnamed': 0', Achse=1)
mydata.head()
20134mydata-2063250

Unser Datensatz hat insgesamt 240 Beobachtungen (Bewertungen).

Paso 1: Bereinige den Text

In diesem Schritt, wir müssen die Sonderzeichen entfernen, Textnummern. Wir können die nutzen Operationen mit regulären Ausdrücken Python-Bibliothek.

# Definieren Sie eine Funktion zum Bereinigen des Textes
auf jeden Fall sauber(Text):
# Entfernt alle Sonderzeichen und Zahlen, die die Alphabete verlassen
    text = re.sub('[^ A-Za-z]+', 'Review', Text)
    Rückgabetext

# Bereinigen des Textes in der Rezensionsspalte
meine Daten['Cleaned Reviews'] = meine Daten['bewertung'].anwenden(sauber)
mydata.head()

Erläuterung: "Clean" ist die Funktion, die Text als Eingabe akzeptiert und ohne Satzzeichen oder Zahlen zurückgibt. Lo aplicamos a la columna ‚Revision‘ y creamos una nueva columnaRevisiones limpias‘ mit sauberem Text.

50038gereinigt-3997448

Genial, schau dir das bild oben an, alle Sonderzeichen und Zahlen werden entfernt.

Paso 2: Tokenización

Tokenisierung ist der Prozess, bei dem Text in kleinere Teile, sogenannte Tokens, unterteilt wird. Kann auf Satzebene erfolgen (Satztokenisierung) oder per Wort (Wort-Tokenisierung).

Ich werde die Tokenisierung auf Wortebene mit durchführen Tokenizar nltk word_tokenize-Funktion ().

Notiz: Da unsere Textdaten etwas groß sind, Ich werde die Schritte zuerst illustrieren 2-5 mit kleinen Beispielsätzen.

Sag, wir haben ein Gebet „Dies ist ein Artikel zur Sentimentanalyse.“. Kann in kleine Stücke geteilt werden (Aufzeichnungen) wie im Folgenden gezeigt.

36212Tokenisierung-1723070

Paso 3: Anreicherung: POS-Etikettierung

Beschriften von Wortarten (POS) ist ein Prozess der Umwandlung jedes Tokens in ein Tupel mit der Form (Wort, Etikett). POS-Tagging ist wichtig, um den Kontext des Wortes zu bewahren und ist für die Wortstammerkennung wichtig.

Dies kann mit nltk . erreicht werden pos_tag Funktion.

Unten sind die POS-Tags des Beispielsatzes „Dies ist ein Artikel über Meinungsanalyse“.

69315pos-6811672

Siehe die Liste der möglichen Pos de Labels. hier.

Paso 4: Entfernen von Rauschwörtern

Englische Stoppwörter sind Wörter, die sehr wenig nützliche Informationen enthalten. Wir müssen sie im Rahmen der Textvorverarbeitung entfernen. nltk hat eine Stoppwortliste für jede Sprache.

Siehe englische Stoppwörter.

74081Stoppwörter-6310789

Beispiel für die Entfernung von Stoppwörtern:

82407Stoppwörter20Entfernung-5989652

Die leeren Worte Dies, ist, ein, on se eliminan y la oración de salida esAnálisis de opinión del artículo‘.

Paso 5: Holen Sie sich die Wurzelwörter

Eine Wurzel ist ein Teil eines Wortes, das für seine lexikalische Bedeutung verantwortlich ist. Die zwei beliebten Techniken, um die Wurzelwörter zu erhalten / root sind Stemming und Lemmatization.

Der Hauptunterschied besteht darin, dass Stemming oft einige unsinnige Wurzelwörter enthält, da es am Ende nur einige Zeichen schneidet. Stammen bietet sinnvolle Wurzeln, aber trotzdem, erfordert POS-Tags der Wörter.

Beispiel zur Veranschaulichung des Unterschieds zwischen Stemming und Lematization: Klicken Sie hier, um den Code zu erhalten

86878stemvslemma-1806383

Wenn wir uns das vorherige Beispiel ansehen, Die Ausgabe von Stemming ist Stem und die Ausgabe von Lemmatizatin ist Lemma.

Bei dem Wort schau, Der Stamm Blick Hat keinen Sinn. Bedenkt, dass, das Motto aussehen es ist perfekt.

Jetzt haben wir die Schritte verstanden 2-5 einfache Beispiele nehmen. Ohne weitere Verzögerung, Kommen wir zurück zu unserem eigentlichen Problem.

Code für Schritte 2 ein 4: tokenización, POS-Etikettierung, Entfernen von Rauschwörtern

nltk importieren
nltk.download('punkt')
aus nltk.tokenize import word_tokenize
aus nltk importieren pos_tag
nltk.download('Stoppwörter')
aus nltk.corpus importieren Stoppwörter
nltk.download('wordnet')
von nltk.corpus import wordnet

# POS-Tagger-Wörterbuch
pos_dict = {'J':wordnet.ADJ, 'V':wordnet.VERB, 'N':wordnet.NOUN, 'R':wordnet.ADV}
def token_stop_pos(Text):
    tags = pos_tag(word_tokenize(Text))
    neue Liste = []
    für Wort, Tag in Tags:
        wenn word.lower() nicht im Set(Stoppwörter.Wörter('english')):
        neueliste.anhängen(Tupel([Wort, pos_dict.get(Schild[0])]))
    Neue Liste zurückgeben

meine Daten['POS tagged'] = meine Daten['Cleaned Reviews'].anwenden(token_stop_pos)
mydata.head()

Erläuterung: token_stop_pos ist die Funktion, die den Text nimmt und die Tokenisierung durchführt, Entfernen Sie Stoppwörter und markieren Sie die Wörter in Ihrem POS. Lo aplicamos a la columnaReseñas limpiasy creamos una nueva columna para los datos dePOS etiquetados‘.

Wie bereits erwähnt, um das genaue Motto zu bekommen, WordNetLemmatizer requiere etiquetas POS en forma de ‚n‘, ‚ein‘, etc. Pero las etiquetas POS obtenidas de pos_tag tienen la forma ‚NN‘, ‚ANPASSEN‘, etc.

So weisen Sie Wordnet-Tags pos_tag zu, wir erstellen ein pos_dict-Wörterbuch. Jedes pos_tag, das mit J beginnt, wird auf wordnet.ADJ . abgebildet, Jedes pos_tag, das mit R beginnt, wird auf wordnet.ADV abgebildet, usw.

Unsere Interessen-Tags sind Nomen, Adjektiv, Adverb, Verb. Alles von diesen vier wird None zugewiesen.

686262-4-5372365

Im Abbildung anterior, podemos observar que cada palabra de la columna ‚Etikettieren von POS‘ Karten zu Ihrem POS von pos_dict.

Code für Schritt 5: Holen Sie sich die Wurzelwörter – Lematización

aus nltk.stem importieren WordNetLemmatizer
wordnet_lemmatizer = WordNetLemmatizer()
def lemmatisieren(pos_daten):
    lemma_rew = " "
    für Wort, pos in pos_data:
    wenn nicht pos:
        Lemma = Wort
        lemma_rew = lemma_rew + " " + Lemma
    anders:
        lemma = wordnet_lemmatizer.lemmatize(Wort, pos = pos)
        lemma_rew = lemma_rew + " " + Lemma
    zurück lemma_rew

meine Daten['Lemma'] = meine Daten['POS tagged'].anwenden(lemmatisieren)
mydata.head()

Erläuterung: lemmatize ist eine Funktion, die pos_tag-Tupel nimmt und das Lemma für jedes angibt Wort in pos_tag basierend auf dem Pos dieses Wortes. Lo aplicamos a la columna ‚Etikettieren von POS‘ y creamos una columnaLema‘ um die Ausgabe zu speichern.

993625-1353868

Jawohl, nach einer langen Reise, wir sind mit der Vorverarbeitung des Textes fertig.

Jetzt, tómese un minuto para mirar las columnas ‚Revision‘, ‚Lema‘ und beobachte, wie der Text verarbeitet wird.

94682vorverarbeitet-3532175

Wenn wir mit der Datenvorverarbeitung fertig sind, unsere endgültigen Daten sehen sauber aus. Machen Sie eine kurze Pause und kommen Sie zurück, um die eigentliche Aufgabe fortzusetzen.

Stimmungsanalyse mit TextBlob:

TextBlob ist eine Python-Bibliothek zur Verarbeitung von Textdaten. Bietet eine konsistente API, um in gängige Aufgaben der Verarbeitung natürlicher Sprache einzutauchen (NLP), wie das Markieren von Wortarten, Extraktion von Nominalphrasen, Stimmungsanalyse und mehr.

Die beiden zur Analyse der Stimmung verwendeten Messgrößen sind:

  • Polarität: spricht darüber, wie positiv oder negativ die Meinung ist.
  • Subjektivität: Sprechen Sie darüber, wie subjektiv die Meinung ist.

TextBlob (Text) .Sentiment gibt uns die Polaritätswerte, Subjektivität.
Polarität variiert von -1 ein 1 (1 ist positiver, 0 ist neutral, -1 ist eher negativ)
Subjektivität variiert von 0 ein 1 (0 es ist sehr objektiv und 1 sehr subjektiv)

88020tb-3016001
TextBlob-Sentiment-Beispiel

Python-Code:

aus Textblob importieren TextBlob
# Funktion zur Berechnung der Subjektivität
def getSubjektivität(Rezension):
    TextBlob zurückgeben(Rezension).Sentiment.Subjektivität
    # Funktion zur Berechnung der Polarität
    def getPolarity(Rezension):
        TextBlob zurückgeben(Rezension).sentiment.polarität

# Funktion zum Analysieren der Bewertungen
Def-Analyse(Spielstand):
    wenn punktzahl < 0:
        return 'Negative'
    elif score == 0:
        return 'Neutral'
    else:
        return 'Positive'

Erläuterung: Funktionen, die erstellt wurden, um Polaritätswerte zu erhalten, Subjektivität und beschriften Sie die Bewertung basierend auf dem Polaritäts-Score.

Erstellen Sie einen neuen Datenrahmen mit der Revision, Lemma-Spalten und wenden Sie die oben genannten Funktionen an

fin_data = pd.DataFrame(meine Daten[['bewertung', 'Lemma']])
# fin_data['Subjectivity'] = fin_data['Lemma'].anwenden(getSubjektivität) 
fin_data['Polarity'] = fin_data['Lemma'].anwenden(getPolarität) 
fin_data['Analysis'] = fin_data['Polarity'].anwenden(Analyse)
fin_data.head()
34789Textblob-5657703

Zählen Sie die Anzahl der positiven Bewertungen, negativ und neutral.

tb_counts = fin_data.Analysis.value_counts()

tb_counts
55142textblobcount-9212161
Anzahl positiver Bewertungen, negativ und neutral

Stimmungsanalyse mit VADER

VADER steht für Valence Aware Dictionary und Sentiment Reasoner. Vaders Stimmung sagt nicht nur, ob die Aussage positiv oder negativ ist, zusammen mit der Intensität der Emotion.

52362vs-5728415

Die Summe der Intensitäten pos, negativ, neu da 1. Die Verbindung variiert von -1 ein 1 y ist die Metrik, die verwendet wird, um die Gesamtstimmung zu zeichnen.
positiv, wenn zusammengesetzt> = 0.5
neutral ja -0,5 <Verbindung <0,5
negativ ja -0,5> = Verbindung

Python-Code:

from VaderSentiment.vaderSentiment import SentimentIntensityAnalyzer
Analyzer = SentimentIntensityAnalyzer()
# Funktion zur Berechnung der Vaterstimmung
Def Vater Stimmungsanalyse(Rezension):
    vs = Analyzer.polarity_scores(Rezension)
    zurück vs['Compound']
    fin_data['Vader Sentiment'] = fin_data['Lemma'].anwenden(Vaterstimmungsanalyse)
# Funktion zu analysieren
def vader_analyse(Verbindung):
    wenn zusammengesetzt >= 0.5:
        return 'Positive'
    elif compound <= -0.5 :
        return 'Negative'
    else:
        return 'Neutral'
fin_data['Vader Analysis'] = fin_data['Vader Sentiment'].anwenden(vader_analyse)
fin_data.head()

Erläuterung: Funktionen, die entwickelt wurden, um Vader-Scores und Tag-Reviews basierend auf zusammengesetzten Scores zu erhalten

Zählen Sie die Anzahl der positiven Bewertungen, negativ und neutral.

Father_counts = fin_data['Vader Analysis'].value_counts()
vader_counts

Stimmungsanalyse mit SentiWordNet

SentiWordNet verwendet die Datenbank WordNet. Es ist wichtig, den POS zu bekommen, Motto jedes Wortes. Dann werden wir das Motto verwenden, POS, um die Synonymsätze zu erhalten (synsets). Dann, wir erhalten die objektiven Scores, negativ und positiv für alle möglichen Synthesizer oder den ersten Synthesizer und wir beschriften den Text.

ja positive Bewertung> negative Punktzahl, das gefühl ist positiv
ja positive Bewertung <negative Punktzahl, das gefühl ist negativ
wenn positiver Wert = negativer Wert, das gefühl ist neutral

Python-Code:

nltk.download('sentiwordnet')
von nltk.corpus importiere sentiwordnet als swn
def Sentiwordnetanalyse(pos_daten):
    Stimmung = 0
    tokens_count = 0
    für Wort, pos in pos_data:
        wenn nicht pos:
            fortsetzen
            lemma = wordnet_lemmatizer.lemmatize(Wort, pos = pos)
        wenn nicht lemma:
            fortsetzen
            synsets = wordnet.synsets(Lemma, pos = pos)
        wenn nicht synsets:
            fortsetzen
            # Nimm den ersten Sinn, das Üblichste
            synset = synsets[0]
            noise_synset = noise.senti_synset(synset.name())
            Stimmung += swn_synset.pos_score() - swn_synset.neg_score()
            tokens_count += 1
            # drucken(swn_synset.pos_score(),swn_synset.neg_score(),swn_synset.obj_score())
        wenn nicht tokens_count:
            Rückkehr 0
        wenn Gefühl>0:
            Rückkehr "Positiv"
        wenn Stimmung==0:
            Rückkehr "Neutral"
        anders:
            Rückkehr "Negativ"

fin_data['SWN analysis'] = meine Daten['POS tagged'].anwenden(Sentiwordnetanalyse)
fin_data.head()

Erläuterung: Wir erstellen eine Funktion, um die positiven und negativen Werte für das erste Wort des Synsets zu erhalten und dann den Text zu beschriften, indem wir die Stimmung als Differenz von positiven und negativen Werten berechnen.

Zählen Sie die Anzahl der positiven Bewertungen, negativ und neutral.

swn_counts=fin_data['SWN analysis'].value_counts()
swn_counts

Bis zu diesem Punkt, Wir haben die Implementierung von Sentiment-Analysen mit einigen der beliebten lexikonbasierten Techniken gesehen. Jetzt schnell eine Visualisierung erstellen und die Ergebnisse vergleichen.

Visuelle Darstellung der TextBlob-Ergebnisse, VADER, SentiWordNet

Wir werden die Anzahl der positiven Bewertungen nachverfolgen, negativ und neutral für die drei Techniken.

import matplotlib.pyplot als plt
%matplotlib inline
plt.figur(Feigengröße=(15,7))
plt.subplot(1,3,1)
plt.titel("TextBlob-Ergebnisse")
plt.pie(tb_counts.values, Etiketten = tb_counts.index, explodieren = (0, 0, 0.25), autopct="%1.1F%%", Schatten=Falsch)
plt.subplot(1,3,2)
plt.titel("VADER-Ergebnisse")
plt.pie(vader_counts.values, Etiketten = vader_counts.index, explodieren = (0, 0, 0.25), autopct="%1.1F%%", Schatten=Falsch)
plt.subplot(1,3,3)
plt.titel("SentiWordNet-Ergebnisse")
plt.pie(swn_counts.values, Etiketten = swn_counts.index, explodieren = (0, 0, 0.25), autopct="%1.1F%%", Schatten=Falsch)

Wenn wir uns das Bild oben ansehen, Die Ergebnisse von TextBlob und SentiWordNet sehen etwas eng aus, während die VADER-Ergebnisse eine große Variation zeigen.

Abschließende Anmerkungen:

Herzlichen Glückwunsch 🎉 an uns. Am Ende dieses Artikels, Wir haben die verschiedenen Schritte der Datenvorverarbeitung und die verschiedenen lexikalischen Ansätze zur Sentimentanalyse kennengelernt. Wir vergleichen die Ergebnisse von TextBlob, VADER, SentiWordNet mit Tortendiagrammen.

Verweise:

TextBlob-Dokumentation

VADER-Stimmungsanalyse

SentiWordNet

Vollständiges Jupyter-Notizbuch ansehen hier auf GitHub gehostet.

Die in diesem Artikel gezeigten Medien sind nicht Eigentum von Analytics Vidhya und werden nach Ermessen des Autors verwendet.

Abonniere unseren Newsletter

Wir senden Ihnen keine SPAM-Mail. Wir hassen es genauso wie du.

Datenlautsprecher