Textklassifizierung in großem Maßstab

18

Ich möchte meine Textdaten klassifizieren. Ich habe 300 classes200 Schulungsunterlagen pro Klasse (so 60000 documents in total) und dies wird wahrscheinlich zu sehr hohen Maßangaben führen (wir suchen möglicherweise nach mehr als 1 Million Dimensionen ).

Ich möchte die folgenden Schritte in der Pipeline ausführen (um Ihnen einen Eindruck von meinen Anforderungen zu vermitteln):

  1. Konvertieren jedes Dokuments in einen Merkmalsvektor ( tf-idfoder vector space model)
  2. Feature selection( Mutual Informationbasiert vorzugsweise oder auf einem anderen Standard)
  3. Die Ausbildung der Klassifikator ( SVM, Naive Bayes, Logistic Regressionoder Random Forest)
  4. Vorhersage unsichtbarer Daten basierend auf dem trainierten Klassifikatormodell.

Die Frage ist also, welche Tools / Frameworks ich für den Umgang mit derart hochdimensionalen Daten verwende. Mir sind die üblichen Verdächtigen bekannt (R, WEKA ...), aber meines Wissens nach (ich kann mich irren) kann möglicherweise keiner von ihnen mit so großen Daten umgehen. Gibt es ein anderes Werkzeug von der Stange, das ich mir ansehen könnte?

Wenn ich es parallelisieren muss, sollte ich Apache Mahout anschauen ? Sieht so aus, als ob es möglicherweise noch nicht die Funktionalität bietet, die ich benötige.

Vielen Dank an alle im Voraus.


Update: Ich habe mich auf dieser Website , in der R-Mailingliste und im Internet allgemein umgesehen. Es scheint mir, dass die folgenden Probleme in meiner Situation auftauchen könnten:

(1) Die Vorverarbeitung meiner Daten unter Verwendung von R (insbesondere TM- Paket) kann unpraktisch sein , da tmdies unerschwinglich langsam sein wird.

(2) Da ich ein Ensemble von R-Paketen (Vorverarbeitung, Sparse-Matrizen, Klassifikatoren usw.) verwenden muss, kann die Interoperabilität zwischen den Paketen zu einem Problem werden, und es kann ein zusätzlicher Aufwand bei der Konvertierung von Daten von einem Format in ein anderes entstehen . Wenn ich zum Beispiel meine Vorverarbeitung mit tm(oder einem externen Tool wie WEKA) durchführe, muss ich eine Möglichkeit finden, diese Daten in eine Form zu konvertieren, die die HPC-Bibliotheken in R lesen können. Auch hier ist mir nicht klar, ob die Classifier-Pakete die von den HPC-Bibliotheken bereitgestellten Daten direkt aufnehmen würden.

Bin ich auf dem richtigen Weg? Und was noch wichtiger ist, mache ich Sinn?

user721975
quelle
R kann mit Datenmengen umgehen, die viel größer sind. Sie müssen nur die verfügbaren Tools gut nutzen. Es gibt keinen Unterschied zwischen dem, was in einer wichtigen Sprache oder Umgebung erreicht werden kann, obwohl Weka und Mahout in Bezug auf das, was verfügbar ist, hinterherhinken. FWIW, dies ist eine ziemlich kleine Stichprobengröße, und 1M-Dimensionen sind kein großes Problem, aber es ist auch statistisch gesehen übertrieben. Meine Empfehlungen sind R oder Python, da sie für Anfänger sowohl kostenlos als auch einfach sind. Matlab ist nicht kostenlos, aber auch gut. Wenn Sie viele Computer verwenden, fällt auch eine hohe Steuer an.
Iterator
1
Ein weitaus wichtigerer Punkt ist, dass Sie mehr Klassen als Beispiele pro Klasse haben und diese in einen sehr hochdimensionalen Raum einbetten. Ich bin mir nicht sicher, ob Sie hier eine sehr gute Klassentrennung erreichen werden. Haben Sie strukturelle Beziehungen für Ihre Klassen? In diesem Fall könnten einige dieser Methoden ohne diese Einsicht schlecht abschneiden.
Iterator
1
Sie können die foreachBibliothek verwenden, um parallelen Code in R zu schreiben. Dies funktioniert besonders gut in Verbindung mit zufälligen Gesamtstrukturen, die von Natur aus einfach zu parallelisieren sind.
Zach
2
Ein paar Fragen: 1) Sind Sie daran interessiert, all die verschiedenen Arten von Lernansätzen zu vergleichen, die Sie erwähnen, oder benötigen Sie nur einen, um einen Job zu erledigen? 2) Gehört jedes Dokument zu 1, 1 oder mehr oder zu 0 oder mehr Klassen? 3) Möchten Sie die Featureauswahl aus irgendeinem Grund verwenden, oder haben Sie nur gedacht, dass dies erforderlich ist? Ich stimme den anderen Kommentaren zu, dass dies nach heutigen Maßstäben ein Problem von bescheidener Größe ist und eine Reduzierung der Dimensionalität nicht erforderlich ist.
DavidDLewis
1
Ich arbeite an der Klassifizierung von Texten zu fast 10.000 Themen (z. B. Klassen oder Kategorien oder ein beliebiger Begriff, den Sie bevorzugen). Ich arbeite derzeit an der Optimierung dieses Textklassifizierungssystems in dieser Größenordnung. Ich kann meine eigenen Techniken nicht weitergeben, da diese proprietär sind, aber ich habe einen Ratschlag: Seien Sie sehr vorsichtig, wenn Sie davon ausgehen, dass einige vorgeschlagene Techniken skalieren, es sei denn, dies wurde bereits nachgewiesen. Nach meiner Erfahrung tun es nur sehr wenige.

