embarc logo
embarc logo

Anwendungen für Machine Learning: Text

Oliver Zeigermann Oliver Zeigermann
19.06.2020

Lesezeit: 11 Minuten

Wie finden Sie mit Machine Learning in einem Wust von Texten die für Sie relevanten Informationen?

Bei der Informationsbeschaffung ist in der heutigen Zeit nicht mehr der Mangel an Information das Problem, sondern aus der Vielzahl von Quellen die relevanten Informationen herauszusuchen. Derartige Probleme ergeben sich besonders bei der Verarbeitung vieler von der Sache her ähnlicher Quellen, seien es Wissenschaftliche Artikel, Gesetzestexte oder Anträge bei einer Behörde.

In diesem Blog-Post wird es um die unterschiedliche Möglichkeiten zur Textanalyse gehen. Dazu werden wir

  1. wichtige Begriffe in Texten finden (noch ohne Machine Learning)
  2. Themen in einer Serie von Texten automatisch identifizieren
  3. durch tieferes Textverständnis Kommentare bewerten
  4. und uns weitere interessante Anwendungen ansehen

Im Bereich der datengetriebenen Entwicklung gehen wir so ein Problem nicht analytisch, sondern getrieben durch Text-Beispiele an. Dies ist in der Grafik aus unserem Jubiläums-Spicker dargestellt:

Datengetriebene Entwicklung
Datengetriebene Entwicklung (aus embarc Spicker 10)

Wir sehen uns dies exemplarisch anhand einer Blog-Series https://www.embarc.de/micro-moves/ meines Kollegen Stefan Zörner an. In dieser Serie beschreibt er am Beispiel einer Schachplattform eine ganze Reihe von Herausforderungen wenn man seine Anwendung in kleineren, abgegrenzten Teilen entwickeln möchte.

Wichtige Begriffe finden

Um abzuschätzen, on ein Artikel für uns interessant sein kann, kann man mit einer Word-Cloud ein sehr einfaches Verfahren für einen ersten Eindruck eines Texts anwenden:

Dies erlaubt uns die Python-Bibliothek WordCloud in einer einzigen Zeile:

wordcloud = WordCloud(max_words=20, 
                      background_color="black", 
                      colormap="Paired").generate(text)
Einfache Worthäufigkeit

In dem ersten Ergebnis bekommen wir schon eine Idee vom Thema des Blogposts. Begriffe wie “SPA” oder “UI” geben uns Hinweise auf ein Frontend-Thema. Tatsächlich handelt es sich bei dem untersuchten Text um ein ebensolches Thema. Allerdings sehen wir auch eine Reihe von Wörtern, die nicht sonderlich aussagekräftig, aber dennoch sehr häufig sind.

Worthäufigkeit ohne Stop-Wörter

Durch eine Liste sogenannter Stop-Wörter werden diese Wörter wie “der”, “die”, “ist”, “auf” etc. bei der Analyse ausgelassen. Solche “Stop-Wörter” bekommen wir in vielen Bibliotheken mitgeliefert, man kann diese aber um zusätzliche Wörter erweitern. So macht man das in https://www.nltk.org/, einer klassischen Bibliothek für Sprachverarbeitung:

import nltk
nltk.download('stopwords')
stopwords = set(nltk.corpus.stopwords.words('german'))
stopwords.update(['sogar', 'mal', 'statt', 'lässt', 
                  'zeigt', 'geht', 'abbildung'])
wordcloud = WordCloud(stopwords=stopwords, 
                      max_words=20, 
                      background_color="black", 
                      colormap="Paired").generate(text)

Wort-Häufigkeit im Kontext einer Serie

Während der gezeigte Ansatz durch seine Einfachheit besticht und bereits gute Ergebnisse liefert, geht es dennoch noch besser. Folgende Schwierigkeiten tauchen auf

  1. Wörter die innerhalb einer Blogserie immer wieder auftauchen, werden auch bei jedem einzelnen Artikel überbetont. Man möchte aber eher die Wörter hervorheben, die in den anderen Teilen der Blogserie nicht so häufig vorkommen.
  2. Ein wirkliches Textverständnis liegt nicht vor, so werden auch Begriffe, die für uns keinen direkten Sinn machen und eher von technischer Natur sind hervorgehoben.

