Von der Schlagzeile zum Trend - mit Natural Language Processing aus Nachrichten Trends ableiten


03.04.2020 von 2020-05-13

https://www.iteratec.de/fileadmin/Bilder/News/iteratec_logo.png
iteratec GmbH
Von der Schlagzeile zum Trend - mit Natural Language Processing aus Nachrichten Trends ableiten

Die Welt der Softwareentwicklung ändert sich schnell und ständig. Den Überblick über die neusten Frameworks und Technologien zu behalten, ist eine schwierige Aufgabe – noch schwieriger ist es, vielversprechende Neuerungen frühzeitig zu erkennen und in den Projektalltag zu integrieren. Genau diese Herausforderungen soll das Projekt Trendanalyse lösen, das wir im Studentenlabor in München entwickelt haben.

Wir nutzen Web-Scraping, um Nachrichtenartikel von über 200 IT-Portalen zu sammeln. Mit Methoden aus dem Natural Language Processing leiten wir aus diesen Daten neue Technologietrends ab. Dabei kommt ein Recommender-System zum Einsatz, das auf Nutzerfeedback basiert und kontinuierlich weiterlernt (user-in-the-loop). Die Ergebnisse werden in einer Web-Applikation visualisiert, mit der sich unsere Mitarbeiter über neue Entwicklungen in der IT-Welt informieren können.

In diesem Blogpost erläutern wir die Schritte – von der Idee bis zur fertigen Webapplikation. Den notwendigen Background in Sachen Machine Learning liefern wir dabei gleich mit.

Datengrundlage schaffen und aufbereiten

Wir wollen Daten aus verschiedenen IT-Portalen zusammentragen und analysieren. Themen, die in den Medien und von Experten besonders viel diskutiert werden, stellen potenzielle Trends dar.

Aus technischer Sicht ist der erste Schritt daher das Scrapen von Inhalten verschiedener Webseiten. Der naive Ansatz wäre es einen Scraper zu programmieren, der jede einzelne Webseite besucht und dort die benötigten Informationen an der richtigen Stelle findet. Bei mehr als 200 globalen Quellen ist dieser Ansatz wenig zielführend – er kostet viel Entwicklungszeit und ist stark fehleranfällig, denn Webseiten ändern sich ständig und jede Änderung an einer Webseite macht ein Update des Scrapers notwendig.

Die Lösung für dieses Problems sind Web-Feeds – diese werden von fast allen Nachrichtenportalen angeboten und erlauben das Herunterladen der Inhalte in einem einheitlichen Format (RSS oder ATOM). Statt der Webseite erhält man eine .xml-Datei, die (etwas vereinfacht) so aussehen kann:

<entry>
  <title>Die Trendanalyse ist live!</title>
  <link href=”http://example.org/ ” />
  <updated>2020−02−01T18:30:02Z</updated>
  <summary>Hier könnte eine kurze Beschreibung stehen</summary>
  <author>
    <name>Max Mustermann</name>
    <email>maxmustermann@example.com</email>
  </author>
</entry>

Aufgrund der einheitlichen Struktur dieser Feeds ist es jetzt möglich, die Nachrichtenartikel zuverlässig zu parsen und die enthaltenen Informationen in einer Datenbank zu speichern. In unserem konkreten Fall speichern wir die Schlagzeile (aus dem <title>-Tag), das Datum der Veröffentlichung (aus dem <updated>-Tag) und den Link zum Artikel (aus dem <link>-Tag). Der Inhalt des Artikels selbst ist in den Feeds oft nicht enthalten – es gibt teilweise eine Zusammenfassung (in dem <summary>-Tag), aber der volle Artikel wird in der Regel nicht mitgeliefert.

Die Rohdaten aus den Webfeeds haben einige Eigenheiten, die wir vor der Weiterverarbeitung in einem Preprocessing-Schritt behandeln müssen. In Portalen wie Stackoverflow oder Reddit reichen User selbst Inhalte ein – teilweise auch mit ungewöhnlichen Schriftzeichen oder Emojis. In deutschen Quellen müssen wir zusätzlich darauf achten, dass Umlaute korrekt behandelt werden.

Das Preprocessing haben wir mit Methoden aus dem Natural Language Toolkit durchgeführt. Als Bereinigungsschritte haben wir kurze Wörter, Stoppwörter (das sind Wörter wie „und“ und „the“, die sehr häufig sind und wenig aussagen), Zahlen und Interpunktionen entfernt. Mit einem regulären Ausdruck wurden alle Zeichen entfernt, die nicht aus dem deutschen oder englischen Alphabet stammen.

ML Pipeline entwickeln

Als nächsten Schritt durchlaufen die vorverarbeiteten Daten dann eine Machine Learning Pipeline, die wie folgt aussieht:

