Categorização de texto: combinando diferentes tipos de recursos


19

O problema que estou enfrentando é categorizar textos curtos em várias classes. Minha abordagem atual é usar frequências de termo ponderadas tf-idf e aprender um classificador linear simples (regressão logística). Isso funciona razoavelmente bem (cerca de 90% da macro F-1 no conjunto de testes, quase 100% no conjunto de treinamento). Um grande problema são as palavras não vistas / n-gramas.

Estou tentando melhorar o classificador adicionando outros recursos, por exemplo, um vetor de tamanho fixo calculado usando semelhanças de distribuição (conforme calculado pelo word2vec) ou outros recursos categóricos dos exemplos. Minha idéia era apenas adicionar os recursos aos recursos de entrada esparsos do pacote de palavras. No entanto, isso resulta em pior desempenho no conjunto de teste e treinamento. Os recursos adicionais, por si só, fornecem cerca de 80% de F-1 no conjunto de teste, para que não sejam lixo. Escalar os recursos também não ajudou. Meu pensamento atual é que esse tipo de recurso não se mistura bem com o pacote (esparso) de recursos de palavras.

Portanto, a pergunta é: supondo que os recursos adicionais forneçam informações adicionais, qual é a melhor maneira de incorporá-los? Poderia treinar classificadores separados e combiná-los em algum tipo de trabalho de conjunto (isso provavelmente teria a desvantagem de que nenhuma interação entre os recursos dos diferentes classificadores poderia ser capturada)? Existem outros modelos mais complexos que devo considerar?


3
Alguma atualização: Consegui alcançar resultados aceitáveis ​​normalizando l2 os vetores densos adicionais. Por engano, presumi que o sklearn StandardScaler faria isso. No entanto, ainda estou procurando métodos mais complexos que me permitam modelar dependências de rótulo ou incorporar a confiança dos sub-classificadores.
precisa saber é

Eu estava fazendo o mesmo experimento básico no ano passado e encontrei exatamente o mesmo problema que você tem. Seu vetor word2vec após o processo de normalização de l2 pode vencer o BOW? Eu não fiz a normalização de l2, mas mesmo depois de testar muitos vetores semânticos do método de pós-processamento, ainda estão 2-4% absolutos atrás dos recursos do BOW tf / idf. Será que essa direção é um beco sem saída. Meu objetivo original é combinar um vetor densamente semântico com o BOW tradicional e ver se ele pode melhorar a classificação / modelagem de tópicos. BTW: em que conjunto de dados você está trabalhando, o meu é o 20newsgroup.

Eu estava trabalhando com um conjunto de dados para o concurso CIKM 2014. Para mim, as representações vetoriais nunca foram capazes de vencer o BOW com pesos tf-idf. Meu plano era usá-los além de melhorar a qualidade. Na minha experiência (para classificação de texto), alguma forma de tf-idf + um modelo linear com n-gramas é uma abordagem extremamente forte. Atualmente, estou experimentando redes neurais convolucionais e até mesmo com esses modelos (mais ou menos) complexos que são difíceis de superar.
Elmille

Para Mod: Desculpe por não ter 50 reputação, então não posso escrever na área de comentários. Oi elmille: Sim, é isso que experimento em todos os testes. No entanto, você acha que a palavra vec + BOW ajuda? Na minha experiência, quando concatenar a palavra vec com o BOW tf-idf (no meu caso, esse vec é realmente um vetor geral no artigo inteiro, não é word-vec, mas é muito semelhante), o desempenho fica ainda mais baixo. Originalmente, acho que deveria ser BOW + vec> BOW> vec. Uma vez que eles contêm informações de assistente mútuo. O resultado realmente é BOW> vec> BOW + vec. Então eu faço escala padrão e normalização de arco e VEC em

Respostas:


13

Se bem entendi, você tem basicamente duas formas de recursos para seus modelos. (1) dados de texto que você representou como um pacote esparso de palavras e (2) recursos densos mais tradicionais. Se for esse o caso, existem 3 abordagens comuns:

  1. Realize redução de dimensionalidade (como LSA via TruncatedSVD) em seus dados esparsos para torná-los densos e combine os recursos em uma única matriz densa para treinar seus modelos.
  2. Adicione seus poucos recursos densos à sua matriz esparsa usando algo como scipy hstackem uma única matriz esparsa para treinar seus modelos.
  3. Crie um modelo usando apenas seus dados de texto esparso e, em seguida, combine suas previsões (probabilidades, se for classificação) como um recurso denso com seus outros recursos densos para criar um modelo (por exemplo: montagem via empilhamento). Se você seguir esse caminho, lembre-se de usar apenas as previsões de CV como recursos para treinar seu modelo, caso contrário, você provavelmente se ajustará muito mal (você pode fazer uma classe bastante para fazer isso tudo em um único, Pipelinese desejar).