Das zweite Problem ist deutlich schwerer zu lösen und daher werden wir uns hier zuerst dem anderen widmen. TF-IDF ist eine statistische Methode, die nach wie vor bestimmt wie wichtig ein Wort in einem einzelnen Text ist, das aber im Kontext eines ganzen Korpus von Texten. Dabei wird die Häufigkeit eines Worts innerhalb eines Texts mit der Gesamthäufigkeit des Worts im Korpus normalisiert. Das heißt, wenn das Wort insgesamt häufig ist wird seine Bedeutung abgeschwächt. Dadurch bekommt man typischerweise schon sehr gute Ergebnisse, wie man im nächsten Bild sehen kann:

Worthäufigkeit im Kontext
Worthäufigkeit im Kontext (TF-IDF)

Durch das relativ einfache Verfahren einer Word-Cloud mit relativen Worthäufigkeiten (TF-IDF) ist bereits eine gute Einschätzung über das Thema eines Texts möglich.

Bis zu dieser Stelle kann man sich streiten, ob die gezeigten Ansätze überhaupt zum Thema “Machine Learning” gehören. Das reine Zählen von Wörtern kann man im strengen Sinne nicht einmal als datengetrieben ansehen. TF-IDF hingegen beruht auf einem ganzen Text-Korpus und man kann argumentieren, dass sich die Analyse nicht starr aus dem Algorithmus, sondern aus der vorliegenden kompletten Blogserie ergibt. Hier haben wir es also zumindest mit einem datengetriebenen Ansatz zu tun.

Machine Learning vs KI
Machine Learning vs KI

Bei unserer Darstellung fallen statistische Methoden unter “Traditionelles” Machine Learning. Das mag anmaßend klingen, aber die Übergänge sind in der Tat fließend. Gerade im nächsten Bereich den wir uns ansehen kommen viele Methoden aus dem statistischen Umfeld und sind zum Teil seit 100 Jahren oder noch länger bekannt.

Themen der Serie automatisch identifizieren

Nun begeben wir uns in einen Bereich, den man zum Unsupervised Learning zählt. Unsupervised Learning ist eine von drei Arten des Machine Learnings und die Zusammenhänge sind wieder durch eine Grafik aus unserem Spicker dargestellt

Machine Learning Strategien
Machine Learning Strategien

Jetzt interessieren wir uns nicht mehr für einen einzelnen Text der Serie, sondern welche Themen insgesamt behandelt werden. Wir nehmen dafür an, dass sich jeder unserer Texte aus einer Reihe von Themen (Topics) zusammensetzt und die wichtigsten Wörter in einem Dokument wiederum zu einem dieser Themen gehören. Um beurteilen zu können, ob die Serie für uns interessant sein kann ist die Frage: Was sind die Themen?

Für die Erkennung der Themen müssen wir die Anzahl der Themen vorgeben und bekommen pro Thema die Liste der wichtigsten Wörter. Das Ergebnis kann man in der nächsten Grafik sehen. Dabei sind die Titel von uns durch eine Interpretation der Themen hinzugefügt worden. Ein tieferes Verständnis der Themen liegt also bei diesem Ansatz nicht vor. Dennoch sind die Ergebnisse durchaus ansehnlich:

Automatisch erkannte Themen
Automatisch erkannte Themen

Für den Aufbau eines Machine Learning Ansatzes ist es dabei wichtig, was die Eingabe und was die Ausgabe ist. Dazu kommt ein gewisses Maß an Magie, die beschreibt auf welche Weise das eine in das andere überführt werden soll. In diesem Fall trainieren wir das System einzig auf den verfügbaren Texten und das trainierte Modell liefert uns die passenden Themen. Dabei wird aber kein größerer Satz an Trainingsdaten mit passenden Themen benötigt, wie es beim Supervised Learning der Fall wäre, sondern eben einfach nur beliebige Texte. Dies wird in der folgenden Grafik veranschaulicht

Latent Dirichlet Allocation

