Come posso classificare il testo considerando l'ordine delle parole, invece di usare semplicemente un approccio bag-of-words?


10

Ho creato un classificatore Naive Bayes che utilizza la tecnica del bag-of-word per classificare i post di spam in una bacheca. Funziona, ma penso che potrei ottenere risultati molto migliori se i miei modelli considerassero gli ordinamenti e le frasi delle parole. (ad esempio, "ragazze" e "live" potrebbero non generare un punteggio spam elevato, anche se "ragazze live" è molto probabilmente spazzatura). Come posso costruire un modello che tenga conto dell'ordinamento delle parole?

Ho preso in considerazione la memorizzazione di n-grammi (check-out-these, out-these-live, these-live-girls), ma questo sembra aumentare radicalmente la dimensione del dizionario in cui tengo il punteggio e causa incoerenza come frasi con una formulazione simile ma un ordine diverso sfuggirà.

Non sono legato alla classificazione bayesiana, ma mi piacerebbe qualcosa che una persona senza un forte background nelle statistiche potrebbe mettere insieme e implementare.


I modelli n-gram sono spesso la strada da percorrere quando si considera l'ordine delle parole. vedi en.wikipedia.org/wiki/N-gram
brentlance,

Risposte:


6

C'è un trucco molto semplice per incorporare l'ordine delle parole in un'implementazione del modello bag-of-word esistente. Tratta alcune delle frasi, come i bi-grammi che si verificano frequentemente (ad es. New York) come un'unità, ovvero una singola parola invece di trattarli come entità separate. Ciò garantirà che "New York" sia diversa da "New York". Puoi anche definire scandole di parole di ordine superiore come per n = 3,4 ecc.

È possibile utilizzare Lucene ShingleFilter per scomporre il testo del documento in herpes zoster come fase di pre-elaborazione e quindi applicare il classificatore su questo testo decomposto.

import java.io.*;
import org.apache.lucene.analysis.core.*;
import org.apache.lucene.analysis.*;
import org.apache.lucene.analysis.shingle.ShingleFilter;
import org.apache.lucene.analysis.standard.*;
import org.apache.lucene.util.*;
import org.apache.lucene.analysis.util.*;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.charfilter.*;
import org.apache.lucene.analysis.core.WhitespaceTokenizer;

class TestAnalyzer extends Analyzer {

    TestAnalyzer() {
        super();
    }

    protected TokenStreamComponents createComponents( String fieldName, Reader reader ) {
        String token;
        TokenStream result = null;

        Tokenizer source = new WhitespaceTokenizer( Version.LUCENE_CURRENT, reader );
        result = new ShingleFilter(source, 2, 2);

        return new TokenStreamComponents( source, result );

    }
}

public class LuceneTest {

    public static void main(String[] args) throws Exception {

        TestAnalyzer analyzer = new TestAnalyzer();

        try {
            TokenStream stream = analyzer.tokenStream("field", new StringReader("This is a sample sentence."));
            CharTermAttribute termAtt = stream.addAttribute(CharTermAttribute.class);

            stream.reset();

            // print all tokens until stream is exhausted
            while (stream.incrementToken()) {
                System.out.println(termAtt.toString());
            }

            stream.end();
            stream.close();
         }
         catch (Exception ex) {
             ex.printStackTrace();
         }

    }
}


2

Ci sono un sacco di tecniche. Hai già menzionato n-grammo, quindi c'è una combinazione di parole e altre. Ma il problema principale (almeno dal tuo punto di vista) è che man mano che la funzionalità diventa più complessa (come n-grammo) il conteggio delle funzionalità aumenta notevolmente. Questo è gestibile. Fondamentalmente prima della classificazione è necessario assegnare un punteggio alle funzionalità e quindi a una determinata soglia. in questo modo le funzioni (o nel tuo caso n-grammi) che vengono classificate al di sotto di un certo livello vengono omesse e il conteggio delle caratteristiche diventa gestibile. per quanto riguarda il punteggio. Esistono numerosi modi (che selezionare dipende dall'applicazione) per assegnare un punteggio alle funzionalità. Puoi iniziare con "Separazione bi-normale", "chi quadrato", "Guadagno informazioni" e così via. Non so se questa risposta ti aiuta, ma se sei interessato posso elaborare ...

Ho dimenticato, nella combinazione di parole hai messo una finestra di dimensioni m sul testo ed estrai ogni combinazione di n parole. ovviamente n

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.