cbiehl / wwi19dsa-nlp

Natural Language Processing Lecture Repo
2 stars 0 forks source link

Vaccination sentiment #1

Open Slurbisaur opened 2 years ago

Slurbisaur commented 2 years ago

The basic Idea is to create a programm that analises Twitter Data to get an idea of the Vaccination sentiment for the possible third vaccine shot. Participants: s191606(WWI19DSA), s192302(WWI19DSA), s190724(WWI19DSA), s190903(WWI19DSA)

Slurbisaur commented 2 years ago

We decided to use the working twitter Development API which is accessable via a dev user account ... after this the Data acquisition can take place in a Linux environment via tweepy and Kafka. We will extract real time Data over several intervals using this method. Streamed data will then be pulled via the twitter api

Slurbisaur commented 2 years ago

in addition to positive and negative sentiments we would like to present a more granular evaluation based on the persons (if applicable) country, device, region, user age...

Slurbisaur commented 2 years ago

Vaccination Sentiment

Team:

Das Projekt

Sentiment-Analyse von Twitter Daten in Bezug auf die Covid-Vaccination

Verwendete Tools

Verwendete Daten

Die verwendeten Daten wurden von der Gruppe mit Hilfe von der Twitter API direkt von Twitter bezogen. Hierzu wurde nach einem geeigneten Datensatz gesucht und dieser mit Hilfe oben genannter Tools für die Auswertung vorbereitet.

Für das Training des Modells wurde mit Hilfe von nltk ein Trainingsdatensatz bezogen.

Ausführung

Als erstes sollten mittels "pip install -r requirements.txt" überprüft werden ob py die requirements erfüllt. Das Modell wird mit dem starten der main.ipynb Datei trainiert. Hierbei sollte darauf geachtet werden, dass die zu analysierende Datei bereit liegt. Schlussendlich kann der sentiment-Dataframe durch starten der Explorative DatenAnalyse.ipynb visualisiert werden.

Projektbeschreibung

Für die Prüfungsleistung der Vorlesung „Natural Language Processing (Aktuelle Data Science Entwicklungen)“ wird von unserer Gruppe eine Sentimentanalyse auf Tweets bezüglich der Impfkampagne gegen das Covid-19-Virus durchgeführt. Hierzu bezieht unsere Gruppe einen geeigneten Datensatz mit Hilfe der Twitter API. Dieser Datensatz wurde bereinigt und zur Verarbeitung vorbereitet. Für die Durchführung einer Sentimentanalyse wird ein Modell zur Vorhersage des Sentiments trainiert. Als Trainingsdaten dienen Trainings-Tweets des nltk Pakets in Python. Das Modell wird von unserer Gruppe gemäß den Machine Learning Standards trainiert, evaluiert und optimiert.

Umsetzung

Datenbeschaffung

Es gibt einige Voraussetzungen für das Beschaffen der Twitter Daten mit einem eigenen Zugang zur Twitter API.

Erstellen eines Twitter Developer Accounts, um überhaupt die notwendigen Berechtigungen zu erlangen über die Twitter API Tweets ziehen zu können. Nachdem der Access zur Twitter API von Twitter gewährleistet wurde, muss eine App in dem Twitter Developer interface initialisiert werden. Beim Initialisieren der APP werden einem direkt die Auth Tokens und die API Access Tokens generiert und angezeigt, diese unbedingt sofort speichern, da sie sonst neu generiert werden müssen.

Im Folgenden werden Befehle zur Installierung von Kafka Servern und den notwendigen Packages in der Syntax von Ubuntu Linux OS beschrieben, der Prozess ändert sich allerdings nicht mit einem anderen OS.

Damit sind alle Voraussetzungen erfüllt.

Wir benötigen in den nächsten Schritten mehrere command line interfaces, denn wir möchten sowohl unseren Kafka Server, als auch unseren Listener im Hintergrund parallel zum Skript ausführen.

2.2 Datenverarbeitung

