Classificazione del testo non strutturato


12

Classificherò documenti di testo non strutturati, vale a dire siti web di struttura sconosciuta. Il numero di classi a cui sto classificando è limitato (a questo punto, credo che non ce ne siano più di tre). Qualcuno ha un suggerimento su come potrei iniziare?

L'approccio "bag of words" è possibile qui? Successivamente, potrei aggiungere un'altra fase di classificazione basata sulla struttura del documento (forse alberi delle decisioni).

Ho una certa familiarità con Mahout e Hadoop, quindi preferisco soluzioni basate su Java. Se necessario, posso passare al motore Scala e / o Spark (la libreria ML).

Risposte:


14

Risolviamolo da zero. La classificazione (nota anche come categorizzazione) è un esempio di apprendimento supervisionato . Nell'apprendimento supervisionato hai:

  • modello - qualcosa che approssima la struttura interna dei dati, permettendoti di ragionare su di esso e fare previsioni utili (ad esempio predire la classe di un oggetto); normalmente il modello ha parametri che si desidera "imparare"
  • set di dati di training e testing : insiemi di oggetti utilizzati per l'addestramento del modello (ricerca di buoni valori per i parametri) e ulteriore valutazione
  • algoritmi di addestramento e classificazione : in primo luogo viene descritto come apprendere il modello dal set di dati di addestramento, in secondo luogo viene illustrato come derivare la classe di un nuovo oggetto dal modello addestrato

Ora prendiamo un semplice caso di classificazione dello spam. Il set di dati di formazione è un corpus di e-mail + etichette corrispondenti: "spam" o "non spam". Il set di dati di test ha la stessa struttura, ma costituito da alcune e-mail indipendenti (normalmente si divide semplicemente il set di dati e ne si fa, diciamo, 9/10 da utilizzare per l'allenamento e 1/10 - per i test). Un modo per modellare le e-mail è rappresentarle ognuna come un insieme (sacchetto) di parole. Se assumiamo che le parole siano indipendenti l'una dall'altra, possiamo usare il classificatore Naive Bayes , cioè calcolare le probabilità precedenti per ogni parola e ogni classe (algoritmo di addestramento) e quindi applicare il teorema di Bayes per trovare la probabilità posteriore di un nuovo documento a cui appartenere classe particolare.

Quindi, sostanzialmente abbiamo:

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

Ora nota che abbiamo rappresentato i nostri oggetti (documenti) come un sacco di parole. Ma è l'unico modo? In effetti, possiamo estrarre molto di più dal testo non elaborato. Ad esempio, al posto delle parole così come possiamo usare i loro gambi o lemmi , eliminare parole di arresto rumorose , aggiungere tag POS di parole, estrarre entità nominate o persino esplorare la struttura HTML del documento. In effetti, la rappresentazione più generale di un documento (e, in generale, di qualsiasi oggetto) è un vettore caratteristica . Ad esempio per il testo:

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

Qui la prima riga è un elenco di possibili funzionalità e le righe successive mostrano quante volte tale funzionalità si verifica in un documento. Ad esempio, nel primo documento non ci sono occorrenze della parola "attore", 1 ricorrenza della parola "brucia", 5 sostantivi, 2 aggettivi e 2 pezzi di testo in grassetto. L'ultima colonna corrisponde a un'etichetta di classe risultante.

Usando il vettore di funzione puoi incorporare qualsiasi proprietà dei tuoi testi. Anche se trovare un buon set di funzionalità potrebbe richiedere del tempo.

E che dire di modello e algoritmi? Siamo legati a Naive Bayes. Affatto. regressione logistica , SVM , alberi decisionali - solo per citare alcuni classificatori popolari. (Si noti che diciamo "classificatore" nella maggior parte dei casi intendiamo modello + algoritmi corrispondenti per addestramento e classificazione).

Per quanto riguarda l'implementazione, è possibile dividere l'attività in 2 parti:

  1. Estrazione di funzionalità: trasformazione di testi non elaborati in vettori di funzionalità.
  2. Classificazione degli oggetti - costruzione e applicazione del modello.

Il primo punto è ben elaborato in molte librerie NLP . Il secondo riguarda l'apprendimento automatico, quindi, a seconda del set di dati, è possibile utilizzare Weka o MLlib .


Il poster originale ha usato la parola "classificare" ma "cluster" è una descrizione più accurata del suo problema perché non ha definizioni a priori delle categorie. Pertanto, questo non è necessariamente un problema di apprendimento supervisionato.
MrMeritology,

@MrMeritology: hmm, dal contesto direi che l'autore non è sicuro delle classi concrete che userà, ma vuole comunque una classificazione, non un raggruppamento. Comunque, è l'unica persona che conosce la verità :)
amico

Forse non ero chiaro al punto. Le categorie verranno selezionate nei consigli, quindi è piuttosto una classificazione che un problema di raggruppamento. L'idea di creare un vettore di caratteristiche complesse sembra essere abbastanza ragionevole - in particolare, che ci sono alcuni tag particolari, che molto probabilmente probabilmente classificheranno rapidamente alcuni esempi. Non sono sicuro se SVM si adatterà al problema, poiché prevedo elevate non linearità, ma gli alberi decisionali e Bayes sembrano essere applicabili. Sto anche iniziando a pensare all'applicazione di un algoritmo ibrido (alberi decisionali basati su SVM).
Grzegorz E.

@GrzegorzE. - Se le tue categorie sono definite in anticipo, ti preghiamo di elencare queste tre categorie nella tua domanda. Secondo me, sei troppo concentrato sugli algoritmi ML e non abbastanza sulla natura del tuo problema e sulla natura dei tuoi dati. Ad esempio, si prevedono "non-linee" nelle funzionalità per siti Web di struttura sconosciuta. Perché? Inoltre, stai mescolando i tag con il testo della pagina web con chissà cos'altro e hanno un significato semantico diverso.
MrMeritology,

@GrzegorzE. - Suggerisco vivamente che il metodo di classificazione sia guidato principalmente dalla natura delle categorie a priori e dalla natura dei dati. Esistono un numero infinito di modi per classificare i siti Web arbitrari in 3 categorie. Ogni modo di categorizzare suggerirà caratteristiche salienti nei dati o modelli salienti. Non vi è alcun sostituto per l'analisi manuale dei singoli elementi di dati (pagine Web) e del loro contesto.
MrMeritology,

5

La modellazione di argomenti sarebbe un metodo molto appropriato per il tuo problema. I modelli di argomento sono una forma di apprendimento / scoperta senza supervisione, in cui un numero specificato (o scoperto) di argomenti è definito da un elenco di parole che hanno un'alta probabilità di apparire insieme. In una fase separata, puoi etichettare ogni argomento utilizzando esperti in materia, ma per i tuoi scopi questo non è necessario poiché sei interessato solo a raggiungere tre cluster.

Trattate ogni documento come un sacco di parole e la pre-elaborazione per rimuovere le parole di arresto, ecc. Con i metodi più semplici, pre-specificate il numero di argomenti. Nel tuo caso, puoi specificare "3", che è il limite fisso per le categorie, oppure scegliere un numero maggiore di argomenti (tra 10 e 100), quindi, in un passaggio separato, formare tre cluster per i documenti con enfasi comune su temi. K-significa o altri metodi di clustering potrebbero essere utilizzati. (Consiglierei quest'ultimo approccio)

Non è necessario codificare da zero il software di modellazione degli argomenti. Ecco una pagina web con molte risorse, tra cui librerie / pacchetti software .

Nessuno è in Java, ma ci sono modi per eseguire C ++ e Python in Java.


4

Ecco un paio di fantastici pacchetti software open source per la classificazione del testo che dovrebbero aiutarti a iniziare:

  • MALLET è un toolkit di machine learning basato su Java con licenza CPL creato da UMass per lavorare con i dati di testo. Include implementazioni di numerosi algoritmi di classificazione (ad es. Bayes naïf, entropia massima, alberi decisionali).
  • Il classificatore Stanford del gruppo NLP di Stanford è un'implementazione Java con licenza GPL di un classificatore di entropia massima progettato per funzionare con dati di testo.
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.