Wir haben hier mit LDA (Latent Dirichlet Allocation) eine der aufwendigenderen Methoden benutzt. Sie ist in scikit-learn (https://scikit-learn.org), einer der wichtigsten Bibliotheken für Machine Learning, umgesetzt. Dabei wird eine über viele Methoden einheitliche API verwendet:

from sklearn.decomposition import LatentDirichletAllocation

lda_model = LatentDirichletAllocation(n_components = 10)
lda_model.fit(tfidf_vectors)
topics = lda_model.components_

Anders als einfachere Verfahren wie Non-negative matrix factorization (NMF), welches ebenfalls Themen liefert, ist dieses Verfahren iterativ und braucht daher bei einem größeren Text-Korpus viel Zeit. Allerdings sind die Ergebnisse auch häufig deutlich überlegen.

Tieferes Text-Verständnis

Wie erwähnt hat keines der bisher erwähnten Verfahren ein wie auch immer geartetes tieferes Verständnis für die vorliegenden Texte. Ohne dass wir uns in philosophischen Details verlieren wollen, was Verstehen denn eigentlich bedeutet, kann man zumindest Anhaltspunkte definieren. So war LDA z.B. nicht in der Lage ein Thema mit einer Überschrift zusammenzufassen.

Dies ist anders bei der von Google im Jahr 2017 eingeführte Transformer-Architektur. Diese basiert auf einer völlig anderen und deutlich leistungsfähigeren Grundlage, dem so genannten Deep Learning. Hierbei werden viele Schichten von sogenannten künstlichen Neuronen hintereinander geschaltet, um so Fähigkeiten des Gehirns zu simulieren. Damit ist es möglich, Übersetzungen zu machen, Antworten auf Fragen zu geben, und Texte zusammenzufassen.

In unserem Beispiel nutzen wir diese Fähigkeiten, um bei Kommentaren zu den Blog-Posts festzustellen, ob ein Kommentar eher positiv, negativ, oder neutral ist. Das kann helfen, um z.B. bei negativen Kommentaren schneller reagieren zu können. Dies sind unsere Ergebnisse für echte Kommentare:

Kommentar Automatische Bewertung
Habe irgendwie genau die gleichen Probleme wie ihr: Diagramme zeichnen ohne richtiges Modell dahinter und daraus resultierender Probleme. Negativ
Was heißt denn Springergabel auf englisch :-) Knight fork? Viele Grüße Neutral
Hallo Stefan, vielen Dank für das anschauliche Beispiel für Microservices. Positiv

Das hier gezeigte BERT-Modell nutzt eine Mischung aus Unsupervised und Supervised Learning. In einer ersten, allgemeinen Phase wird ein Modell trainiert indem in den zum Training benutzten Texten immer ein gewisser Anteil von Wörtern weggelassen wird und diese dann vom Modell erraten werden müssen. Da diese nicht von uns vorgegeben werden, handelt es sich um einen Ansatz zum Unsupervised Learning.

Danach werden bei unserem Anwendungsfall Paare von Texten und mit bekannten Sentimenten eingefüttert. Dabei ist die Hoffnung, dass sich bei genügend Texten, die auch allgemein genug sind, ein Generalisierungseffekt einstellt. Das bedeutet, dass das trainierte Modell auch auf bisher unbekannten Texten gut funktioniert. Damit haben wir dann auch den erwähnten Anteil an Supervised Learning.

Wir nutzen die Implementierung von https://huggingface.co/, die Modelle für die beiden bekanntesten Deep Learning Frameworks Pytorch (Facebook: https://pytorch.org/) und TensorFlow (Google: https://www.tensorflow.org/) bietet.

