Sviluppo di un classificatore di testo Naive Bayes in JAVA PlatoBlockchain Data Intelligence. Ricerca verticale. Ai.

Sviluppo di un classificatore di testo Naive Bayes in JAVA

Negli articoli precedenti abbiamo discusso il background teorico di Classificatore di testo Naive Bayes e l'importanza dell'utilizzo Tecniche di selezione delle caratteristiche nella classificazione del testo. In questo articolo, metteremo tutto insieme e costruiremo una semplice implementazione dell'algoritmo di classificazione del testo Naive Bayes in JAVA. Il codice del classificatore è open-source (con licenza GPL v3) e puoi scaricarlo da Github.

Aggiornamento: Datumbox Machine Learning Framework è ora open-source e gratuito scaricare. Controlla il pacchetto com.datumbox.framework.machinelearning.classification per vedere l'implementazione di Naive Bayes Classifier in Java.

Implementazione ingenua di Java Bayes

Il codice è scritto in JAVA e può essere scaricato direttamente da Github. È concesso in licenza in GPLv3, quindi sentitevi liberi di usarlo, modificarlo e ridistribuirlo liberamente.

Il classificatore di testo implementa il Naive Bayes multinomiale modello insieme al Selezione delle caratteristiche di Chisquare algoritmo. Tutti i dettagli teorici di come funzionano entrambe le tecniche sono trattati in articoli precedenti e commenti dettagliati su javadoc possono essere trovati sul codice sorgente che descrive l'implementazione. Quindi in questo segmento mi concentrerò su una descrizione di alto livello dell'architettura del classificatore.

1. Classe NaiveBayes

Questa è la parte principale del classificatore di testo. Implementa metodi come train () e prediction () che sono responsabili dell'addestramento di un classificatore e del suo utilizzo per le previsioni. Va notato che questa classe è anche responsabile della chiamata dei metodi esterni appropriati per pre-elaborare e tokenizzare il documento prima dell'addestramento / previsione.

2. Oggetto NaiveBayesKnowledgeBase

L'output dell'addestramento è un oggetto NaiveBayesKnowledgeBase che memorizza tutte le informazioni e le probabilità necessarie utilizzate dal classificatore Naive Bayes.

3. Oggetto documento

Sia i testi di formazione che quelli di previsione nell'implementazione sono archiviati internamente come Document Object. L'oggetto documento memorizza tutti i token (parole) del documento, le loro statistiche e la classificazione di destinazione del documento.

4. Oggetto FeatureStats

L'oggetto FeatureStats memorizza diverse statistiche generate durante la fase di estrazione delle caratteristiche. Tali statistiche sono i conteggi congiunti delle caratteristiche e della classe (da cui vengono stimate le probabilità e le probabilità congiunte), i conteggi delle classi (da cui vengono valutati i priori se nessuno viene fornito come input) e il numero totale di osservazioni utilizzate per l'addestramento.

5. Classe di estrazione delle funzioni

Questa è la classe responsabile dell'esecuzione dell'estrazione delle caratteristiche. Va notato che poiché questa classe calcola internamente molte delle statistiche che sono effettivamente richieste dall'algoritmo di classificazione nella fase successiva, tutte queste statistiche vengono memorizzate nella cache e restituite in un oggetto FeatureStats per evitare il loro ricalcolo.

6. Classe TextTokenizer

Questo è semplice classe di tokenizzazione del testo, responsabile della pre-elaborazione, cancellazione e tokenizzazione dei testi originali e della loro conversione in oggetti Documento.

Utilizzo della classe JAVA di NaiveBayes

Nella classe NaiveBayesExample puoi trovare esempi di utilizzo della classe NaiveBayes. L'obiettivo del codice di esempio è presentare un esempio che addestra un semplice classificatore Naive Bayes per rilevare la lingua di un testo. Per addestrare il classificatore, inizialmente forniamo i percorsi dei set di dati di addestramento in una HashMap e poi carichiamo il loro contenuto.

   //map of dataset files
   Map<String, URL> trainingFiles = new HashMap<>();
   trainingFiles.put("English", NaiveBayesExample.class.getResource("/datasets/training.language.en.txt"));
   trainingFiles.put("French", NaiveBayesExample.class.getResource("/datasets/training.language.fr.txt"));
   trainingFiles.put("German", NaiveBayesExample.class.getResource("/datasets/training.language.de.txt"));

   //loading examples in memory
   Map<String, String[]> trainingExamples = new HashMap<>();
   for(Map.Entry<String, URL> entry : trainingFiles.entrySet()) {
      trainingExamples.put(entry.getKey(), readLines(entry.getValue()));
   }

Il classificatore NaiveBayes viene addestrato passandogli i dati. Una volta completata la formazione, l'oggetto NaiveBayesKnowledgeBase viene archiviato per un uso successivo.

   //train classifier
   NaiveBayes nb = new NaiveBayes();
   nb.setChisquareCriticalValue(6.63); //0.01 pvalue
   nb.train(trainingExamples);
      
   //get trained classifier
   NaiveBayesKnowledgeBase knowledgeBase = nb.getKnowledgeBase();

