Text Mining mit R

R ist nicht nur ein mächtiges Werkzeug zur Analyse strukturierter Daten, sondern eignet sich durchaus auch für erste Analysen von Daten, die lediglich in textueller und somit unstrukturierter Form vorliegen. Im Folgenden zeige ich, welche typischen Vorverarbeitungs- und Analyseschritte auf Textdaten leicht durchzuführen sind. Um uns das Leben etwas leichter zu machen, verwenden wir dafür die eine oder andere zusätzliche R-Library.

Die gezeigten Schritte zeigen natürlich nur einen kleinen Ausschnitt dessen, was man mit Textdaten machen kann. Der Link zum kompletten R-Code (.RMD) findet sich am Ende des Artikels.

Sentimentanalyse

Wir verwenden das Anwendungsgebiet der Sentimentanalyse für diese Demonstration. Mittels der Sentimentanalyse versucht man, Stimmungen zu analysieren. Im Prinzip geht es darum, zu erkennen, ob ein Autor mit einer Aussage eine positive oder negative Stimmung oder Meinung ausdrückt. Je nach Anwendung werden auch neutrale Aussagen betrachtet.

Daten einlesen

Datenquelle: ‘From Group to Individual Labels using Deep Features’, Kotzias et. al,. KDD 2015

Die Daten liegen als cvs vor: Die erste Spalte enhält jeweils einen englischen Satz, gefolgt von einem Tab, gefolgt von einer 0 für negatives Sentiment und einer 1 für positives Sentiment. Nicht alle Sätze in den vorgegebenen Daten sind vorklassifiziert.

Wir lesen 3 Dateien ein, fügen eine Spalte mit der Angabe der Quelle hinzu und teilen die Daten dann in zwei Datensätze auf. Der Datensatz labelled enthält alle vorklassifizierten Sätze während alle anderen Sätze in unlabelled gespeichert werden.

Wir haben nun 3000 vorklassifizierte Sätze, die entweder ein positives oder ein negatives Sentiment ausdrücken:

Textkorpus anlegen

Zuerst konvertieren wir den Datensatz in einen Korpus der R-Package tm:

Wir können uns nun einen Eindruck über die Texte verschaffen, bevor wir erste Vorverarbeitungs- und Säuberungsschritte durchführen:

  • Fünf Dokumente mit negativem Sentiment, die das Wort “good” enthalten: Not a good bargain., Not a good item.. It worked for a while then started having problems in my auto reverse tape player., Not good when wearing a hat or sunglasses., If you are looking for a good quality Motorola Headset keep looking, this isn’t it., However, BT headsets are currently not good for real time games like first-person shooters since the audio delay messes me up.
  • Liste der meist verwendeten Worte im Text: all, and, are, but, film, for, from, good, great, had, have, it’s, just, like, movie, not, one, phone, that, the, this, very, was, were, with, you
  • Anzahl der Worte, die nur einmal verwendet werden: 4820, wie z.B.: ‘film’, ‘ive, ’must’, ‘so, ’stagey’, ’titta
  • Histogramm mit Wortfrequenzen:

Plotten wir, wie oft die häufigsten Worte verwendet werden:

Vorverarbeitung

Es ist leicht zu erkennen, dass sogenannte Stoppworte wie z.B. “the”, “that” und “you” die Statistiken dominieren. Der Informationsgehalt solcher Stopp- oder Füllworte ist oft gering und daher werden sie oft vom Korpus entfernt. Allerdings sollte man dabei Vorsicht walten lassen: not ist zwar ein Stoppwort, könnte aber z.B. bei der Sentimentanalyse durchaus von Bedeutung sein.

Ein paar rudimentäre Vorverarbeitungen:

Wir konvertieren den gesamten Text zu Kleinbuchstaben und entfernen die Stoppworte unter Verwendung der mitgelieferten R-Stoppwortliste für Englisch (stopwords(“english”)). Eine weitere Standardoperation ist Stemming, das wir heute auslassen. Zusätzlich entfernen wir alle Sonderzeichen und Zahlen und behalten nur die Buchstaben a bis z:

 

Schlagwortwolke bzw Tag Cloud

Schließlich erzeugen wir eine Tag-Cloud aller Worte, die mindestens 25 mal im Text verwendet werden. Tag-Clouds eignen sich hervorragend zur visuellen Inspektion von Texten, allerdings lassen sich daraus nur bedingt direkte Handlungsanweisungen ableiten:

schlagwortwolke