Dabei haben wir ein bereits trainiertes Modell (https://github.com/oliverguhr/german-sentiment) verwendet, da sowohl das Besorgen und Aufbereiten der Texte als auch das Training aufwändig sind. Die Ergebnisse gehen weit über Triviales hinaus, so werden zum Beispiel Negationen relativ sicher erkannt und auch die Bewertung für den Text unten richtig mit “positiv” ermittelt.

from transformers import AutoTokenizer, 
                         AutoModelForSequenceClassification

tokenizer = AutoTokenizer
    .from_pretrained("oliverguhr/german-sentiment-bert")
model = AutoModelForSequenceClassification
    .from_pretrained("oliverguhr/german-sentiment-bert")

model
    .predict_sentiment(['Ich habe einen Ihrer Kurse besucht 
                         und wurde nicht enttäuscht'])

Was ist noch spannend?

Auf dieser Seite kann man sich direkt im Browser ohne Installation Fragen zu einen beliebigen, aber englischen Text beantworten lassen. Aus dem Wikipedia über künstliche Intelligenz habe ich einen Teilabschnitt über die Frage ausgeschnitten, warum KI nicht die Forschritte macht, die man sich erhofft hat:

Possible explanations for the slow progress of AI research from Wikipedia
Possible explanations for the slow progress of AI research

Anhand eines großen Satzes von Paaren von Fragen mit passenden Antworten wurde ein BERT-Model spezialisiert, das Fragen nun auch für Texte beantworten soll, die nicht zu den Trainingsdaten gehört haben. Das funktioniert für unseren Text ziemlich gut, allerdings nur solange man wohlwollende Fragen stellt:

Question: Can machines be creative

Ein ähnliche Architektur (GPT-2) führt auf Reddit ganze Unterhaltungen, die etwas exzentrisch, aber nicht völlig unrealistisch wirken. Diese Art Modell ist darauf spezialisiert ganze Texte anhand einer Eingabe, z.B. einer offen gestellten Frage zu generieren. Hier eine kleine Unterhaltung über den Wahrheitsgehalt der Bibel, die zumindest ich nicht ohne weiteres von einer Diskussion im Rahmen meines Studiums der Philosophie hätte unterscheiden können

If the Bible is not 100% accurate in every detail, how can it be the word of God?

Fast noch ein wenig gruseliger ist die Anwendung auf eigene Tweets oder die Tweets von jemand anderem die/der viel auf Englisch schreibt (Deutsch klappt leider nicht gut). Die folgenden Sätze sind Vervollständigungen von My plan for the coming year is und sind mit diesem Script erzeugt

GPT-2 on DJCordhose Tweets

Die ergebnisse sind fast ein wenig gruselig, da man deutlich einige Themen meiner Tweets wieder findet und oft auch den Eindruck bekommt der meint doch etwas auch wenn nicht ganz klar wird, was das sein könnte.

Das wahrscheinlich stärkste Sprachmodel ist GPT-3. Dieses Modell ist riesig (bis zu 175 Milliarden Parameter), lernt aber anhand von allgemeinen Texten einfache Rechenaufgaben zu lösen und bisher unbekannte Wörter durch Beispiele zu erlernen. Dabei werden dem Modell erst allgemeine aus dem Internet gescrapte Texte im Gesamtumfang von mehr als einer Billion Wörtern, und dann in einer zweiten, spezialisierten Phase entweder nur wenige (few-shot) oder gar nur ein Beispiel (one-shot) zum lernen gegeben. Das geht sogar so weit, dass es lernen kann, Wörter zu benutzen, die es gar nicht gibt.

GPT-3 kann ausgedachte Wörter lernen
Beispiel aus dem Paper für GPT-3 (weitere tolle Beispiele im Paper)

Momentan braucht das Training eines solchen Modells noch 10,000 GPUs der Spitzenklasse und 300,000 CPU-Kerne, in näherer Zukunft wird es hier also keinen Einsatz auf breiter Flächen geben.

Zusammenfassung

Oft bieten bereits relativ einfache Mittel einen Mehrwert im Bereich der Text-Analyse. Dazu zählen statistische Verfahren zur Zählung von Worthäufigkeiten. Dabei müssen wir uns also nicht einmal in den Bereich des Machine Learnings vorwagen.

Komplexere Methoden aus dem Bereich des Unsupervised Learnings erlauben eine Analyse nach abgehandelten Themen und erlauben trotz ihrer Einfachheit oft bereits erstaunliche Einblicke. Schließlich bieten vortrainierte Sprachmodelle wie BERT oder GPT2 ein hohes Maß an Textverständnis und können an eigene Anforderungen angepasst werden. Dies ist z.B. möglich für Sentiment-Analyse, Übersetzungen, Frage-Antwort-Systeme und Text-Vervollständigung bis hin zum Erzeugen kompletter Abhandlungen zu einem gegebenen Thema.

Derartige Modelle brauchen jedoch auch Ressourcen in einer völlig anderen Größenordnung und kommen kaum ohne eine Leistungsfähige GPU aus. Zudem liegen viele der vortrainierten Modelle liegen nur in Englischer Sprache vor, sodass die Hauptaufgabe in der Beschaffung, Aufbereitung und dem Training mit einem deutschen Vokabular besteht.

Wer jetzt noch nicht genug hat, sich mit Neuronalen Netzen auskennt und bereit ist für einen tieferen Einstieg, kann hier über die Transformer-Architektur im allgemeinen und hier mehr über BERT lernen. Dieser Artikel fast aus dem Paper zusammen, warum die Entwickler des für uns eindrucksvollen GPT-3 Modells sich in einer Sackgasse sehen.

Wenn Sie Fragen oder Anregungen zu diesem Thema oder andern aus dem Bereich Machine Learning haben oder Sie sich einen weiteren Artikel in diesem Bereich wünschen, schreiben Sie mir per Email, oder über unser Kontakt Formular.