Infine, per utilizzare il classificatore e prevedere le classi di nuovi esempi, tutto ciò che devi fare è inizializzare un nuovo classificatore passando l'oggetto NaiveBayesKnowledgeBase che hai acquisito in precedenza durante l'addestramento. Quindi chiamando semplicemente il metodo Forecast () si ottiene la classe prevista del documento.

   //Test classifier
   nb = new NaiveBayes(knowledgeBase);
   String exampleEn = "I am English";
   String outputEn = nb.predict(exampleEn);
   System.out.format("The sentense "%s" was classified as "%s".%n", exampleEn, outputEn);   

Espansioni necessarie

La particolare implementazione di JAVA non deve essere considerata una soluzione completa pronta per l'uso per problemi di classificazione del testo sofisticati. Ecco alcune delle importanti espansioni che potrebbero essere fatte:

1. Estrazione di parole chiave:

Anche se l'utilizzo di singole parole chiave può essere sufficiente per problemi semplici come il rilevamento della lingua, altri problemi più complicati richiedono l'estrazione di n-grammi. Quindi si può implementare un algoritmo di estrazione del testo più sofisticato aggiornando il metodo TextTokenizer.extractKeywords () o utilizzare Datumbox API Keyword Extraction funzione per ottenere tutti gli n-grammi (combinazioni di parole chiave) del documento.

2. Preelaborazione del testo:

Prima di utilizzare un classificatore di solito è necessario preelaborare il documento per rimuovere caratteri / parti non necessari. Anche se l'implementazione corrente esegue una preelaborazione limitata utilizzando il metodo TextTokenizer.preprocess (), quando si tratta di analizzare le pagine HTML le cose diventano più complicate. Si può semplicemente tagliare i tag HTML e mantenere solo il testo normale del documento o ricorrere a tecniche di Machine Learning più sofisticate che rilevano il testo principale della pagina e rimuovono il contenuto che appartiene a piè di pagina, intestazioni, menu ecc. può utilizzare Datumbox API per l'estrazione del testo funzione.

3. Modelli Naive Bayes aggiuntivi:

L'attuale classificatore implementa il classificatore Multinomial Naive Bayes, tuttavia come abbiamo discusso in un precedente articolo su Analisi del sentimento, problemi di classificazione diversi richiedono modelli diversi. In alcuni una versione binarizzata dell'algoritmo sarebbe più appropriata, mentre in altri il modello Bernoulli fornirà risultati molto migliori. Usa questa implementazione come punto di partenza e segui le istruzioni del Tutorial Naive Bayes per espandere il modello.

4. Metodi di selezione delle funzioni aggiuntive:

Questa implementazione utilizza l'algoritmo di selezione delle caratteristiche di Chisquare per selezionare le caratteristiche più appropriate per la classificazione. Come abbiamo visto in un articolo precedente, il Selezione delle caratteristiche di Chisquare è una buona tecnica che fa affidamento sulla statistica per selezionare le caratteristiche appropriate, tuttavia tende a dare punteggi più alti su caratteristiche rare che compaiono solo in una delle categorie. È possibile apportare miglioramenti rimuovendo le funzionalità rumorose / rare prima di procedere alla selezione delle funzionalità o implementando metodi aggiuntivi come le informazioni reciproche di cui abbiamo discusso nell'articolo di cui sopra.

5. Ottimizzazione delle prestazioni:

Nella particolare implementazione era importante migliorare la leggibilità del codice piuttosto che eseguire micro-ottimizzazioni sul codice. Nonostante il fatto che tali ottimizzazioni rendano il codice più brutto e più difficile da leggere / mantenere, sono spesso necessarie poiché molti cicli in questo algoritmo vengono eseguiti milioni di volte durante l'addestramento e il test. Questa implementazione può essere un ottimo punto di partenza per sviluppare la tua versione ottimizzata.

Ci siamo quasi ... Note finali!

Ho sentito che è bravo a programmarePer avere una buona comprensione di come funziona questa implementazione, si consiglia vivamente di leggere i due articoli precedenti su Classificatore Naive Bayes ed Selezione funzionalità. Otterrai approfondimenti sul background teorico dei metodi e renderà più chiare parti dell'algoritmo / codice.

Da notare che Naive Bayes nonostante sia un metodo facile, veloce e il più delle volte “abbastanza preciso”, è anche “Naive” perché fa presupposto di indipendenza condizionale delle caratteristiche. Poiché questa ipotesi non è quasi mai soddisfatta nei problemi di classificazione del testo, Naive Bayes non è quasi mai il classificatore con le migliori prestazioni. Nel API Datumbox, alcune espansioni del classificatore standard Naive Bayes vengono utilizzate solo per problemi semplici come il rilevamento del linguaggio. Per problemi di classificazione del testo più complicati tecniche più avanzate come il Classificatore Max Entropy sono necessari.

Se si utilizza l'implementazione in un progetto interessante scriveteci e presenteremo il tuo progetto sul nostro blog. Inoltre, se ti piace l'articolo, prenditi un momento e condividilo su Twitter o Facebook. 🙂

Timestamp:

Di più da Databox