netflix

Klassifizierung von Emotionen in Netflix Reviews mit Deep Learning

In diesem Artikel werden wir das Thema der Stimmungsanalyse mit künstlicher Intelligenz. Insbesondere wird es darum gehen, mithilfe eines neuronalen Netzes echte Netflix-Rezensionen hinsichtlich der Emotionen, die dieser Rezension zugrunde liegen, einzuordnen bzw. zu klassifizieren.

In anderen Worten: Eine KI wird lernen zwischen unterschiedlichen menschlichen Emotionen zu unterscheiden.


1. Warum sollte eine KI lernen überhaupt Emotionen zu erkennen?

Eines der wichtigsten Elemente für ein Unternehmen ist der Kontakt zu ihrem Kundenstamm. Für diese Unternehmen ist es von entscheidender Bedeutung, genau zu wissen, was Verbraucher oder Kunden über neue oder bewährte Produkte und Dienstleistungen sowie über aktuelle Initiativen und Angebote denken.

Die Stimmungsanalyse ist eine Möglichkeit, diese notwendige Aufgabe zu erfüllen.

Die Stimmungsanalyse ist ein Bereich der natürlichen Sprachverarbeitung (engl. : Natural Language Processing – NLP). In NLP werden Modelle erstellt, die versuchen, bestimmte Attribute eines sprachlichen Ausdrucks zu identifizieren und zu klassifizieren. Diese Attribute könnten sein:

  • Polarität: Ob eine Person eine positive, neutrale oder negative Meinung vertritt oder in diesem Moment ausdrückt
  • Thema: Die Sache, über die gerade viel gesprochen wird
  • Meinungsträger: Die Person oder das Unternehmen, das die Meinung gerade äußert

In einer Welt, in der wir täglich 2,5 Quintillionen Bytes an Daten erzeugen, ist die Stimmungsanalyse zu einem wichtigen Instrument geworden, um diese Daten sinnvoll zu nutzen. Diese großen Datenmengen haben es Unternehmen ermöglicht, wichtige Erkenntnisse zu gewinnen und alle Arten von Prozessen zu automatisieren.

Mithilfe der Stimmungsanalyse können unstrukturierte Informationen, bspw. aus Facebook, Twitter, Pinterest, etc. , automatisch in strukturierte Daten umgewandelt werden. Diese strukturierten Daten könnten eine Meinung zu Produkten, Dienstleistungen, Marken, Politik oder anderen Themen sein, zu denen Menschen ihre Meinung äußern können.

Dies gewonnenen Stimmungsdaten können für kommerzielle Anwendungen wie Marketinganalysen, Öffentlichkeitsarbeit, Produktbewertungen, Produktfeedback sowie Kundenservice sehr nützlich sein.

Im Folgenden zeige ich Ihnen, wie Sie ein Deep Learning Modell implementieren können, das in der Lage ist, Netflix-Rezensionen als positiv oder negativ zu klassifizieren. Das Modell nimmt eine ganze Rezension als Eingabe (Wort für Wort) und liefert prozentuale Bewertungen, die angeben, ob die Rezension eine positive oder negative Meinung über einen Film darstellt.

Dabei verwende ich einen Datensatz, der etwa 5000 negative sowie 5000 positive Rezensionen enthält. An dieser Stelle finden Sie 5 Beispiele für Rezensionen aus dem Datensatz:

"The film is a hoot and is just as good if not better than much of what s on saturday morning tv, especially the pseudo educational stuff we all can’t stand.”    
 "The things this movie tries to get the audience to buy just won’t fly with most intelligent viewers.” 
"Although life or something like it is very much in the mold of feel good movies, the cast and director stephen herek’s polished direction pour delightfully piquant wine from aged bottles.”
"This is the case of a pregnant premise being wasted by a script that takes few chances and manages to insult the intelligence of everyone in the audience.”
 "One of the finest most humane and important holocaust movies ever made."

Diese fünf Rezensionen werden am Ende des Artikels durch das implementierte neuronale Netz entweder in eine positive oder eine negative Rezension klassifiziert. Das Deep-Learning-Modell sowie alle erforderlichen Daten sind in meinem GitHub-Repositorium zu finden.

Beginnen wir zu aller erst mit etwas Theorie.


