How to: Texte mit Python analysieren Teil 1

Text Mining. Was ist das? Viele kennen inzwischen diesen Begriff. Es hat was zu tun mit Data Mining. Da sind wir uns sicher. Aber wie genau kann ich Informationen aus einer großen Menge an Texten herauskristallisieren und vor allem, wie kann ich diese Texte evtl. auch in Gruppen einteilen und bestimmen was sie zum Thema haben ohne alle Texte selber lesen zu müssen?

 

Diesen Fragen werden wir uns nun in dem heutigen Beitrag stellen. Am Ende solltet ihr ein Verständnis davon haben:

  • Was Unsupervised & Supervised Algorithmen sind
  • Was das PreProcessing bei Text Mining beinhaltet
  • Welche Python Packages sich dafür besonders eignen

Wie Ihr seht braucht man da evtl. schon etwas Vorwissen zu grundsätzlichen Themen in Python. Also ich werde nicht erklären was Funktionen, Python Packages usw. sind sondern wirklich auf die spezifischen Fragen beim Thema Text Mining eingehen. Wenn ihr die Grundlagen noch braucht lest vorher lieber einen der folgenden Beiträge: Python Umgebung auf eigenem Rechner einrichten oder Pandas, Import/Export und Grundlagen der Datenmodellierung. Dies ist nur der erste Teil von zwei Beiträgen der den theoretischen Kleinkram grundsätzlich erklärt. Die praktischen Beiträge wird es in einem 2. Beitrag geben. Let’s Go



 

Was sind Supervised und Unsupervised Algorithmen?

Beim Thema Machine Learning trifft man eigentlich immer auf diese zwei Einteilungen. Diese sind auch extrem wichtig, da fundamentalte Unterschiede bei der Vorgehensweise und bei der Interpretation vorhanden sind.

Supervised Machine Learning: In diesen Fällen gibt es bereits Daten die schon klassifiziert sind. Also wir haben einen bestehenden Datenblock bei dem jeder einzelne Datensatz bereits einer Kategorie zugeordnet ist ( z.B. einem Thema). Nun trainieren wir einen Machine Learning Algorithmus darauf, anhand dieser bereits klassifizierten Datensätze auch neue Datensätze einem der Themen zuzuordnen. Wenn meine Daten z.B. Nachrichtenartikel sind zu 10 verschiedenen Themen, dann könnte ich wenn ich einen neuen Datensatz bekomme mithilfe des trainierten Machine Learning Modells diesen Datensatz ebenfalls in eines der Themen zuordnen.

  • Häufig angewandte Algorithmen sind: Decision Tree, Random Forest Tree, Naive Bayes Classification und weitere

Unsupervised Machine Learning: In diesen Fällen hat man einen noch unbekannten Datensatz und möchte diesen Explorativ erkunden. Neben klassischen Methoden der deskriptiven Statistik und Regression könnte man mithilfe eines Unsupervised Machine Learning Algorithmus die Daten in verschiedene Cluster einordnen und so bestimmte Zusammenhänge erkunden und entdecken. Diese Cluster könnten dann sogar als Grundlage für die Anwendung eines Supervised Machine Learning Algorithmus dienen.

  • Häufig angewandte Algorithmen in diesem Bereich sind: K-Means, DBSCAN und HDBSCAN



 

So ich hoffe damit ist einigermaßen klar, wo der Unterschied besteht. Beim Text Mining kommt häufig zu aller erst ein Unsupervised Algorithmus zum Einsatz. Darum werde ich mich in dem Beispiel auch auf diesen konzentrieren. Dieser kann verwendet werden um Themenblöcke zu identifizieren und die Texte zu clustern. Ein Supervised Algorithmus könnte im Gegensatz z.B. bei einer Semantik Analyse angewendet werden um die Stimmung eines Textes zu erfassen.

 

Was beinhaltet das Preprocessing bei Text Mining?

Das Preprocessing bei Text Mining ist relativ komplex. Da Texte je nach Quelle sehr unterschiedlich sein können, müssen wir diese irgendwie vereinheitlichen und zusammenfügen. Einen wichtigen Teil spielt dabei das Sprachmodell. Jede Sprache hat eine eigene Grammatik und es wird viel Kontext aus der Grammatik erzeugt. Wir müssen uns also als erstes Gedanken über die Sprache machen, in der die Texte die wir analysieren wollen geschrieben sind. Das zweite was wir uns für eine Analyse an Gedanken machen müssen ist die Textquelle. Also handelt es sich z.B. eher um wissenschaftliche Texte oder um Social Media Beiträge wie von Twitter. Denn die Texte nutzen je nach Art der Quelle auch komplett unterschiedliche Symbole, Wörter etc. Ein wissenschaftlicher Text enthält z.B. relativ selten Emojis oder Hashtags. Zum Glück gibt es für viele Sprachen bereits viele vor trainierte Sprachmodelle die auch viele weitere Möglichkeiten wie die Tokenisierung oder Lemmatas beinhalten.

 