Die Grundidee ist es, aus den mehr als eine Million Schlagzeilen eine kleinere Menge (z. B. 10.000) an Schlagwörtern zu extrahieren, die als Trendbegriffe in Frage kommen. Dazu verwenden wir einen Keyword-Extraction-Algorithmus aus dem unüberwachten Lernen.

Diese Schlagwörter werden klassifiziert (überwachtes Lernen), um für den User besonders interessante Begriffe zu finden. Dabei wird vorheriges User-Feedback in die Klassifizierung mit einbezogen – es handelt sich also um ein Recommender System wie bei Amazon (Sie interessieren sich für Machine Learning? Vielleicht wäre Natural Language Processing auch interessant für Sie…).

Keyword Extraction durchführen

Im ersten Schritt werden potenziell interessante Wörter aus den Daten extrahiert. Dafür gibt es verschiedene Methoden, die wir hier kurz vorstellen möchten.

Zum einen können wir auf statistische Kennzahlen zurückgreifen, zum Beispiel die Anzahl der Nennungen eines Wortes. Dabei werden sehr allgemeine Begriffe bevorzugt, die in vielen Nachrichten vorkommen und für uns daher nicht relevant sind. Ein besseres Maß ist der sogenannte TF-IDF-Wert (engl.: Term Frequency und Inverse Document Frequency), der einerseits beschreibt, wie relevant ein Wort im Kontext einer Schlagzeile ist (Term Frequency) und andererseits, wie spezifisch das Schlagwort im gesamten Datensatz ist (Inverse Document Frequency).

Neben den statistischen Verfahren haben wir graph-basierte Verfahren betrachtet, nämlich RAKE (Rapid Automatic Keyword Extraction) sowie TKG (Twitter Keyword Graph).

Letztendlich hat uns die TKG-Methode überzeugt. Sie wurde speziell für Tweets entwickelt, die eine Länge von maximal 280 Zeichen haben – das kommt unserem Datensatz sehr nahe, denn die meisten Schlagzeilen sind 1-3 Sätze lang und passen genau in dieses Schema.

 

Recommender-System trainieren

Im nächsten Schritt trainieren wir das Recommender-System, um unseren Nutzern interessante Themen vorzuschlagen. Wir verwenden hierfür eine Kombination von Word Embeddings und Gradient Boosting. Mit Word Embeddings erkennen wir die Bedeutung eines Wortes (zum Beispiel: Python ist eine Programmiersprache), mit dem Gradient-Boosting-Modell führen wir die Klassifizierung durch (der User interessiert sich für Python und Machine Learning? Tensorflow ist auch interessant!).

Word Embeddings nutzen?

Zunächst wollen wir das Konzept von Word Embeddings erklären. Word Embeddings sind ein aktives Forschungsfeld im Natural Language Processing. Das Ziel ist es, einem Wort einen reellwertigen Vektor zuzuordnen, der die Bedeutung des Wortes kodiert. Mit diesen Vektoren kann ein Computer gut rechnen, zum Beispiel in einem angeschlossenen Klassifikations- oder Regressionsmodell.

In der Grafik sind exemplarisch zweidimensionale Embeddings für die Wörter „König“, „Königin“ sowie „Mann“ und „Frau“ dargestellt. Es gilt die Beziehung König – Königin = Mann – Frau, das heißt das Geschlecht des Wortes ist im Embedding implizit enthalten.

Der große Durchbruch im Forschungsfeld der Word Embeddings gelang 2013 mit word2vec. word2vec war das erste Word Embedding Modell, das auf neuronalen Netzen basierte und unüberwacht auf großen Datenmengen trainiert wurde. Es legte damit den Grundstein für die rasante Entwicklung im Bereich des Natural Language Processing in den letzten Jahren.

Eine Schwäche von word2vec ist es, dass Embeddings nur für Wörter berechnet werden können, die bereits im Trainingsdatensatz vorkamen (das sogenannte out-of-vocabulary-Problem). Wir wollen aber neue Trends finden, die zum Zeitpunkt des Trainings des Embedding-Modells vielleicht noch nicht in den Medien diskutiert wurden. Wir können dem zwar mit regelmäßigem Nachtrainieren entgegenwirken, haben uns aus diesem Grund aber letztendlich gegen word2vec entschieden.

BERT ist eine neue Lösung aus dem Hause Google, die diese Schwachstelle nicht mehr hat. Zusätzlich können kontextbasierte Embeddings berechnet werden - das Wort „Bank“ im Satz „Ich sitze auf der Bank“ erhält ein anderes Embedding als im Satz „Ich hebe Geld auf der Bank ab“, je nach Bedeutung. BERT wird mittlerweile genutzt, um den Kontext in Suchabfragen mit Google besser zu verstehen und dadurch bessere Resultate zu liefern.

