Classificação de documentos usando rede neural convolucional


11

Estou tentando usar a CNN (rede neural convolucional) para classificar documentos. A CNN para textos / frases curtas foi estudada em muitos artigos. No entanto, parece que nenhum documento usou a CNN para texto ou documento longo.
Meu problema é que há muitos recursos em um documento. No meu conjunto de dados, cada documento possui mais de 1000 tokens / palavras. Para alimentar cada exemplo em uma CNN, converto cada documento em uma matriz usando word2vec ou luva, resultando em uma grande matriz. Para cada matriz, a altura é o comprimento do documento e a largura é o tamanho do vetor de incorporação de palavras. Meu conjunto de dados tem mais de 9000 exemplos e leva muito tempo para treinar a rede (uma semana inteira), o que dificulta o ajuste fino dos parâmetros.
Outro método de extração de recurso é usar um vetor quente para cada palavra, mas isso criará matrizes muito esparsas. E, claro, esse método ainda leva mais tempo para treinar do que o método anterior.
Portanto, existe um método melhor para extrair recursos sem criar grandes matrizes de entrada?
E como devemos lidar com documentos de tamanho variável? Atualmente, adiciono seqüências especiais para fazer com que o documento tenha o mesmo tamanho, mas não acho que seja uma boa solução.


2
O uso do vetorizador TfIdf parece adequado? Talvez em combinação com o word2vec deixe apenas as principais palavras x para cada documento?
Diego

Bem, eu não sei o que é Tfldf. Vou verificar para ver se funciona. Obrigado
lenhhoxung


Eu apenas verifico e acho que não me ajuda. Basicamente, essa classe auxiliar cria uma matriz para um conjunto de documentos. Cada vetor de linha (número binário ou contagem de palavras) na matriz corresponde a um documento, mas para a CNN, precisamos de uma matriz para cada documento.
Lenhhoxung

O objetivo era deixar apenas x palavras não triviais por documento, classificadas pelo seu TfIdf. Em seguida, use sua codificação original para criar matrizes de documentos. Não tenho certeza se essa idéia de abordagem em duas etapas foi apresentada.
Diego

Respostas:


8

Você pode reduzir o comprimento dos dados de entrada representando seus documentos como uma série de vetores de frases em vez de uma série mais longa de vetores de palavras. O Doc2vec é uma maneira de fazer isso (cada frase seria um "documento").

Se você não quiser usar o Doc2vec, uma maneira de criar os vetores de sentença seria fazer a média dos vetores de palavras para cada sentença, fornecendo um único vetor da mesma largura para cada sentença. Isso pode não ser tão preciso quanto alguns métodos disponíveis no Doc2Vec, mas eu o usei com considerável sucesso na modelagem de tópicos.

De qualquer maneira, depois de ter seus vetores de frases, alinhe-os em sequência para cada documento, como você já está fazendo para seus vetores de palavras e execute-o no seu modelo. Como o tamanho da sequência para cada documento é menor, seu modelo deve ser treinado mais rapidamente do que com vetores de palavras.

A propósito, esse método poderia funcionar quando aumentado ou diminuído para atender às suas necessidades de precisão e velocidade. (por exemplo, se o seu CNN ainda treina muito lentamente com vetores de frases, você pode criar vetores de parágrafos).

Uma maneira de lidar com documentos de diferentes comprimentos é através do preenchimento. Suas seqüências de documentos devem ter o mesmo comprimento do documento mais longo. Portanto, se o documento mais longo tiver 400 frases, todas as seqüências terão 400 vetores. Os documentos menores que o comprimento máximo seriam preenchidos com vetores preenchidos com zeros.


Idéia interessante. Vou tentar :)
lenhhoxung

Posso fazer uma pergunta? Como posso lidar com documentos que com comprimentos significativamente diferentes (5 frases / doc, 500 frases / doc) até os represento em vetores de frases? Preenchimento aqui parece estranho ...
stackunderflow

1
No processamento de fala, algumas pessoas ordenam as seqüências com base em seu comprimento, para que uma sequência com comprimento semelhante fique no mesmo lote. Isso pode funcionar para a sequência de texto.
Suthee 06/12/19

4

Você pode usar casamentos na região. Em vez de converter "tokens" individuais em vetores, você pode usar uma estratégia para converter regiões de texto em vetores. Essa abordagem é usada aqui: https://arxiv.org/abs/1504.01255

Se você não está limitado à CNN, pode usar modelos de atenção hierárquica como este: https://www.cs.cmu.edu/~diyiy/docs/naacl16.pdf em que você tem um pipeline desse tipo: word vectors (combined into) sentence vectors (combined into) final document vector

Observe que, com esse método, você ainda precisará converter todos os vetores de palavras em incorporações, mas não todos de uma vez.

Para lidar com documentos de diferentes comprimentos, o preenchimento / corte é a única solução até agora.

Por fim, para aumentar a velocidade, você pode tentar reduzir a dimensão do texto incluindo apenas seções importantes (talvez apenas o início do documento seja suficiente para ter uma boa precisão de classificação)


1
Obrigado pelo seu link de referência. A incorporação da região é interessante. Em relação ao documento de tamanho variável, conforme mencionado neste artigo arxiv.org/abs/1412.1058 (mesmo autor), podemos usar várias unidades de pool em vez de preenchimento / corte.
Lenhhoxung #
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.