word-embeddings

Wenn Wörter und ganze Texte als Input für einen Algorithmus oder ein neuronales Netz verwendet werden sollen, stößt man schnell auf folgendes Problem:

Wie können Wörter auf sinnvolle Art und Weise durch Zahlen repräsentiert werden, sodass verschiedene Programme sie weiter verarbeiten können?

Welche Art und Weise dabei sinnvoll ist, hängt natürlich von der Problemstellung ab. Wir stellen im folgenden einige gängige Methoden vor, insbesondere solche, die sich für die Arbeit mit neuronalen Netzen bewährt haben.

Bag-Of-Words (BOW)

Der einfachste Ansatz ist der Bag-Of-Words (BOW)-Ansatz: Nach einer initialen Bereinigung des gesamten Text-Korpus von Sonderzeichen, wird ein Wörterbuch aller vorkommenden Wörter erstellt. Meistens wird dieses Wörterbuch absteigend nach der Zahl des Vorkommens sortiert, und jedem Wort wird eine Zahl zugeordnet. Die Zahl Null wird dabei nicht verwendet, da sie später für Wörter verwendet wird, welche nicht im Wörterbuch vorhanden sind (Out-Of-Vocabulary, OOV). Das heißt die Zahl 1 repräsentiert beim BOW Ansatz das Wort, welches am häufigsten vorkommt, die Zahl 2 das zweithäufigste, und so weiter.

Mit Hilfe dieses Wörterbuchs wird also jedem im Text-Korpus existierendem Wort eine Zahl zugeordnet. Dies kann für bestimmte einfache Aufgaben bereits ausreichen. Der Bag-Of-Words-Ansatz hat jedoch folgenden Nachteil:

Die Größe der Zahl steht in keinem Zusammenhang mit der Bedeutung des Wortes. Als Input für ein neuronales Netz kann daher pro Wort nur ein One-Hot-Encoded Vektor verwendet werden, der ebenso lang ist, wie das Wörterbuch Wörter enthält. Dabei entstehen schnell Vektoren mit einer Länge von über 100.000, die jeweils nur eine 1 und sonst nur Nullen enthalten. Solche sogenannten Sparse Vectors können es neuronalen Netzen sehr schwer machen zu lernen und sorgen für hohe Komplexität. Dies kann mit anderen Methoden vermieden werden.

Unsupervised Word Vectors – Word2Vec, GloVe

Idealerweise soll die mathematische Darstellung eines Wortes auch die Bedeutung dieses Wortes im Kontext anderer Wörter repräsentieren.

Ein viel genutzter Ansatz, um dies zu erreichen, ist der, einen Algorithmus alle im Text-Korpus vorhandenen Wörter anhand ihres Vorkommens und der sie umgebenden Wörter so in einem multidimensionalen Raum anzuordnen zu lassen, dass Wörter, die häufig in ähnlichen Kontexten auftauchen, auch einen ähnlichen Vektor haben. Solche Algorithmen verwenden das sogenannte Unsupervised Learning, d.h. sie suchen ohne externe Vorgaben selbständig das Repräsentations-Modell, welches die Abweichungen zwischen verwandten Wörtern minimiert.

Das Ergebnis ist eine Vektor-Repräsentation für jedes im Text-Korpus enthaltene Wort. Dieser Vektor hat je nach Modell zwischen 100 – 300 Dimensionen und ist damit deutlich weniger komplex als z.B. ein One-Hot-Encoded BOW Vektor mit 100.000 Dimensionen. Vor allem aber repräsentiert jeder Wort-Vektor auch zumindest ansatzweise die semantische Bedeutung des Wortes im Kontext. So kann man mit vortrainierten Word2Vec oder GloVe Modellen z.B. Arithmetik mit Wörtern umsetzen:

So ergibt der Vektor für das Wort KÖNIG minus dem Vektor für das Wort MANN plus dem VEKTOR für das Wort FRAU tatsächlich den Vektor für KÖNIGIN. Dies natürlich nicht exakt, aber der Vektor für KÖNIGIN ist der dem Ergebnis am nächsten liegende Vektor und kann daher eindeutig als Ergebnis ermittelt werden.

KÖNIG - MANN + FRAU = KÖNIGIN

Ebenso funktioniert z.B.:

BERLIN - DEUTSCHLAND + FRANKREICH = PARIS

Die Modelle enthalten also tatsächlich eine relativ sinnvolle Repräsentation der Bedeutung von Wörtern. Natürlich ist diese Bedeutung nicht umfassend und bezieht sich nur auf einzelne Wörter und nicht auf Wort-Rollen oder gar ganze Passagen. Das praktische Vektor-Format kann jedoch von neuronalen Netzen aller Art gut verarbeitet werden und Word2Vec, GloVe und andere vortrainierte Modelle sind daher die Basis für viele aktuelle Anwendungen.