Die Tweets beinhalten eine Reihe an Informationen, welche für die spätere Datenauswertung von Bedeutung sein könnten (mögliche Korrelationen). Aus diesem Grund ist es zumindest anfänglich von Vorteil die scheinbar überflüssigen Informationen nicht zu verwerfen. Hierfür empfiehlt sich die Arbeit mittels eines DataFrames dessen Spalten sich einfach auswerten/bearbeiten lassen. Bevor die Daten in das Modell eingeschleust werden können, sollten sie bereinigt werden. Hierfür betrachtet man zuerst den Texten und macht jegliche Zeichenkombination aus welche man herausfiltern möchte. Oft sind das Twitternamen, URL´s… Obwohl auf den ersten Blick Emojis nicht dazu gehören werden diese auch herausgefiltert da das Modell mittels Standard Tweets trainiert wird, die soziale Auffassung der Covid-Vaccines der Twitter-community jedoch ihre ganze eigenen Emoticon Sprache besitzt. Aus ähnlichen Gründen ist die Anwendung dieses Modells hauptsächlich auf Tweets, welche in englischer Sprache verfasst sind anzuwenden.

bengoeller commented 2 years ago

Datenvorverarbeitung (6534804)

  1. Einlesen und Erstellung eines Pandas-Dataframes

Zum Einlesen der JSON-Datei, welche die Tweets enthält, wurden die Pandas- und JSON-Bibliotheken für Python verwendet. Mit der Pandas-Funktion pd.read_json('') wurde die JSON-Datei in ein Pandas Dataframe überführt. Beim Einlesen kam es zu Komplikationen, da die JSON-Datei aus vielen einzelnen JSON-Objekten bestand, welche von der Funktion allerdings nicht erkannt wurden. Nachdem die einzelnen JSON-Objekte in einer Liste gespeichert wurden, konnte diese erfolgreich eingelesen und in ein Dataframe gepackt werden. Es wurde neben einem ausführlichen Dataframe noch ein extra Dataframe mit den User Informationen erstellt, welche im nachfolgenden Schritt zusammengeführt wurden.

  1. Data Understanding

Nachfolgend wurden für ein tieferes Data Understanding einige relevante Informationen über das Dataframe abgerufen.

  1. Data Cleaning

Auf Basis der gewonnenen Erkenntnisse aus Schritt 2 wurden folgende Spalten aus Gründen der Irrelevanz und Unvollständigkeit aus dem Dataframe gedroppt:

-truncated -in_reply_to_status_id -in_reply_to_status_id_str -in_reply_to_user_id -in_reply_to_user_id_str -in_reply_to_screen_name -user -geo -coordinates -place -filter_level -extended_entities -possibly_sensitive -display_text_range -quoted_status_id -quoted_status_id_str -quoted_status -quoted_status_permalink -id_x -id_str_x -translator_type -protected -statuses_count -created_at_x -utc_offset -time_zone -geo_enabled -lang_x -contributors_enabled -is_translator -profile_background_color -profile_background_image_url -profile_background_image_url_https -profile_background_tile -profile_link_color -profile_sidebar_border_color -profile_text_color -profile_sidebar_fill_color -profile_use_background_image -profile_image_url -profile_image_url_https -default_profile -following -follow_request_sent -notifications -profile_banner_url -id_y -created_at_y -id_str_y -lang_y

  1. Data Pre-Processing

Für das Data Pre-Processing wurde die in SpaCy integrierte Pipeline genutzt. Die daraus resultierenden Token wurden anschließend wieder zum Dataframe hinzugefügt.

  1. Probleme

Beim Plotten stellte sich heraus, dass die für die Erstellung der Plots notwendigen Spalten retweet_count, favorite_count, reply_count und quote_count über die ganze Länge des Dataframes NaN ware, obwohl in der JSON Datei klar ersichtlich war, dass bei den meisten JSON-Objekte an dieser Stelle andere Werte vorhanden waren. Daher wurde der Datensatz erneut, diesmal allerdings mit Hilfe der JSON-Bibliothek für Python, eingelesen. Nach Einlesen des Datensatzes erhält man eine Liste, welche die einzelnen JSON-Objekte enthält. Über diese Liste wurde mittels einer while-Schleife iteriert. Bei jeder Iteration wurde geprüft, ob es sich beim jeweiligen Tweet um einen Retweet handelt, wenn ja, wurde mittels des Keys 'retweeted_status" auf die jeweilige Variable, beispielsweise 'retweet_count", zugegriffen und der Wert wurde an die passende Stelle im Dataframe hinzugefügt.

