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.
fonte
Respostas:
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.
fonte
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)
fonte