Classificazione del testo su larga scala


18

Sto cercando di fare una classificazione sui miei dati di testo. Ho 300 classes, 200 documenti di formazione per classe (quindi 60000 documents in total) e questo probabilmente porterà a dati dimensionali molto alti (potremmo guardare oltre 1 milione di dimensioni ).

Vorrei eseguire i seguenti passaggi nella pipeline (solo per darti un'idea di quali sono i miei requisiti):

  1. Conversione di ciascun documento in un vettore ( tf-idfo vector space model)
  2. Feature selection( Mutual Informationbasato preferibilmente o qualsiasi altro standard)
  3. La formazione del classificatore ( SVM, Naive Bayes, Logistic Regressiono Random Forest)
  4. Prevedere dati invisibili in base al modello di classificatore addestrato.

Quindi la domanda è: quali strumenti / framework utilizzo per gestire dati così dimensionali? Sono a conoscenza dei soliti sospetti (R, WEKA ...) ma per quanto ne so (forse mi sbaglio) probabilmente nessuno di loro può gestire dati così grandi. C'è qualche altro strumento disponibile che potrei guardare?

Se devo parallelizzarlo, dovrei guardare Apache Mahout ? Sembra che potrebbe non fornire ancora la funzionalità di cui ho bisogno.

Grazie a tutti in anticipo.


Aggiornamento: ho guardato in giro questo sito Web , la mailing list R e Internet in generale. Mi sembra che nella mia situazione possano emergere i seguenti problemi:

(1) La preelaborazione dei miei dati utilizzando R ( pacchetto tm in particolare) potrebbe non essere pratica , poiché tmsarà proibitivamente lenta.

(2) Poiché avrò bisogno di usare un insieme di pacchetti R (pre-elaborazione, matrici sparse, classificatori ecc.) L'interoperabilità tra i pacchetti potrebbe diventare un problema e potrei incorrere in un ulteriore sovraccarico nel convertire i dati da un formato all'altro . Ad esempio, se tmeseguo la pre-elaborazione utilizzando (o uno strumento esterno come WEKA), dovrò trovare un modo per convertire questi dati in un modulo leggibile dalle librerie HPC in R. E ancora una volta non mi è chiaro se i pacchetti di classificazione classifichino direttamente i dati forniti dalle librerie HPC.

Sono sulla buona strada? E, soprattutto, sto dando un senso?


R può gestire set di dati molto più grandi di questo, devi solo fare buon uso degli strumenti disponibili. Non c'è alcuna differenza tra ciò che può essere realizzato in qualsiasi lingua o ambiente principale, sebbene Weka e Mahout siano in ritardo in termini di ciò che è disponibile. FWIW, questa è una dimensione del campione abbastanza piccola, e le dimensioni 1M non sono un grosso problema, ma sono anche eccessivamente statisticamente. I miei consigli sono R o Python, in quanto sono entrambi gratuiti e facili per i principianti. Matlab non è gratuito, ma anche buono. Inoltre comporta una grande tassa quando si utilizzano molti computer.
Iteratore,

1
Un punto molto più saliente è che hai più classi che esempi per classe e la stai incorporando in uno spazio dimensionale molto elevato. Non sono sicuro che otterrai un'ottima separazione di classe qui. Hai delle relazioni strutturali per le tue lezioni? In tal caso, alcuni di questi metodi potrebbero andare male senza quella intuizione.
Iteratore,

1
È possibile utilizzare la foreachlibreria per scrivere il codice parallelo in R. Funziona particolarmente bene in combinazione con foreste casuali, che sono intrinsecamente facili da parallelizzare.
Zach,

2
Alcune domande: 1) Sei interessato a confrontare tutti i diversi tipi di approcci di apprendimento che menzioni o ne hai solo bisogno per svolgere un lavoro? 2) Ciascun documento appartiene a 1, 1 o più o 0 o più classi? 3) Ti specificamente desidera utilizzare la selezione delle funzioni, per qualche motivo, o hai semplicemente pensato che fosse necessario? Concordo con gli altri commenti sul fatto che questo è un problema di dimensioni modeste per gli standard odierni e che la riduzione della dimensionalità non è necessaria.
DavidDLewis,