Das führt mich auch direkt zum nächsten Punkt. Haben wir das Sprachmodell ausgewählt geht es nun an das standardisieren der Texte. Das erste ist dabei z.B. das Tokenisieren der Texte. Dabei wird in den Sätzen jedem Wort ein Token zugeordnet. Token sind z.B. „Nomen“ oder „Verb“. Das heißt wir bestimmen nun eindeutig um was für eine Art des Wortes es sich handelt. Wenn das Sprachmodell das ausgewählt wurde nicht ausreichend ist, kann man diese auch ergänzen. Dazu muss man manuell bestimmte Texte „Tokenisieren“. Ein gutes Tool für solche Aufgaben ist z.B. Prodi.gy, welches allerdings nicht kostenlos ist. Kostenlose Alternativen gibt es allerdings ebenfalls um die Annotations von Texten möglichst einfach zu machen. Mein persönlicher Favorit ist Doccano, welches man auf seinem eigenem Server laufen lassen kann und auf Python Django basiert.

Hat man seine Texte Tokenisiert, können diese nun auf ihre Grundformen zurückgebildet werden.Dabei gibt es das sogenannte Stemming und die Lemmatisierung. Beide Verfahren verfolgen das Ziel, die Wörter zu vereinheitlichen und auf ihre Grundformen zurückzubilden. Allerdings werden unterschiedliche Verfahren dabei angewendet.

  • Stemming: Die Endungen von Wörtern werden abgeschnitten, um so einheitlichere Wortbildungen zu kreieren. Als Beispiel werden in der deutschen Sprache unteranderem typische Endungen wie „ing“ und „ung“ abgeschnitten. Dies vereinheitlicht bereits viele Wörter.
  • Lemmatisierung: Hierbei werden die Grundformen der Wörter zurückgebildet. Das erfordert allerdings komplexe Wort Dictionaries die im Sprachmodell enthalten sein müssen oder sonst selbst erstellt werden müssen. Hierbei werden für die Wörter alle Wortformen zugeordnet und wenn nun eine Wortform im Text vorkommt kann diese durch die entsprechende Grundform ersetzt werden. Als Beispiel: In einem Text kommt „ist“ vor und wird durch die Grundform „sein“ ersetzt.

Nach dem Anwenden dieser Verfahren werden noch häufig Stoppwörter aus den Texten entfernt. Also Wörter die sehr häufig vorkommen aber in der Regel keine Informationen für die Aussage des Textes selber bereithalten. Außerdem werden alle Buchstaben z.B. in Lower/Upper Case geändert und Satzzeichen etc. werden entfernt.




Das sind die Grundschritte beim Preprocessing von Texten. Allerdings können je nach Anwendungsfall noch weitere Schritte dazu kommen oder einige auch wegfallen. z.B. könnte man noch eine weitere Liste von Wörtern anwenden die aus den Texten entfernt werden, oder versuchen mit Algorithmen häufige Rechtschreibfehler zu korrigieren etc.  Für unsere Anwendung sollte es erstmal reichen.

 

Welche Python Packages eignen sich dafür?

Ja das ist natürlich jetzt die wichtige Frage, wenn man nun von der Theorie in Richtung Praktische Umsetzung gehen will. Im Grunde gibt es in Python zwei Packages die bei der Anwendung sehr verbreitet sind und sich für die oben genannten Schritte eignen.

Das NLTK Package ist sehr mächtig und erlaubt viele weitere Einstellungen. Allerdings ist es entsprechend komplex und teilweise auch nicht so performant. Es ist entsprechend eher für den wissenschaftlichen bzw. vor allem den lehrenden Einsatz geeignet. Wenn man eher einen produktiven oder wirtschaftlichen Einsatz im Sinn hat, eignet sich vor allem SpaCy. Es ist einfach zu implementieren und relativ leicht an die eigenen Bedürfnisse anpassbar. Ich selbst habe bisher auch vor allem SpaCy angewendet und werde im nächsten Blogbeitrag darauf eingehen wie man das Preprocessing mit SpaCy vornehmen kann und dann die Texte nach Themen Clustern kann.