1. Rekurrente Neuronale Netze

Rekurrente Neuronale Netze (eng: Recurrent neuronale Networks, kurz: RNNs) sind beliebte Modelle, die sich bei vielen NLP-Aufgaben als sehr vielversprechend erwiesen haben.

RNNs nutzen sequenzielle Informationen wie z.B. Text. Bei einem „traditionellen“ neuronalen Feedforward-Netz (auch Multilayer Perceptron genannt) wird davon ausgegangen, dass alle Eingaben zeitlich unabhängig voneinander sind. Allerdings für viele Aufgaben ist es ein schlechter Ansatz.

Ein Satz zum Beispiel hat eine klare grammatikalische Struktur und Reihenfolge, bei der jedes Wort vom vorhergehenden Wort abhängt. Wenn Ihr neuronales Netz die Bedeutung (oder in unserem Fall die Stimmung) in einem Text erkennen soll, muss das Netz wissen, welche Wörter in welcher Reihenfolge kommen.

RNNs werden als rekurrent bezeichnet, weil sie für jedes Element einer Sequenz die gleiche Aufgabe ausführen, wobei die Ausgabe von den vorherigen Berechnungen abhängt. Man kann sich RNNs auch so vorstellen, dass sie über einen „Speicher“ verfügen, in dem Informationen darüber gespeichert werden, was bisher berechnet wurde.

An dieser Stelle sehen sie eine schematische Darstellung eines RNNs, der die Funktionsweise dieses Netzes vermittelt:

Architektur eines rekurrenten neuronalen Netzes
Abb. 1 Funktionsweise eines rekurrenten neuronalen Netzes

x(t-1), x(t), x(t+1) stellen aufeinander folgende Eingaben für die Zeitpunkte (t-1), (t) und (t+1) dar. Diese Eingaben könnten Wörter in einem Satz sein und hängen dementsprechend voneinander ab. y(t_1), y(t), y(t+1) stellen die entsprechenden Ausgaben des RNNs dar.

Einzigartig für RNN ist die Tatsache, dass die Berechnung des aktuellen Zustands h(t) der Neuronen für eine innere Schicht für die Eingabe x(t) von dem vorherigen Zustand h(t-1) abhängt, die für die vorherige Eingabe x(t-1) berechnet wurde.

W_{xh} und W_{hh} stellen Gewichtsmatrizen dar, die die Eingabe x(t) mit der versteckten Schicht h(t) bzw. h(t) mit h(t-1) verbinden.

Auf diese Weise führen wir eine Rekursion in das neuronale Netz ein, die als Erinnerung an die vorherigen Eingaben angesehen werden kann. Theoretisch können RNNs auf diese Weise Informationen in beliebig langen Sequenzen nutzen, aber in der Praxis sind sie darauf beschränkt, nur wenige Schritte in die Vergangenheit zurückzublicken.
An dieser Stelle kommen LSTMs ins Spiel.


1.1 LSTMs

Long Short-Term Memory-Netzwerke – gewöhnlich einfach „LSTMs“ genannt – sind eine besondere Art von RNNs. LSTMs sind in der Lage deutlich längerfristige Abhängigkeiten zu lernen als gewöhnliche RNNs. LSTMs haben keine grundsätzlich andere Architektur als RNNs, aber sie enthalten zusätzliche Komponenten.

LSTM
Abb.2 Beispiel eines LSTM.

Der Schlüssel zu LSTMs ist der sog. Zellzustand C(t), die als horizontale Linie durch den oberen Teil der Abb. 2 verläuft. Neben der Verwendung der Neuronenwerte h(t), ist ein Zellzustand ein zusätzlicher Weg, um Informationen zu speichern. C(t) macht es möglich, dass LSTMs im Gegensatz zu gewöhnlichen RNNs mit viel längeren Datensequenzen arbeiten können.

Darüber hinaus haben LSTMs die Möglichkeit, Informationen zum Zellzustand entweder hinzuzufügen oder aus dem Zellzustand zu entfernen. Das wird durch zusätzliche Komponenten, die Gates genannt werden, möglich gemacht.