Todas as três abordagens são válidas e têm seus próprios prós e contras. Pessoalmente, acho (1) tipicamente o pior porque é, relativamente falando, extremamente lento. Também acho que (3) geralmente é o melhor, sendo suficientemente rápido e resultando em previsões muito boas. Obviamente, você também pode fazer uma combinação deles, se estiver disposto a fazer um conjunto mais extenso.

Quanto aos algoritmos que você usa, eles podem essencialmente se encaixar nessa estrutura. A regressão logística apresenta um desempenho surpreendentemente bom na maioria das vezes, mas outros podem se sair melhor dependendo do problema em questão e de quão bem você os ajusta. Eu sou parcial com os GBMs, mas o resultado é que você pode tentar quantos algoritmos desejar e até mesmo fazer conjuntos simples e ponderados de suas previsões quase sempre levam a uma solução geral melhor.


10

Os modelos lineares simplesmente adicionam seus recursos multiplicados pelos pesos correspondentes. Se, por exemplo, você tiver 1000 recursos esparsos, apenas 3 ou 4 estão ativos em cada instância (e os outros são zeros) e 20 recursos densos que não sejam zeros, é bem provável que recursos densos aproveitem ao máximo o impacto enquanto recursos esparsos adicionará apenas um pouco de valor. Você pode verificar isso examinando os pesos dos recursos por algumas instâncias e como eles influenciam a soma resultante.

Uma maneira de corrigi-lo é abandonar o modelo aditivo. Aqui estão alguns modelos candidatos.

O SVM é baseado na separação de hiperplanos. Embora o hiperplano seja o modelo linear em si, o SVM não resume seus parâmetros, mas tenta dividir o espaço de recursos da maneira ideal. Dado o número de recursos, eu diria que o SVM linear deve funcionar bem, enquanto kernels mais complicados tendem a superestimar os dados.

Apesar do nome, Naive Bayes é um modelo estatístico bastante poderoso que mostrou bons resultados para a classificação do texto. Também é flexível o suficiente para capturar desequilíbrios na frequência de recursos esparsos e densos, então você definitivamente deve experimentá-lo.

Finalmente, florestas aleatórias podem funcionar como um bom método de conjunto neste caso. A randomização garantirá que diferentes tipos de recursos (esparsos / densos) sejam usados ​​como nós de decisão primários em diferentes árvores. As árvores de RF / decisão também são boas para inspecionar os próprios recursos; portanto, vale a pena observar sua estrutura de qualquer maneira.

Observe que todos esses métodos têm suas desvantagens que podem transformá-los em lixo no seu caso. Combinar recursos esparsos e densos não é uma tarefa muito bem estudada; portanto, deixe-nos saber qual dessas abordagens funciona melhor para o seu caso.


Obrigado pela sua resposta! Tenho duas perguntas de acompanhamento :) 1) Como o SVM (com um núcleo linear) e o Naive Bayes são diferentes, pois não resumem seus recursos e pesos correspondentes (isto é, o que você chama de "modelo aditivo")? Ambos criam efetivamente um hiperplano de separação. Portanto, o resultado não é sempre algum tipo de adição de recursos multiplicados pelos pesos correspondentes? 2) Gostaria de tentar florestas aleatórias, mas infelizmente o espaço de recursos é muito grande para representá-lo em formato denso (estou usando o sklearn). Existe uma implementação que pode lidar com isso?
Elmille

1) Na regressão linear, você está interessado em pontos no hiperplano, adicionando recursos ponderados para obter o ponto previsto. No SVM, por outro lado, você está procurando pontos nas laterais do hiperplano. Você faz a classificação verificando de que lado está o seu exemplo, sem nenhum somatório durante a previsão. Naive Bayes pode incorporar diferentes tipos de modelos (por exemplo, binomial ou multinomial), mas basicamente você multiplica probabilidades, não as adiciona.
ffriend

2) Vi algumas pesquisas neste tópico, mas nunca encontrei implementação (provavelmente pesquisar no Google fornecerá alguns links aqui). No entanto, você sempre pode seguir outro caminho - reduzir a dimensionalidade com, digamos, o PCA e executar a floresta aleatória com base no conjunto de dados reduzido.
ffriend
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.