Unstrukturierte Textklassifikation


12

Ich werde unstrukturierte Textdokumente klassifizieren, nämlich Websites mit unbekannter Struktur. Die Anzahl der Klassen, in die ich klassifiziere, ist begrenzt (derzeit gibt es meines Erachtens nicht mehr als drei). Hat jemand einen Vorschlag, wie ich anfangen könnte?

Ist der Ansatz "Wortsack" hier machbar? Später könnte ich eine weitere Klassifizierungsstufe basierend auf der Dokumentstruktur (möglicherweise Entscheidungsbäume) hinzufügen.

Ich bin mit Mahout und Hadoop einigermaßen vertraut, daher bevorzuge ich Java-basierte Lösungen. Bei Bedarf kann ich auf die Scala- und / oder Spark-Engine (die ML-Bibliothek) umsteigen.

Antworten:


13

Lassen Sie es uns von Grund auf ausarbeiten. Klassifikation (auch als Kategorisierung bezeichnet) ist ein Beispiel für überwachtes Lernen . Im betreuten Lernen haben Sie:

  • Modell - etwas, das sich der internen Struktur Ihrer Daten annähert und es Ihnen ermöglicht, darüber nachzudenken und nützliche Vorhersagen zu treffen (z. B. die Klasse eines Objekts vorherzusagen); Normalerweise verfügt das Modell über Parameter, die Sie "lernen" möchten.
  • Trainings- und Testdatensätze - Sätze von Objekten, die Sie zum Trainieren Ihres Modells (Finden guter Werte für Parameter) und zur weiteren Auswertung verwenden
  • Trainings- und Klassifizierungsalgorithmen - beschreibt zum einen das Lernen des Modells aus dem Trainingsdatensatz und zum anderen das Ableiten der Klasse eines neuen Objekts anhand des trainierten Modells

Nehmen wir nun einen einfachen Fall der Spam-Klassifizierung. Ihr Trainingsdatensatz ist ein Korpus von E-Mails + entsprechenden Labels - "Spam" oder "kein Spam". Der Testdatensatz hat die gleiche Struktur, wurde jedoch aus einigen unabhängigen E-Mails erstellt (normalerweise teilt man seinen Datensatz einfach auf und verwendet 9/10 davon für das Training und 1/10 für das Testen). Eine Möglichkeit, E-Mails zu modellieren, besteht darin, sie als eine Reihe von Wörtern darzustellen. Wenn wir davon ausgehen, dass Wörter unabhängig voneinander sind, können wir den Naive Bayes-Klassifikator verwenden, dh frühere Wahrscheinlichkeiten für jedes Wort und jede Klasse berechnen (Trainingsalgorithmus) und dann den Bayes-Satz anwenden, um die spätere Wahrscheinlichkeit zu ermitteln, dass ein neues Dokument dazu gehört bestimmte Klasse.

Im Grunde haben wir also:

raw model + training set + training algorithm -> trained model
trained model + classification algorithm + new object -> object label

Beachten Sie nun, dass wir unsere Objekte (Dokumente) als eine Tüte voller Wörter dargestellt haben. Aber ist der einzige Weg? Tatsächlich können wir viel mehr aus Rohtext extrahieren. Beispielsweise können wir anstelle von Wörtern, wie sie sind, ihre Stämme oder Lemmas verwenden , lautstarke Stoppwörter verwerfen , POS-Tags von Wörtern hinzufügen , benannte Entitäten extrahieren oder sogar die HTML-Struktur des Dokuments untersuchen. Tatsächlich ist eine allgemeinere Darstellung eines Dokuments (und im Allgemeinen eines Objekts) ein Merkmalsvektor . ZB für Text:

actor, analogue, bad, burn, ..., NOUN, VERB, ADJ, ..., in_bold, ... | label
    0,        0,   1,    1, ...,    5,    7,   2, ...,       2, ... | not spam
    0,        1,   0,    0, ...,    3,   12,  10, ...,       0, ... | spam

Hier ist die erste Zeile eine Liste möglicher Features und nachfolgende Zeilen zeigen, wie oft dieses Feature in einem Dokument vorkommt. ZB im ersten Dokument gibt es kein Vorkommen des Wortes "Schauspieler", 1 Vorkommen des Wortes "Brennen", 5 Substantive, 2 Adjektive und 2 fett gedruckte Textteile. Die letzte Spalte entspricht einer resultierenden Klassenbezeichnung.

Mit Feature Vector können Sie beliebige Eigenschaften Ihrer Texte einbinden. Das Finden guter Funktionen kann jedoch einige Zeit in Anspruch nehmen.

Und was ist mit Modell und Algorithmen? Sind wir an Naive Bayes gebunden? Überhaupt nicht. logistische Regression , SVM , Entscheidungsbäume - um nur einige beliebte Klassifikatoren zu nennen. (Beachten Sie, dass wir in den meisten Fällen "Klassifikator" sagen, wir meinen Modell + entsprechende Algorithmen für Training und Klassifizierung).

Für die Implementierung können Sie die Aufgabe in zwei Teile unterteilen:

  1. Merkmalsextraktion - Umwandlung von Rohtexten in Merkmalsvektoren.
  2. Objektklassifizierung - Erstellen und Anwenden eines Modells.