Die Gates sind eine Möglichkeit, Informationen, die in das LSTM hereinkommen, auf beliebige Art und Weise zu speichern, zu verändern oder zu ignorieren. Ein LSTM beinhaltet insgesamt drei unterschiedliche Gates. Diese sind:

  • Forget-Gate: Nachdem wir den Zustand h(t-1) der inneren Neuronen für die vorherige Eingabe x(t-1) erhalten haben, hilft uns das Forget-Gate dabei, Entscheidungen darüber zu treffen, was aus dem Zustand h(t-1) entfernt werden muss, damit nur relevante Informationen erhalten bleiben.
  • Input-Gate: Im Input-Gate entscheiden wir, ob wir neue Daten von der aktuellen Eingabe x(t) zu unserem aktuellen Zellzustand C(t) hinzufügen oder ignorieren
  • Output-Gate: Dieses Gate entscheidet, wie der Name suggeriert, was vom aktuellen Zellzustand C(t) zum nächsten Zustand C(t+1) transferiert werden soll. Für das Beispiel des Sprachmodells könnte es, dass in diesem Augenblick Informationen über das gerade gesehene Subjekt ausgegeben werden für den Fall, dass als Nächstes ein Verb kommt. Die Information könnte zum Beispiel darüber sein, ob das Subjekt Singular oder Plural sind, damit wir wissen, in welche Form ein Verb konjugiert werden sollte, wenn ein Verb als Nächstes kommt.

Hinter jedem dieser Gates stehen separate neuronale Netze. Wie Sie sich vorstellen können, macht dies die LSTMs ziemlich komplex.


2. Daten-Vorverarbeitung

Bevor wir einen Text bzw. eine Rezension als Eingabe für das rekurrente neuronale Netz verwenden können, müssen wir diese Daten zunächst vorverarbeiten. Die notwendige Daten-Vorverarbeitung bestehen dabei aus 3 Schritten.


2.1 Vereinheitlichung der Schreibweise von Wörtern

Betrachten wir Wörter wie „Etwas“ und „etwas„. Für uns Menschen haben diese Wörter die gleiche Bedeutung. Der einzige Unterschied zwischen diesen Wörtern besteht darin, dass das erste Wort großgeschrieben wird, da es das erste Wort in einem Satz sein könnte.

Für das neuronale Netz haben diese Wörter jedoch (zumindest am Anfang) eine andere Bedeutung, weil sie unterschiedlich geschrieben werden. Erst im Laufe des Trainings kann das neuronale Netz lernen, zu erkennen, dass diese Wörter dasselbe bedeuten – oder auch nicht. Unser Ziel ist es, solche Fehleinschätzungen zu verhindern.

Aus diesem Grund besteht der erste Schritt der Vorverarbeitung darin, alle Wörter in Kleinbuchstaben umzuwandeln.

2.2 Entfernen von Sonderzeichen

Sonderzeichen wie „. , ! ? ‚“ usw. tragen i.d.R. nicht zur Stimmung einer Rezension bei und können daher entfernt werden.

Betrachten Sie bitte das folgende Beispiel einer unbearbeiteten Rezension aus dem zuvor erwähnten Datensatz:

"Although life or something like it is very much in the mold of feel good movies, the cast and director stephen herek’s polished direction pour delightfully piquant wine from aged bottles.”

Nach der Vereinheitlichung und dem Entfernen von Sonderzeichen sieht das Rezessionsbeispiel nun wie folgt aus:

"although life or something like it is very much in the mold of feel good movies the cast and director stephen hereks polished direction pour delightfully piquant wine from aged bottles”

Die Vorverarbeitung wird auf jede Rezension im Datensatz angewendet.

2.3 Wort-zu-Index

Ein weiterer wichtiger Schritt ist die Erstellung einer sogenannten Word-To-Index-Map, die jedem Wort im Datensatz einen eindeutigen ganzzahligen Wert zuweist. Der in diesem Projekt verwendete Datensatz, der die Netflix-Rezensionen beinhaltet, besteht aus insgesamt 18339 eindeutigen Wörtern. Die Wort-To-Index-Map muss damit die gleiche Anzahl von Einträgen aufweisen. Diese Anzahl wird auch als Vokabulargröße bezeichnet.

Der erste und der letzte Eintrag in der Wort-Index-Map, die ich erhalten habe, sehen wie folgt aus:

Word-to-Index Beispiel.
Abb. 3 Word-to-Index Beispiel.

Damit wird dem Wort „the“ ein eindeutiger Wert von 0 zugeordnet. Das Wort „rock“ bekommt den Wert 2 etc. . Jedes Wort in dem Vokabular hat damit eine eindeutige ID erhalten.

Dieser Schritt, bei dem den Wörtern in dem Datensatz ein eindeutiger Zahlenwert zugewiesen wird, ist von entscheidender Bedeutung, da wir keine Strings in ein neuronales Netz einspeisen können. Stattdessen können wir mit Word-to-Index Texte durch eine Reihe von Zahlenwerten darstellen. Betrachten wir die folgende Rezension:

"the things this movie tries to get the audience to buy just wont fly with most intelligent viewers”

Mithilfe der Word-to-Index-Map kann diese Rezension durch ein Array von Integers dargestellt werden, wobei jedes Wort durch einen Integerwert aus der Word-To-Index-Map repräsentiert wird:

[0, 5094, 147, 81, 1269, 5, 532, 0, 1303, 5, 1835, 652, 236, 1101, 125, 188, 712, 855]

 

3. Wort-Embeddings

Natürlich kann ein neuronales Netz weder eine Zeichenkette noch einen einzelnen Integer-Wert als Eingabe verarbeiten. Stattdessen müssen wir sog. Word-Embeddings (deutsch; Worteinbettungen) verwenden.

Word-Embeddings sind eine Darstellung für Textdaten, die für die beeindruckende Leistung von deep learning Modellen bei anspruchsvollen NLP-Problemen verantwortlich ist.

Word-Embeddings sind eine Klasse von Techniken, bei denen einzelne Wörter durch einen reellwertigen Vektor dargestellt werden. Diese Vektoren können dabei Dutzende oder Hunderte von Dimensionen aufweisen. Jedes eindeutige Wort in einem Text wird einem bestimmten „Embedding“-Vektor zugeordnet. Die Werte der Einträge in diesen Vektoren werden von einem neuronalen Netz gelernt.

Zum Beispiel können wir die Wörter „although“ und „life“ als 10-dimensionale Vektoren einbetten:

although  = [0.8 1.0 4.2 7.5 3.6]
life      = [8.3 5.7 7.8 4.6 2.5 ]

Jeder Vektor, der ein Wort in einem textbasierten Datensatz darstellt, wird aus einer großen Matrix, der sogenannten Embedding-Matrix (Einbettungsmatrix), gewonnen. Die Anzahl der Zeilen dieser Matrix steht für die Dimension der Enbettungs-Vektoren.

Die Anzahl der Spalten steht dabei für die Größe des Vokabulars bzw. die Anzahl der eindeutigen Wörter im Datensatz, vgl. Abb 4. Somit stellt jede Spalte dieser Matrix einen Einbettungsvektor für ein eindeutiges Wort im Datensatz dar.

Woher wissen wir, welche Spalte für welches Wort steht? An dieser Stelle kommt die Wort-To-Index-Map zum Einsatz.

Angenommen, Sie möchten den Einbettungsvektor für das Wort „although“ erhalten. Dieses Wort wird gemäß der Wort-To-Index-Map durch den Wert 2511 repräsentiert. Im nächsten Schritt muss ein one-hot-encoded Vektor mit der Dimension 18339 (Anzahl der Wörter im Datensatz) erstellt werden, bei dem jeder Eintrag 0 ist, mit Ausnahme des 2511sten Eintrags, der den Wert 1 hat.

Durch die Multiplikation zwischen der Einbettungsmatrix und dem one-hot-encoded Vektor erhalten wir die 2511ste Spalte der Matrix, die den Einbettungsvektor für das Wort „although“ darstellt.

Erstellung eines word embeddings Vektors
Abb. 4 Erstellung eines word embeddings Vektors.

Auf diese Weise können wir ganze Absätze oder ganze Netflix-Rezensionen in einen LSTM einspeisen. Wir suchen einfach für jedes Wort aus dem Text den dazugehörigen ganzzahligen Wert in der Wort-To-Index-Map, erstellen den entsprechenden one-hot-encoded Vektor und führen ein Produkt mit der Matrix durch.