1
Sto lavorando alla classificazione del testo che coinvolge quasi 10.000 argomenti (ad esempio classi o categorie o qualunque termine tu preferisca). Attualmente sto lavorando alla messa a punto di questo sistema di classificazione del testo su questa scala. Non posso condividere le mie tecniche in quanto sono proprietarie, ma ho un piccolo consiglio: sii molto cauto nel ritenere che alcune tecniche suggerite siano scalabili a meno che non sia già stato dimostrato di farlo. Nella mia esperienza, pochi lo fanno.

Risposte:


13

Ciò dovrebbe essere possibile per farlo funzionare fintanto che i dati sono rappresentati come una struttura di dati sparsa come scipy.sparse.csr_matrixun'istanza in Python. Ho scritto un tutorial per lavorare sui dati di testo . È inoltre possibile ridurre ulteriormente l'utilizzo della memoria sfruttando il trucco di hashing: adattarlo per utilizzare il HashingVectorizeranziché il CountingVectorizero il TfidfVectorizer. Ciò è spiegato nella sezione relativa alla documentazione relativa all'estrazione delle funzioni di testo .

Le foreste casuali sono in genere molto più costose dei modelli lineari (come le macchine vettoriali a supporto lineare e la regressione logistica) e le Bayes ingenui multinomiali o di Bernoulli e per la maggior parte dei problemi di classificazione del testo che non portano una precisione predittiva significativamente migliore rispetto ai modelli più semplici.

Se scikit-learn finisce per non essere in grado di adattarsi al tuo problema, Vowpal Wabbit farà (e probabilmente più velocemente di sklearn) anche se non implementa tutti i modelli di cui stai parlando.

Modificato nell'aprile 2015 per riflettere lo stato attuale della libreria scikit-learn e correggere i collegamenti interrotti.


Bene, il problema con l'uso di qualsiasi tecnica di riduzione dimensionale "non standard" è che potresti avere problemi quando provi a pubblicare il tuo lavoro. Almeno nel campo della classificazione del testo, so per certo che ai revisori piace vedere le tecniche comunemente usate (rende anche più semplice il confronto con le tecniche di classificazione esistenti).
user721975,

Non preoccuparti: @ogrisel non ha menzionato nulla di non standard, almeno non per quanto riguarda la classificazione del testo allo stato dell'arte, anche se non ho ancora letto i suoi tutorial.
Iteratore,

+1 Penso che Python sia probabilmente un modo divertente di andare. Ci sono alcuni pacchetti molto recenti in R per l'estrazione del testo, ma se uno ha più competenze computazionali che competenze e interessi statistici, Python sarebbe la mia raccomandazione.
Iteratore,

@ogrisel: Kudos per i contributi che tu e altri avete dato a sklearn. L'ho consigliato a molti che lavorano in Python: l'intero design è esemplare.
Iteratore,

Per quanto riguarda la riduzione delle dimensioni "non standard" (utilizzando proiezioni casuali) e l'hashing delle caratteristiche, controlla il trucco di hashing di John Langford e questa discussione sulla metaottimizzazione .
Ogrisel,

10

Gensim per Python è magico. E poiché è in Python, puoi usarlo insieme al suggerimento di @ ogrisel.


1

Non per farmi il clacson, ma ho realizzato una serie di video piuttosto popolari sull'analisi del testo con Rapidminer. Potete vederlo qui:

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

Probabilmente puoi evitare di fare la selezione delle funzionalità, basta usare un classificatore che non crea un milione * milioni di matrici in memoria :)