abeutler01 commented 2 years ago

Nach der Verarbeitung durch die NLP-Pipeline wurden die erfassten tokens sowie deren Textelemente in den Datenframe zurückgeführt. Woraus sich 3 Spalten mit verwendbaren Texten ergeben:

  1. Sentiment Analyse Da es sich im gegebenen Datensatz um Daten ohne Label handelt können Ansätze zur Erhebung eines strukturierten Modells nicht verwendet werden. Im Rahmen der Durchführung stellte sich zudem heraus dass eine Neuimplementierung eines unstrukturierten Modells durch z.B. Deep Learning den Zeitfaktor höchstwahrscheinlich überschreitet, sowohl in Rechenzeit als auch Implementation.

Deshalb wurde sich für die Verwendung von vortrainierten Modellen aus öffentlichen Bibliotheken entschieden. Um ein gewisses Maß an Vergleichbarkeit herzustellen wurden 2 unterschiedliche Modelle angewendet.

  1. Der Sentiment Analyser der NLTK Bibliothek
  2. Der Sentiment Analyser der pysentimiento Bibliothek

Ersteres ist ein bekanntes und leichtgewichtiges Modell der NLTK Bibliothek für NLP Verarbeitung. Zweiteres ist ein letztes Jahr geschaffenes Transformer Modell, welches auf dem BERT-Modell aufbaut. In beiden Fällen wurden sie auf einem Twitter-Corpus trainiert. Es ist also zu erwarten, dass sie zwar nur begrenzt mit medizinischen Diskussionen umgehen können, dafür aber sehr effizient mit persönlichen und politischen Gesprächen, sowie der für die Plattform typische Sprache umgehen können. [Quelle für pysentimiento; https://github.com/pysentimiento/pysentimiento ]

Beide Modelle sind für die Englische Sprache ausgelegt, da es sich aber um vortrainierte Modelle handelt werden die Ergebnisse auf den individuellen Tweets nicht beeinträchtigt. Die mehrsprachingen Texte können entsprechend für die Visualisierung entfernt werden.

Ebenso liefern beide Modelle 3 Konfidenz angaben für jeweils ein positives, negatives und neutrales Sentiment, sowie ein Gesamtergebniss. NLTK gibt zusätzlich noch einen Subjektivitätswert an.

Wildi-99 commented 2 years ago

Erstellen der Diagramme für die Modelle: Uns interessierte wie viral die unterschiedlichen Posts gegangen sind. Diese Informationen erhalten wir aus den jeweiligen Reply-, Favorite-, und Quote Counts. Das Problem hierbei war, die Tweets zu ignorieren, die keine Werte für diese Spalte hatten. durch die .replace() -Funktion von pandas war das möglich, sodass "NaN" Werte durch 0 ersetzt wurden. Die Darstellung der Werte erfolgte trivial durch die Aggregation aller Sentimente und deren Anzahl.

Weiterhin war geplant, dass wir die Tweets und deren Erstelldatum abbilden, um sie in Zusammenhang mit aktuellen Nachrichten zu bringen. Leider gab es der Datensatz nur her, die Tweets, die über einen Monat gesammelt wurden auf 3 Tage darzustellen. Diese Darstellung ist leider nicht Aussagekräftig und wurde somit nicht weiter bearbeitet.

Slurbisaur commented 2 years ago

Präsentation: Vaccination Sentiment (1) (1).pdf

Slurbisaur commented 2 years ago

Data: boostershot.zip

Slurbisaur commented 2 years ago

Code: Source.zip