Für uns ist dieses Feature nicht hilfreich, denn wir klassifizieren auf Wort-Ebene, also komplett ohne Kontext. Deshalb haben wir uns gegen das hochkomplexe BERT-Modell entschieden, das selbst in der Basisvariante aus der ursprünglichen Veröffentlichung mehr als 100 Mio. Parameter beinhaltet.
 
Einen guten Mittelweg bietet das von Facebook entwickelte FastText-Modell. Das out-of-vocabulary-Problem wird durch die Verwendung von Teilstrings gelöst. Wenn in den Trainingsdaten die Wörter „Elektro“ und „Mobilität“ vorkommen, so kann für das zusammengesetzte Wort „Elektromobilität“ elegant ein sinnvolles Embedding berechnet werden. Insbesondere im Deutschen hilft das sehr, weil viele zusammengesetzte Substantive verwendet werden. Aus diesem Grund nutzen wir für die Trendanalyse FastText.

Für das Training des FastText-Modells haben wir die Implementierung aus gensim verwendet und damit 100-dimensionale Wort-Vektoren aus unserem Datensatz erzeugt. Um ein Gefühl für die Ergebnisse zu bekommen, haben wir die zu „Python“ und „Trump“ ähnlichsten Wörter berechnet und in der Tabelle aufgeführt (als Metrik dient hier Kosinus-Ähnlichkeit):

Wir können sehen, dass Python korrekt als Programmiersprache eingeordnet wird (und nicht etwa als Schlange im Regenwald). Ähnliche Wörter im Sinne des Embeddings sind andere Programmiersprachen (Java, Javascript, C++) sowie Python Tools (PyQt, PyTorch, PyPI). Auch bei Trump ist die Bedeutung richtig erkannt – es handelt sich um einen Politiker. Einige zu Trump ähnliche Begriffe sind nicht so passend, zum Beispiel „Iceberg“ – das liegt daran, dass unsere Datenquellen aus IT-Portalen kommen und nicht so viele politische Nachrichten beinhalten.

Mit den Word Embeddings können wir nun im nächsten Schritt einen Klassifikator trainieren, der die Vorschläge für neue Trends macht.

 

Trendwörter klassifizieren

In der obigen Abbildung ist das Training des Klassifikators dargestellt. Wir starten mit den Schlagwörtern, für die bereits Nutzerfeedback vorliegt. Mithilfe der Word Embeddings werden die Wörter in 100-dimensionale Vektoren übersetzt. Das Feedback können wir in ein 0-1-Encoding überführen. Mit diesem Feedback-Datensatz trainieren wir einen binären Klassifikator, den wir anschließend speichern. Das gespeicherte Modell wird dann im Betrieb genutzt, um neue potenzielle Trendbegriffe auszuwählen.

Für die Wahl des Klassifikations-Algorithmus gibt es viele Möglichkeiten. Wir beschränken uns hier auf Logistische Regression, Random Forest und Gradient Boosting. Zur Modellauswahl verwenden wir 5-fache Kreuzvalidierung auf einem manuell erzeugten Datensatz mit 400 Datenpunkten. Als Metrik für die Qualität des Klassifikators dient uns Precision, die in unserer Anwendung den Anteil von für den Nutzer relevanten Trendbegriffen in den Vorschlägen beschreibt. In unserem Experiment ergaben sich folgende Performance-Werte:

 

In unseren Trainingsdaten liefert das Gradient-Boosting-Modell die beste Performance. Es ist zu beachten, dass die Performance der Modelle sehr stark von den Charakteristika des zugrundeliegenden Datensatzes abhängt. Dieser Datensatz ist im Betrieb nicht statisch – die Benutzer können jederzeit neues Feedback zu den vorgeschlagenen Trendbegriffen geben. Deshalb ist es wichtig die Modell-Performance im Betrieb zu monitoren, um auf eventuelle Änderungen reagieren zu können.

Mit dem Keyword Extractor (Twitter-Keyword-Graph-Verfahren), den Word Embeddings (FastText) und dem binären Klassifikator (Gradient Boosting) ist die Machine Learning Pipeline nun vollständig. Im nächsten Abschnitt beschreiben wir, wie die Ergebnisse der Pipeline im praktischen Betrieb aussehen.

Ergebnisse

Wir können zwar die Performance des Klassifikators mit einer Metrik greifbar machen, für die gesamte Pipeline ist das aber schwierig. Deshalb haben wir ein weiteres Experiment durchgeführt, das der Benutzung im Betrieb näherkommt.