Das Ergebnis von dem Produkt ist der Einbettungsvektor, der das entsprechende Wort repräsentiert. Die Rezension wird dann Wort für Wort (Vektor für Vektor) in das LSTM-Netzwerk eingespeist, vgl. Abb 5:

LSTM in Arbeit
Abb. 5 LSTM in Arbeit

4. Klassifizierung von Emotionen in Reviews mit LSTMs

Bis zu diesem Zeitpunkt haben Sie gesehen, wie Textdaten vorverarbeitet und in das LSTM-Netzwerk eingespeist werden. An dieser Stelle möchte ich darauf eingehen, wie das neuronale Netz zugrunde liegende Emotionen in einer vorliegenden Rezension erkennen kann.

Das LSTM-Netzwerk erhält für jeden Zeitschritt t einen Eingangsvektor x(t). Für diesen wird eine Ausgabe y(t) produziert. Dieser Prozess wird bis x(n) wiederholt, wobei n die Anzahl der Wörter in der Rezension ist. Bspw. n=20 Wörter.

Damit hat das LSTM insgesamt n Ausgangsvektoren y(1) - y(n) erzeugt. Jeder dieser 20 Vektoren steht für etwas Bestimmtes, jedoch noch nicht für die Emotion dieser Rezension. Vielmehr sind die Vektoren y eine kodierte Darstellung der Eigenschaften/Merkmalen der vorliegenden Rezension, die (laut dem neuronalen Netz) für die Bestimmung der Emotion wichtig sind.

y(8) repräsentiert dabei die Merkmale, die das neuronale Netz für die ersten 8 Wörter der Rezension erkannt hat. y(20) hingegen repräsentiert die Merkmale für die gesamte Rezension.

Obwohl es in der Praxis ausreicht, nur den letzten Ausgangsvektor y(20) zu verwenden, habe ich festgestellt, dass es zu genaueren Ergebnissen führt, wenn wir alle Vektoren y(0) - y(20) zur Bestimmung der Emotionen in einem Text verwenden. Das kann erreicht werden, indem man den Mittelwert über alle Vektoren berechnet. Diesen Mittelwert über alle Ausgabevektoren können wir als y_{mean} bezeichnen.

Im letzten Schritt kann die in y_{mean} kodierte Repräsentation der Rezension verwendet werden, um die Rezension in die Kategorien „positiv“ oder „negativ“ zu klassifizieren. Dazu ist es erforderlich, eine letzte Neuronenschicht in das Netz einzufügen, die für die eigentliche Klassifizierung verantwortlich ist. Diese Klassifizierungsschicht ist nichts anderes als das Produkt zwischen y_{mean} und einer weiteren Gewichtsmatrix W.

Der beschriebene Prozess der Stimmungsanalyse mittels deep learning und künstlichen neuronalen Netzen ist in meinem GitHub-Repository implementiert. Sie können es sich gerne ansehen und die Klassifizierung selbst ausprobieren.

Nachdem das neuronale Netz trainiert wurde, kann die Stimmungsanalyse auf noch nicht gesehene Bewertungen angewendet werden. An dieser Stelle sehen Sie 5 Bewertungen, für die das trainierte neuronale Netz eine prozentuale Wahrscheinlichkeit angegeben hat, zu welcher Emotion die jeweilige Rezension gehört:

Test Samples:
Review: "the film is a hoot and is just as good if not better than   much of whats on saturday morning tv especially the pseudo educational stuff we all cant stand"
pos. sentiment: 0.96 %
neg. sentiment: 0.04 %
---------------------------------------------
Review: "the things this movie tries to get the audience to buy just wont fly with most intelligent viewers"

pos. sentiment: 0.11 %
neg. sentiment:
0.89 %

———————————————

Review: "although life or something like it is very much in the mold of feel good movies the cast and director stephen hereks polished direction pour delightfully piquant wine from aged bottles"
pos. sentiment: 0.97 %
neg. sentiment: 0.03 %
---------------------------------------------

Review: "this is the case of a pregnant premise being wasted by a script that takes few chances and manages to insult the intelligence of everyone in the audience"
pos. sentiment: 0.02 %
neg. sentiment: 0.98 %
©KI Tutorials

One Comment

  1. Mark

    Thanks for your blog, nice to read. Do not stop.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert