Como posso classificar o texto considerando a ordem das palavras, em vez de usar apenas uma abordagem de saco de palavras?

10

Eu criei um classificador Naive Bayes que usa a técnica do saco de palavras para classificar postagens de spam em um quadro de mensagens. Funciona, mas acho que poderia obter resultados muito melhores se meus modelos considerassem a ordem das palavras e frases. (ex: 'garotas' e 'ao vivo' podem não gerar uma pontuação alta de spam, mesmo que 'garotas ao vivo' seja provavelmente lixo). Como criar um modelo que leve em consideração a ordem das palavras?

Eu considerei o armazenamento de n-gramas (veja essas meninas que vivem fora, essas meninas vivem), mas isso parece aumentar radicalmente o tamanho do dicionário em que mantenho a pontuação e causa inconsistência como frases com muito redação semelhante, mas ordem diferente vai passar despercebida.

Não estou vinculado à classificação bayesiana, mas gostaria de algo que alguém sem uma sólida formação em estatística pudesse grudar e implementar.

Yerk
fonte
Os modelos de n-grama geralmente são o caminho a percorrer quando se considera a ordem das palavras. veja en.wikipedia.org/wiki/N-gram
brentlance

Respostas:

6

Existe um hack muito simples para incorporar a ordem das palavras em uma implementação de modelo de pacote de palavras existente. Trate algumas frases, como os biogramas que ocorrem com frequência (por exemplo, Nova York) como uma unidade, ou seja, uma única palavra em vez de tratá-las como entidades separadas. Isso garantirá que "Nova York" seja diferente de "Nova York". Você também pode definir telhas de ordem superior, como para n = 3,4 etc.

Você pode usar o Lucene ShingleFilter para decompor o texto do documento em telhas como uma etapa de pré-processamento e, em seguida, aplicar o classificador nesse texto 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();
         }

    }
}
Debasis
fonte
2

Existem várias técnicas. Você já mencionou n-grama, então há combinação de palavras e outras. Mas o principal problema (pelo menos do seu ponto de vista) é que, à medida que o recurso se torna mais complexo (como n-grama), a contagem de recursos aumenta drasticamente. Isso é gerenciável. Basicamente, antes da classificação, você deve pontuar suas características e, em seguida, limiar em uma determinada pontuação. dessa forma, os recursos (ou no seu caso, n gramas) que são pontuados abaixo de um determinado nível são omitidos e a contagem de recursos se torna gerenciável. quanto à pontuação. Existem várias maneiras (a seleção depende da sua aplicação) para pontuar os recursos. Você pode começar com "Separação bi-normal", "quadrado do chi", "Ganho de informações" e etc. Não sei se essa resposta ajuda, mas se você estiver interessado, posso elaborar ...

Esqueci que, na combinação de palavras, você coloca uma janela de tamanho m no texto e extrai cada combinação de n palavras. claro n

Nima Shayanfar
fonte