Der Nachteil von Unsupervised Word Vectors ist, dass man einen sehr sehr großen und möglichst „sauberen“ Text-Korpus benötigt, um eine sinnvolle Vektor-Repräsentation zu generieren. Zudem sind die Algorithmen sehr rechenintensiv. Für einzelne Projekte ist dies meistens nicht umsetzbar, da schlicht das für ein sinnvolles Training benötigte Datenvolumen fehlt.

Bei der Verwendung von vortrainierten Modellen wie Word2Vec und GloVe besteht dann das Problem, dass auch diese Modelle nur Wörter aus ihrem Korpus kennen – alle Wörter, die beim Training nicht vorhanden waren, erhalten einen Null-Vektor. Dies kann insbesondere für Spezial-Gebiete mit eigenem Jargon entsprechend schwierig sein. Wenn z.B. ein Projekt im Bereich der Krankenversicherung umgesetzt werden soll, und die vortrainierten Modelle wichtige Wörter wie z.B. Krankentagegeld, Zahnzusatzversicherung etc. nicht kennen und dafür Null-Vektoren vergeben, wird es auch die beste neurale Netzwerk-Architektur sehr schwer haben, die gewünschten Inhalte zu lernen.

Ein weiterer Nachteil ist die von vortrainierten Modellen benötigte Speicherkapazität im Arbeitsspeicher: Um einen schnellen Zugriff auf die Wortvektoren zu haben, muss das komplette Wörterbuch inkl. der zugehörigen Vektoren in-Memory vorhanden sein. Dies beansprucht schnell 1-2 GB RAM nur für das Vorhalten des Modells. Einige Modelle wie z.B. spaCy sind daher dazu übergegangen, die Word Vectors nachgelagert von einem Convolutional Neural Network (CNN) lernen zu lassen – dann muss nur das CNN-Modell geladen werden und dieses erstellt dann für jedes Wort auf Anfrage den gewünschten Vektor. Eine Alternative zu Word2Vec und Co sind Supervised Word Vectors.

Supervised Word Vectors – Tensorflow Embedding

Eine Alternative zu den mit Unsupervised Learning trainierten Modellen zur Repräsentation von Wörtern in einem Vektor-Raum sind die Supervised Word Vectors. Bereits mit einem verhältnismäßig kleinem Korpus lassen sich hiermit insbesondere im Bereich der Text-Klassifizierung sehr gute Ergebnisse erzielen. Wie bei allen Supervised Learning Methoden wird ein vorklassifizierter Trainings-Datensatz benötigt. Damit kann dann ein sogenannter Embedding Layer eines neuronalen Netzes darauf trainiert werden, den Vektor für jedes Wort möglichst so zu wählen, dass er möglichst nah an den Klassen liegt, in denen das Wort häufig vorkommt und weniger nah an Klassen, in denen es wenig oder gar nicht vorkommt. Die Open Source Bibliothek Tensorflow von Google bietet z.B. einen solchen trainierbaren Embedding Layer.

Der so gelernte Wort Vektor enthält also Informationen darüber, wie wahrscheinlich es ist, dass dieses Wort im Rahmen einer Klasse verwendet wird. Zur Klassifizierung kann man dann z.B. die Vektoren aller Wörter eines Textes einfach addieren und durch die Zahl der Wörter teilen – dieser Ansatz ist erstaunlich effektiv und robust. Natürlich kann man aber die so generierten Vektoren auch als Input für ein Recurrent Neural Network (RNN) wie z.B. ein LSTM verwenden, und so jedes Wort einzeln und in der richtigen Reihenfolge einlesen und so das RNN die Klassifizierung lernen lassen.

Ausblick – Textverarbeitung auf Buchstaben-Ebene

In der Forschung wird intensiv daran gearbeitet, anstatt von Wörtern, nur noch einzelne Buchstaben als Input für neuronale Netze zu verwenden. Dies funktioniert in einigen Bereichen bereits sehr gut. So lassen sich z.B. auch neue Texte dynamisch generieren, d.h. ein neuronales Netz kann Texte Zeichen für Zeichen einlesen und den darauf folgenden Text Zeichen für Zeichen neu generieren. Solche Sequence-To-Sequence Modelle werden z.B. im Bereich der Übersetzung von Sprachen verwendet, sollen zukünftig aber z.B. auch in Chat-Systemen zum Einsatz kommen.