¿Cómo puedo clasificar el texto considerando el orden de las palabras, en lugar de usar un enfoque de bolsa de palabras?

10

Creé un clasificador Naive Bayes que utiliza la técnica de la bolsa de palabras para clasificar las publicaciones de spam en un tablero de mensajes. Funciona, pero creo que podría obtener mejores resultados si mis modelos consideraran el orden de las palabras y las frases. (p. ej., 'chicas' y 'en vivo' pueden no desencadenar una puntuación alta de spam, aunque 'chicas en vivo' probablemente sea basura). ¿Cómo puedo construir un modelo que tenga en cuenta el orden de las palabras?

He considerado almacenar n-gramas (check-out-these, out-these-live, these-live-girls), pero esto parece aumentar radicalmente el tamaño del diccionario en el que mantengo el puntaje y causa inconsistencia como frases con muy redacción similar pero diferente orden se deslizará a través.

No estoy atado a la clasificación bayesiana, pero me gustaría algo que alguien sin una sólida formación en estadísticas pudiera asimilar e implementar.

Yerk
fuente
Los modelos de n-gramas a menudo son el camino a seguir cuando se considera el orden de las palabras. ver en.wikipedia.org/wiki/N-gram
brentlance

Respuestas:

6

Hay un truco muy simple para incorporar el orden de las palabras en una implementación de modelo de bolsa de palabras existente. Trate algunas de las frases, como los bi-gramos que ocurren con frecuencia (por ejemplo, Nueva York) como una unidad, es decir, una sola palabra en lugar de tratarlas como entidades separadas. Esto asegurará que "Nueva York" sea diferente de "Nueva York". También podría definir tejas de palabras de orden superior, como para n = 3,4, etc.

Puede usar Lucene ShingleFilter para descomponer el texto de su documento en tejas como un paso de preprocesamiento y luego aplicar el clasificador en este texto descompuesto.

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
fuente
2

Hay muchas técnicas. Ya has mencionado n-gram, luego hay una combinación de palabras y otras. Pero el problema principal (al menos desde su punto de vista) es que a medida que la característica se vuelve más compleja (como n-gramo), el recuento de características aumenta dramáticamente. Esto es manejable. Básicamente, antes de la clasificación, debe calificar sus características y luego umbral en un cierto puntaje. de esta manera, las funciones (o en su caso n-gramas) que se puntúan por debajo de cierto nivel se omiten y el recuento de funciones se vuelve manejable. En cuanto a la puntuación. Existen numerosas formas (que seleccionar dependen de su aplicación) para calificar las características. Puede comenzar con "Separación biormal", "chi cuadrado", "Ganancia de información", etc. No sé si esta respuesta le ayuda, pero si está interesado, puedo elaborar ...

Olvidé que, en la combinación de palabras, pones una ventana de tamaño m en el texto y extraes cada combinación de n palabras. por supuesto n

Nima Shayanfar
fuente