Antworten:

13

Dies sollte möglich sein, damit es funktioniert, solange die Daten als spärliche Datenstruktur dargestellt werden, z. B. als scipy.sparse.csr_matrixInstanz in Python. Ich habe ein Tutorial zum Bearbeiten von Textdaten geschrieben . Es ist weiterhin möglich, die Speichernutzung weiter zu reduzieren, indem Sie den Hashing-Trick anwenden: Passen Sie ihn an, um HashingVectorizeranstelle des CountingVectorizeroder das zu verwenden TfidfVectorizer. Dies wird im Dokumentationsabschnitt Extrahieren von Textfeatures erläutert .

Zufällige Wälder sind im Allgemeinen viel teurer als lineare Modelle (wie lineare Support-Vektor-Maschinen und logistische Regression) und multinomiale oder Bernoulli-naive Bayes sowie für die meisten Textklassifizierungsprobleme, die keine wesentlich bessere Vorhersagegenauigkeit bringen als einfachere Modelle.

Wenn scikit-learn nicht in der Lage ist, auf Ihr Problem zu skalieren, wird Vowpal Wabbit dies tun (und wahrscheinlich schneller als sklearn), obwohl es nicht alle Modelle implementiert, über die Sie sprechen.

Im April 2015 bearbeitet, um den aktuellen Stand der Scikit-Learn-Bibliothek widerzuspiegeln und fehlerhafte Links zu beheben.

Oger
quelle
Nun, das Problem bei der Verwendung einer "nicht standardmäßigen" Technik zur Dimensionsreduzierung ist, dass Sie wahrscheinlich auf Probleme stoßen, wenn Sie versuchen, Ihre Arbeit zu veröffentlichen. Zumindest im Bereich der Textklassifizierung weiß ich, dass Rezensenten gerne die häufig verwendeten Techniken sehen (was auch den Vergleich mit vorhandenen Klassifizierungstechniken erleichtert).
User721975
Keine Sorge - @ogrisel hat nichts Nicht-Standardmäßiges erwähnt, zumindest nicht, da es sich um die Klassifizierung von Texten nach dem neuesten Stand der Technik handelt, obwohl ich seine Tutorials noch nicht gelesen habe.
Iterator
+1 Ich denke, Python ist wahrscheinlich ein angenehmer Weg. Es gibt einige sehr neue Pakete in R für Text Mining, aber wenn man mehr Computerkenntnisse als statistische Fachkenntnisse und Interessen hat, wäre Python meine Empfehlung.
Iterator
@ogrisel: Ein großes Lob für die Beiträge, die Sie und andere zu sklearn geleistet haben. Ich habe es vielen empfohlen, die mit Python arbeiten - das gesamte Design ist vorbildlich.
Iterator
In Bezug auf die "nicht standardmäßige" Dimensionsreduktion (unter Verwendung von Zufallsprojektionen) und Feature-Hashing sollten Sie den Hashing-Trick von John Langford und diese Diskussion zu Metaoptimize überprüfen .
Ogrisel
10

Gensim für Python ist Magie. Und da es in Python ist, können Sie es in Verbindung mit @ ogrisels Vorschlag verwenden.

Jeff
quelle
1

Um nicht mein eigenes Horn zu betäuben, habe ich mit Rapidminer eine ziemlich beliebte Videoserie über Textanalyse gemacht. Sie können es hier sehen:

http://vancouverdata.blogspot.com/2010/11/text-analytics-with-rapidminer-loading.html

Sie können wahrscheinlich auf die Auswahl von Features verzichten, indem Sie einen Klassifikator verwenden, der keine Million * Million-Matrix im Speicher erstellt :)

Die logistische Regression wird in so vielen Dimensionen ersticken. Naive Bayes nimmt unabhängige Dimensionen an, sodass es Ihnen gut geht. SVM hängt nicht von der Anzahl der Dimensionen ab (sondern von der Anzahl der Unterstützungsvektoren), sodass es auch in Ordnung ist.