Der erste Punkt ist in vielen NLP-Bibliotheken gut ausgearbeitet . Zweitens geht es um maschinelles Lernen. Abhängig von Ihrem Datensatz können Sie entweder Weka oder MLlib verwenden .


Original Poster verwendete das Wort "klassifizieren", aber "Cluster" ist eine genauere Beschreibung seines Problems, da er keine a priori Definitionen von Kategorien hat. Daher ist dies nicht unbedingt ein beaufsichtigtes Lernproblem.
MrMeritology

@ MrMeritology: Hmm, aus dem Zusammenhang heraus würde ich sagen, dass der Autor nicht sicher ist, welche konkreten Klassen er verwenden wird, aber dennoch eine Klassifizierung wünscht, keine Clusterbildung. Wie auch immer, er ist der einzige, der die Wahrheit kennt :)
Freund

Vielleicht war mir bei dem Punkt nicht klar. Die Kategorien werden in der Empfehlung ausgewählt, es handelt sich also eher um eine Klassifizierung als um ein Clustering-Problem. Die Idee, einen Vektor mit komplexen Merkmalen zu erstellen, scheint ziemlich vernünftig zu sein - insbesondere, dass es einige bestimmte Tags gibt, die höchstwahrscheinlich einige Beispiele schnell klassifizieren. Ich bin nicht sicher, ob SVM zum Problem passt, da ich hohe Nichtlinearitäten vorhersage, aber Entscheidungsbäume und Bayes scheinen anwendbar zu sein. Ich beginne auch über die Anwendung eines hybriden Algorithmus (SVM-basierte Entscheidungsbäume) nachzudenken.
Grzegorz E.

@ GrzegorzE. - Wenn Ihre Kategorien im Voraus definiert wurden, listen Sie diese drei Kategorien in Ihrer Frage auf. Meiner Meinung nach konzentrieren Sie sich zu sehr auf ML-Algorithmen und nicht genug auf die Art Ihres Problems und die Art Ihrer Daten. Sie können beispielsweise "Nichtlinearitäten" in Features für Websites mit unbekannter Struktur vorhersagen. Warum? Außerdem mischen Sie Tags mit Web-Seitentext und wer-weiß-was-noch, und sie haben eine andere semantische Bedeutung.
MrMeritology

@ GrzegorzE. - Ich empfehle dringend, dass Ihre Klassifizierungsmethode in erster Linie von der Art Ihrer A-priori-Kategorien und der Art der Daten abhängt. Es gibt unendlich viele Möglichkeiten, beliebige Websites in drei Kategorien einzuteilen. Jede Art der Kategorisierung schlägt hervorstechende Merkmale in den Daten oder hervorstechenden Mustern vor. Es gibt keinen Ersatz für die manuelle Analyse einzelner Datenelemente (Webseiten) und ihres Kontexts.
MrMeritology

5

Die Themenmodellierung ist eine sehr geeignete Methode für Ihr Problem. Themenmodelle sind eine Form des unbeaufsichtigten Lernens / Entdeckens, bei der eine bestimmte (oder entdeckte) Anzahl von Themen durch eine Liste von Wörtern definiert wird, bei denen eine hohe Wahrscheinlichkeit besteht, dass sie zusammen auftreten. In einem separaten Schritt können Sie jedes Thema mit Hilfe von Fachexperten kennzeichnen. Für Ihre Zwecke ist dies jedoch nicht erforderlich, da Sie nur an drei Clustern interessiert sind.

Sie behandeln jedes Dokument als eine Worttüte und entfernen Stoppwörter usw. vorab. Mit den einfachsten Methoden geben Sie die Anzahl der Themen vorab an. In Ihrem Fall können Sie entweder "3" als festes Limit für Kategorien angeben oder eine größere Anzahl von Themen (zwischen 10 und 100) auswählen und dann in einem separaten Schritt drei Cluster für Dokumente mit gemeinsamem Schwerpunkt auf bilden Themen. K-Means oder andere Clustering-Methoden könnten verwendet werden. (Ich würde den letzteren Ansatz empfehlen)

Sie müssen die Themenmodellierungssoftware nicht von Grund auf neu programmieren. Hier ist eine Webseite mit vielen Ressourcen, einschließlich Softwarebibliotheken / -paketen .

Keines ist in Java, aber es gibt Möglichkeiten, C ++ und Python unter Java auszuführen.


4

Hier sind ein paar wirklich großartige Open-Source-Softwarepakete für die Textklassifizierung, die Ihnen den Einstieg erleichtern sollen:

  • MALLET ist ein CPL-lizenziertes Java-basiertes Toolkit für maschinelles Lernen, das von UMass für die Arbeit mit Textdaten entwickelt wurde. Es enthält Implementierungen von mehreren Klassifizierungsalgorithmen (z. B. naive Bayes, maximale Entropie, Entscheidungsbäume).
  • Der Stanford Classifier der Stanford NLP Group ist eine GPL-lizenzierte Java-Implementierung eines Maximum-Entropy-Klassifikators, der für die Arbeit mit Textdaten entwickelt wurde.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.