Word-Assoziationen

Wir können uns für bestimmte Worte anzeigen lassen, wie oft sie gemeinsam mit anderen Worten im gleichen Text verwendet werden:

  • Worte, die häufig gemeinsam mit movie verwendet werden:

  • Worte, die häufig gemeinsam mit product verwendet werden:


 

Text-Mining

Wir erzeugen einen Entscheidungsbaum zur Vorhersage des Sentiments. Entscheidungsbäume sind nicht unbedingt das Werkzeug der Wahl für Text-Mining aber für einen ersten Eindruck lassen sie sich bei kleinen Datensätzen durchaus gewinnbringend einsetzen:

 

Eine Fehlerrate von über 50% auf den Trainingsdaten für positive Sentiments ist natürlich nicht berauschend und daher testen wir zum Schluß noch Support Vector Machines:

Die Ergebnisse sehen deutlich besser aus, müssten aber natürlich noch auf unabhängigen Daten verifiziert werden, um z. B. ein Overfittung zu vermeiden.

Download-Link zum kompletten R-Code für dieses Text-Mining-Beispiel: https://www.data-science-blog.com/download/textMiningTeaser.rmd

Dr. Dietrich Wettschereck

Dietrich Wettschereck realisiert als programmierender Data Scientist innovative Lösungen für seine Kunden. Mit über 20 Jahren Berufserfahrung im Bereich Machine Learning → Data Mining → Big Data → Analytics kennt er den Wert innovativer Werkzeuge. Letztlich zählt aber die Lösung, nicht die Technologie.

5 replies
  1. Christian KT says:

    Hallo,

    die Einleitung ist sehr gut!
    Der Link zum Download des Codes führt nicht direkt zum Download. Können Sie mir hier den direkten Link zukommen lassen?

    Haben Sie eventuell weitere Tutorials in dem Bereich Text Mining in R?
    Ich bin Student und möchte das mächtige Tool für meine Abschlußarbeit nutzen.

    Viele Grüße,
    Christian

    Reply
  2. Paula says:

    Hallo,
    vielen Dank für das Beispiel. Kann man SVM auch bei sehr langen Texten anwenden ? Als Klassifizierung für den ganzen Text und nicht nur einzelne Wörter?

    Grüße
    Paula

    Reply
    • Dietrich Wettschereck
      Dietrich Wettschereck says:

      Hallo,
      aber natürlich kann man SVM’s auch für lange Texte anwenden. In der Tat ist es meine Erfahrung, dass SVMs bei sehr kurzen Texten (sagen wir weniger als 20 Worte) nicht ganz so gut sind. Bei sehr, sehr langen Texten (sagen wir als 10 Seiten) sollte man vermutlich den Text auch in Abschnitten klassifizieren, da längere Texte selten nur ein Thema abdecken. Aber das kommt natürlich auf den Anwendungsfall an.
      Grüße,
      Dietrich

      Reply
  3. Paula says:

    Hallo,
    mir ist noch nicht ganz klar wo man testet. Benutze ich nun als Testdaten die Trainingsdaten? Ich könnte doch zum Beipsiel oben nur die Daten von amazon und imdb nutzen und das Modell dann an yelp testen. Habe das leider nicht hinbekommen. War aber auch ein langer Tag…
    Grüße

    Reply
    • Dietrich Wettschereck
      Dietrich Wettschereck says:

      Hallo,
      Testdaten sollten immer unabhängig von den Trainingsdaten sein. Ob das auch Cross-Domain funktioniert hängt aber von der Ähnlichkeit der Daten ab. Wenn es sich immer um Movie-Reviews handelt, dann sollte das funktionieren. Wenn es sich aber bei den Amazondaten um Bookreviews und bei imdb um Filme handelt, wird das vermutlich nicht so gut funktioneren.
      Im Normalfall würde ich pro Domaine einen Teil der Daten als Trainingsdaten nehmen und einen anderen Teil als Testdaten. Z.B. könnte man nach dem Datum des Reviews oder (vermutlich sauberer) nach einzelnen Filmen oder Büchern trennen. Also z.B. alle Reviews zu den Star Wars Filmen zu den Trainingsdaten und alle Reviews zu “Das 5. Element” zu den Testdaten packen. Hier kommt es etwas auf das Anwendungsszenario an.

      Reply

Leave a Reply

Want to join the discussion?
Feel free to contribute!

Leave a Reply

Your email address will not be published. Required fields are marked *

21501 Views