Als Ausgangspunkt dient derselbe Datensatz, der bereits zur Modellauswahl verwendet wurde (400 manuell gelabelte Trendbegriffe). Basierend auf diesen Daten haben wir 100 neue Trendbegriffe berechnet, für die wir erneut Feedback gegeben haben. Diesen Schritt können wir jetzt wiederholen und beobachten, wie sich die Vorschläge für Trendbegriffe von Iteration zu Iteration verändern.

 

Begriffe mit positivem Feedback sind in der Tabelle fett markiert. Das ist natürlich subjektiv – wir haben uns hier auf Begriffe aus der Softwareentwicklung beschränkt. In der untersten Zeile ist die Anzahl der relevanten Begriffe in den 100 Vorschlägen aufgeführt.

In der ersten Iteration sind die Vorschläge nicht gut – lediglich 5 der 100 Vorschläge wurden als relevant eingestuft. Das System hatte zu wenig Feedback, um die Präferenzen unseres Test-Users zu lernen.

In der zweiten Iteration sind die Vorschläge bereits wesentlich besser – zum einen weisen alle Begriffe einen klaren IT-Bezug auf, zum anderen erhöht sich der Anteil an relevanten Vorschlägen auf 14 von 100.

Dieser Trend setzt sich in der dritten Iteration fort – die Qualität der Vorschläge hat sich abermals verbessert. Wir können hier auch den Einfluss des verwendeten FastText-Embeddings erkennen. Angular wurde sinnvollerweise als relevant eingestuft – im gleichen Schritt kriegen wir den Vorschlag „rectangular“. Offensichtlich basiert das Embedding für das Wort „rectangular“ auf dem Embedding des Teilstrings „Angular“.

Wir sehen, dass das System die Präferenzen eines Users richtig lernt. Nach zwei bis drei Feedback-Iterationen sind wir in der Lage, relevante Technologien in unseren Daten zu erkennen.

Datenvisualisierung und Frontend-Anwendung

Wir haben die für unsere Benutzer relevanten Trends in den Daten mit unserer Machine Learning Pipeline erkannt. Der letzte Schritt ist es, diese Informationen einfach verfügbar zu machen. Dafür haben wir eine Web-Applikation in Angular entwickelt.

Die wichtigste Komponente zur Visualisierung ist ein Liniendiagramm, das unsere Benutzer für die Trendbegriffe erstellen können. Hier wird im zeitlichen Verlauf dargestellt, wie oft ein bestimmtes Wort in den Quellen vorkommt. Zusätzlich gibt es verschiedene Optionen zum Filtern und Vergleichen der Daten, zum Beispiel Erzeugen mehrerer Graphen zum Vergleich oder die Einschränkung des Zeitraums. Das kann zum Beispiel so aussehen:

Hier sehen wir einen Vergleich zwischen Amazon Web Services (AWS) und Azure – beide Cloudplattformen werden in unseren Datenquellen ähnlich häufig diskutiert. Die Schlagzeilen, die die Grundlage für diesen Plot bilden, können auch noch im Detail angeschaut werden. Hier sehen wir einen Auszug der Schlagzeilen für Azure:

Zusätzlich bieten wir noch eine Freitextsuche sowie verschiedene Filtermöglichkeiten an.

Lessons Learned sowie Ausblick

Das Projekt Trendanalyse hat uns fast ein Jahr lang beschäftigt. In dieser Zeit haben wir viel über die Entwicklung eines produktiven Machine-Learning-Systems gelernt.

Wir haben gesehen, wie hilfreich es ist, die User früh in das Projekt zu integrieren. Durch Feedbackrunden mit unserer Marketing-Abteilung im Zweiwochentakt konnten wir viel besser auf deren Wünsche und Vorstellungen eingehen. Der agile Ansatz ist also auch im Bereich Machine Learning erfolgreich.

Außerdem konnten wir sehr von den internen Ressourcen bei iteratec profitieren. Wir haben für das Design des Frontends zahlreiche hilfreiche Rückmeldungen aus unserer UI / UX Community erhalten. Auch die Sicherheitsbetrachtung der Anwendung, die wir intern durchgeführt haben, hat uns viele wichtige Denkanstöße gegeben. Weiterhin waren die Kollegen aus der DevOps Community eine große Hilfe beim Deployment der Anwendung in die Google Cloud.

Seit Ende Januar läuft die Trendanalyse produktiv und hilft unserer Marketing-Abteilung neue Trends in der IT-Welt frühzeitig erkennen. Zusätzlich sehen wir in der Analyse der gesammelten Daten, welche Technologien heute und in der Zukunft relevant sind. Dadurch ist die Trendanalyse auch ein Werkzeug, mit dem wir unsere Kunden besser verstehen können.

Diesen Artikel bewerten
 
 
 
 
 
 
 
0 Bewertungen (0 %)
Bewerten
 
 
 
 
 
 
1
5
0