La regressione logistica soffocerà su così tante dimensioni. Naive Bayes assume dimensioni indipendenti, quindi starai bene. SVM non dipende dal numero di dimensioni (ma dal numero di vettori di supporto), quindi andrà anche bene.

300 sono molte classi però. Vorrei iniziare solo con alcuni e risalirei.


Ottimo puntatore e consiglio. Grazie. Puoi per favore elaborare ciò che intendi con "inizia con solo pochi e vai avanti"?
user721975,

bene, invece di 300 classi (come "violino, viola, violoncello, tromba ..."), potresti riclassificarle in un numero più piccolo come "archi, ottoni".
Neil McGuigan,

OK, ho capito adesso.
user721975,

1

In primo luogo, in base ai tuoi commenti, lo tratterei come 300 problemi binari (sì / no) di classificazione. Esistono molti apprenditori di classificatori binari open source facili da usare e questo ti consente di scambiare tempo con la memoria.

SVM e regressione logistica sono probabilmente gli approcci più popolari per la classificazione del testo. Entrambi sono in grado di gestire facilmente 1000000 dimensioni, poiché le implementazioni moderne utilizzano strutture di dati sparse e includono impostazioni di regolarizzazione che evitano l'adattamento eccessivo.

Diverse suite di apprendimento automatico open source, tra cui WEKA e KNIME , includono sia SVM che regressione logistica. Le implementazioni indipendenti di SVM includono libSVM e SVMlight . Per la regressione logistica, collegherò BXRtrain e BXRclassify , che ho sviluppato con Madigan, Genkin e altri. BXRclassify può creare un indice in memoria di migliaia di modelli di regressione logistica e applicarli contemporaneamente.

Per quanto riguarda la conversione del testo in un attributo vettoriale, in qualche modo finisco sempre per scrivere un po 'di Perl per farlo da zero. :-) Ma penso che le suite di machine learning che ho citato includano il codice di tokenizzazione e vettorializzazione. Un'altra strada potrebbe essere quella di utilizzare un kit di strumenti in linguaggio naturale come LingPipe , anche se potrebbe essere eccessivo per te.


+1 commenti positivi. Se dovessi fare 300 classifiche sì / no, come sceglierei i dati di allenamento negativi per una classe? I dati positivi ovviamente sono i documenti che appartengono alla classe.
user721975

Un altro commento SVM / Logistic log può sicuramente gestire un milione di dimensioni, ma come posso eseguire esperimenti per selezionare i parametri per questi classificatori? Ad esempio, su un piccolo set di dati è possibile eseguire 10 volte la convalida incrociata per decidere i parametri, ma quale approccio si adotta per dati così grandi in modo che l'algoritmo termini l'esecuzione in un tempo ragionevole?
user721975

@ user721975: per una particolare discriminazione, i documenti positivi sono quelli con l'etichetta X su di essi, mentre i documenti negativi sono tutto il resto dei documenti.
DavidDLewis,

@ user721975: è difficile fornire consigli generali sul tempo di esecuzione, poiché i dettagli variano molto tra algoritmi e implementazioni. La convalida incrociata di 10 volte potrebbe non essere impraticabile per il tuo set di dati: 60000 esempi non sono importanti.
DavidDLewis,

1
Set di allenamento sbilanciati non sono necessariamente un problema. Ma in realtà mi rendo conto che c'è qualcosa di cui sono confuso: poiché i documenti possono appartenere a 0, 1 o più classi, cosa intendi con 200 documenti di formazione per classe? Hai fatto qualcosa per rimuovere i documenti con 0 classi o 2+ classi? In generale, come è stato generato questo set di 60000 documenti?
DavidDLewis,

1

Da Sklearn 0.13 esiste effettivamente un'implementazione di HashingVectorizer .

EDIT: Ecco un esempio completo di tale applicazione dai documenti sklearn

Fondamentalmente, questo esempio dimostra che è possibile classificare il testo su dati che non possono rientrare nella memoria principale del computer (ma piuttosto su disco / rete / ...).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.