300 ist jedoch eine Menge von Klassen. Ich würde mit nur wenigen anfangen und mich nach oben arbeiten.

Neil McGuigan
quelle
Toller Hinweis und Rat. Vielen Dank. Können Sie bitte erläutern, was Sie unter "Beginnen Sie mit nur wenigen und arbeiten Sie sich nach oben" verstehen?
User721975
Anstelle von 300 Klassen (wie "Violine, Viola, Cello, Trompete ...") können Sie sie auch in eine kleinere Anzahl wie "Streicher, Blechbläser" umklassifizieren.
Neil McGuigan
OK, ich verstehe es jetzt.
user721975
1

Erstens, basierend auf Ihren Kommentaren, würde ich dies als 300 binäre (Ja / Nein) Klassifizierungsprobleme behandeln. Es gibt viele benutzerfreundliche Open-Source-Lernprogramme für Binärklassifikatoren, mit denen Sie Zeit gegen Speicher eintauschen können.

SVMs und logistische Regressionen sind wahrscheinlich die beliebtesten Ansätze für die Textklassifizierung. Beide können problemlos mit 1000000 Dimensionen umgehen, da moderne Implementierungen spärliche Datenstrukturen verwenden und Regularisierungseinstellungen enthalten, die eine Überanpassung vermeiden.

Mehrere Open-Source-Lösungen für maschinelles Lernen, darunter WEKA und KNIME , umfassen sowohl SVMs als auch logistische Regression. Eigenständige Implementierungen von SVMs umfassen libSVM und SVMlight . Für die logistische Regression werde ich BXRtrain und BXRclassify einbinden , die ich mit Madigan, Genkin und anderen entwickelt habe. BXRclassify kann einen speicherinternen Index von Tausenden logistischen Regressionsmodellen erstellen und gleichzeitig anwenden.

Was das Konvertieren von Text in Attributvektorform angeht, schreibe ich am Ende immer ein wenig Perl, um das von Grund auf zu tun. :-) Aber ich denke, die von mir erwähnten maschinellen Lernsuiten enthalten Tokenisierungs- und Vektorisierungscode. Eine andere Möglichkeit wäre, mit einem Toolkit in natürlicher Sprache wie LingPipe zu arbeiten , obwohl dies für Sie möglicherweise zu viel ist .

DavidDLewis
quelle
+1 Gute Kommentare. Wenn ich 300 Ja / Nein-Klassifizierungen machen würde, wie würde ich die negativen Trainingsdaten für eine Klasse auswählen? Positive Daten sind offensichtlich die Dokumente, die zur Klasse gehören.
user721975
Noch ein Kommentar. SVM / Logistic reg kann mit Sicherheit eine Million Dimensionen verarbeiten, aber wie könnte ich Experimente durchführen, um Parameter für diese Klassifizierer auszuwählen? Beispielsweise könnten Sie bei einem kleinen Datensatz eine 10-fache Kreuzvalidierung durchführen, um die Parameter zu bestimmen. Wie gehen Sie jedoch bei so großen Daten vor, dass der Algorithmus in einer angemessenen Zeit ausgeführt wird?
user721975
@ user721975: Für eine bestimmte Unterscheidung sind die positiven Dokumente diejenigen mit dem Label X und die negativen Dokumente sind alle übrigen Dokumente.
DavidDLewis
@ user721975: Es ist schwierig, allgemeine Hinweise zur Laufzeit zu geben, da die Details zwischen Algorithmen und Implementierungen sehr unterschiedlich sind. Eine 10-fache Kreuzvalidierung ist für Ihren Datensatz möglicherweise nicht unpraktisch: 60000 Beispiele spielen keine Rolle.
DavidDLewis
1
Unausgeglichene Trainingssätze sind nicht unbedingt ein Problem. Aber eigentlich ist mir klar, dass ich etwas verwirrt bin: Da Dokumente zu 0, 1 oder mehreren Klassen gehören können, was meinen Sie mit 200 Trainingsdokumenten pro Klasse? Haben Sie etwas unternommen, um Dokumente mit 0 oder mehr Klassen zu entfernen? Wie haben Sie diesen Satz von 60000 Dokumenten im Allgemeinen erstellt?
DavidDLewis
1

Seit Sklearn 0.13 gibt es tatsächlich eine Implementierung des HashingVectorizer .

BEARBEITEN: Hier ist ein vollständiges Beispiel für eine solche Anwendung von sklearn docs

Grundsätzlich zeigt dieses Beispiel, dass Sie Text in Daten klassifizieren können, die nicht in den Hauptspeicher des Computers passen (sondern auf Datenträger / Netzwerk / ...).

oDDsKooL
quelle