Wie kann ich Text unter Berücksichtigung der Wortreihenfolge klassifizieren, anstatt nur einen Bag-of-Word-Ansatz zu verwenden?

10

Ich habe einen Naive Bayes-Klassifikator erstellt, der die Bag-of-Word-Technik verwendet, um Spam-Posts auf einem Message Board zu klassifizieren. Es funktioniert, aber ich denke, ich könnte viel bessere Ergebnisse erzielen, wenn meine Modelle die Wortreihenfolgen und Phrasen berücksichtigen. (Beispiel: "Mädchen" und "Leben" lösen möglicherweise keine hohe Spam-Punktzahl aus, obwohl "Lebende Mädchen" höchstwahrscheinlich Junk sind.) Wie kann ich ein Modell erstellen, das die Wortreihenfolge berücksichtigt?

Ich habe überlegt, n-Gramm zu speichern (check-out-this, out-this-live, diese-live-girls), aber dies scheint die Größe des Wörterbuchs, in dem ich die Punktzahl behalte, radikal zu erhöhen und führt zu Inkonsistenzen als Phrasen mit sehr Ein ähnlicher Wortlaut, aber eine andere Reihenfolge wird durchgehen.

Ich bin nicht an die Bayes'sche Klassifikation gebunden, aber ich hätte gerne etwas, das jemand ohne starken statistischen Hintergrund nutzen und umsetzen könnte.

Yerk
quelle
n-Gramm-Modelle sind häufig der richtige Weg, wenn Sie die Wortreihenfolge berücksichtigen. siehe en.wikipedia.org/wiki/N-gram
brentlance

Antworten:

6

Es gibt einen sehr einfachen Hack, um die Wortreihenfolge in eine vorhandene Bag-of-Word-Modellimplementierung zu integrieren. Behandeln Sie einige der Phrasen, wie z. B. die häufig vorkommenden Bi-Gramme (z. B. New York), als Einheit, dh ein einzelnes Wort, anstatt sie als separate Einheiten zu behandeln. Dadurch wird sichergestellt, dass sich "New York" von "York New" unterscheidet. Sie können auch Wortschindeln höherer Ordnung definieren, z. B. für n = 3,4 usw.

Sie können den Lucene ShingleFilter verwenden , um Ihren Dokumenttext als Vorverarbeitungsschritt in Schindeln zu zerlegen und dann den Klassifizierer auf diesen zerlegten Text anzuwenden.

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();
         }

    }
}
Debasis
quelle
2

Es gibt eine Reihe von Techniken. Sie haben bereits n-Gramm erwähnt, dann gibt es Wortkombinationen und andere. Das Hauptproblem (zumindest aus Ihrer Sicht) ist jedoch, dass die Anzahl der Features dramatisch zunimmt, wenn das Feature komplexer wird (wie n-Gramm). Das ist überschaubar. Grundsätzlich müssen Sie vor der Klassifizierung Ihre Merkmale und dann den Schwellenwert bei einer bestimmten Punktzahl bewerten. Auf diese Weise werden die Merkmale (oder in Ihrem Fall n-Gramm), die unter einem bestimmten Wert liegen, weggelassen und die Anzahl der Merkmale wird überschaubar. wie für die Wertung. Es gibt zahlreiche Möglichkeiten (die Auswahl hängt von Ihrer Anwendung ab), um die Funktionen zu bewerten. Sie können mit "BiNormal Separation", "Chi Square", "Information Gain" usw. beginnen. Ich weiß nicht, ob diese Antwort Ihnen hilft, aber wenn Sie interessiert sind, kann ich näher darauf eingehen ...

Ich habe vergessen, dass Sie in der Wortkombination ein Fenster der Größe m auf den Text setzen und jede Kombination von n Wörtern extrahieren. natürlich n

Nima Shayanfar
quelle