Rede neural convolucional profunda para análise de sentimento (classificação de texto)

Rede neural convolucional profunda para análise de sentimento (classificação de texto)

Desenvolva um modelo de aprendizado profundo para classificar automaticamente as críticas de filmes
como positivo ou negativo em Python com Keras, passo a passo.

Embeddings de palavras são uma técnica para representar texto em que palavras diferentes com significados semelhantes têm uma representação vetorial de valor real semelhante.

Eles são um grande avanço que levou a um ótimo desempenho de modelos de rede neural em um conjunto de problemas desafiadores de processamento de linguagem natural.

Neste tutorial, você descobrirá como desenvolver modelos de incorporação de palavras para redes neurais para classificar resenhas de filmes.

Depois de concluir este tutorial, você saberá:

  • Como preparar dados de texto de resenhas de filmes para classificação com métodos de aprendizado profundo.
  • Como aprender a incorporação de palavras como parte do ajuste de um modelo de aprendizado profundo.
  • Como aprender uma incorporação de palavras autônoma e como usar uma incorporação pré-treinada em um modelo de rede neural.

Comece seu projeto com meu novo livro Deep Learning for Natural Language Processing, incluindo tutoriais passo a passo e a Código-fonte Python arquivos para todos os exemplos.

Vamos começar.

  • Atualização novembro / 2019: Corrigido erro de digitação de código ao preparar o conjunto de dados de treinamento (obrigado HSA).
  • Atualização agosto / 2020: Link atualizado para o conjunto de dados de resenhas de filmes.
Como desenvolver um modelo de incorporação de palavras para prever o sentimento de resenhas de filmes

Como desenvolver um modelo de incorporação de palavras para prever o sentimento de resenhas de filmes
Foto de Katrina Br *? # *! @ Nd, alguns direitos reservados.

Visão geral do tutorial

Este tutorial é dividido em 5 partes; eles estão:

  1. Conjunto de dados de resenhas de filmes
  2. Preparação de dados
  3. Camada de incorporação de trem
  4. Treine a incorporação do word2vec
  5. Use incorporação pré-treinada

Ambiente Python

Este tutorial presume que você tenha um ambiente Python SciPy instalado, de preferência com Python 3.

Você deve ter o Keras (2.2 ou superior) instalado com o back-end TensorFlow ou Theano.

O tutorial também supõe que você tenha o scikit-learn, Pandas, NumPy e Matplotlib instalados.

Se precisar de ajuda com seu ambiente, consulte este tutorial:

Uma GPU não é necessária para este tutorial, no entanto, você pode acessar GPUs de forma barata no Amazon Web Services. Aprenda como neste tutorial:

Vamos mergulhar.

Precisa de ajuda com Deep Learning for Text Data?

Faça meu curso intensivo de e-mail gratuito de 7 dias agora (com código).

Clique para se inscrever e também obter uma versão gratuita do Ebook em PDF do curso.

Comece Seu Crash-Course GRÁTIS Agora

1. Conjunto de dados de revisão de filme

The Movie Review Data é uma coleção de resenhas de filmes recuperadas do site imdb.com no início dos anos 2000 por Bo Pang e Lillian Lee. As avaliações foram coletadas e disponibilizadas como parte de sua pesquisa sobre processamento de linguagem natural.

As análises foram lançadas originalmente em 2002, mas uma versão atualizada e limpa foi lançada em 2004, conhecida como “v2.0”.

O conjunto de dados é composto por 1.000 críticas positivas e 1.000 negativas de filmes retiradas de um arquivo do grupo de notícias rec.arts.movies.reviews hospedado em imdb.com. Os autores se referem a este conjunto de dados como o "conjunto de dados de polaridade".

Nossos dados contêm 1000 revisões positivas e 1000 negativas, todas escritas antes de 2002, com um limite de 20 revisões por autor (total de 312 autores) por categoria. Referimo-nos a este corpus como o conjunto de dados de polaridade.

- Uma educação sentimental: análise de sentimento usando sumarização de subjetividade com base em cortes mínimos, 2004.

Os dados foram um pouco limpos, por exemplo:

  • O conjunto de dados é composto apenas por revisões em inglês.
  • Todo o texto foi convertido para minúsculas.
  • Há um espaço em branco ao redor da pontuação, como pontos, vírgulas e colchetes.
  • O texto foi dividido em uma frase por linha.

Os dados foram usados ​​para algumas tarefas de processamento de linguagem natural relacionadas. Para classificação, o desempenho dos modelos de aprendizado de máquina (como Máquinas de Vetores de Suporte) nos dados está na faixa de 70% a 80% (por exemplo, 78% -82%).

A preparação de dados mais sofisticada pode ter resultados de até 86% com validação cruzada de 10 vezes. Isso nos dá uma estimativa de meados dos anos 80, se estivéssemos procurando usar esse conjunto de dados em experimentos de métodos modernos.

... dependendo da escolha do classificador de polaridade downstream, podemos alcançar uma melhoria altamente significativa estatisticamente (de 82,8% para 86,4%)

- Uma educação sentimental: análise de sentimento usando sumarização de subjetividade com base em cortes mínimos, 2004.

Você pode baixar o conjunto de dados aqui:

Depois de descompactar o arquivo, você terá um diretório chamado “txt_sentoken”Com dois subdiretórios contendo o texto“neg" e "pos”Para críticas negativas e positivas. As avaliações são armazenadas uma por arquivo com uma convenção de nomenclatura de cv000 a cv999 para cada neg e pos.

A seguir, vamos ver como carregar e preparar os dados de texto.

2. Preparação de dados

Nesta seção, veremos três coisas:

  1. Separação de dados em conjuntos de treinamento e teste.
  2. Carregando e limpando os dados para remover pontuação e números.
  3. Definindo um vocabulário de palavras preferidas.

Dividir em conjuntos de trem e teste

Estamos fingindo que estamos desenvolvendo um sistema que pode prever o sentimento de uma crítica textual de um filme como positivo ou negativo.

Isso significa que depois que o modelo for desenvolvido, precisaremos fazer previsões em novas revisões textuais. Isso exigirá que todas as mesmas preparações de dados sejam realizadas nessas novas revisões, conforme realizado nos dados de treinamento do modelo.

Garantiremos que essa restrição seja incorporada à avaliação de nossos modelos, dividindo os conjuntos de dados de treinamento e teste antes de qualquer preparação de dados. Isso significa que qualquer conhecimento dos dados no conjunto de teste que poderia nos ajudar a preparar melhor os dados (por exemplo, as palavras usadas) estão indisponíveis na preparação dos dados usados ​​para treinar o modelo.

Dito isso, usaremos as últimas 100 análises positivas e as últimas 100 análises negativas como um conjunto de teste (100 análises) e as 1.800 análises restantes como o conjunto de dados de treinamento.

Este é um trem de 90%, divisão de 10% dos dados.

A divisão pode ser imposta facilmente usando os nomes de arquivo das revisões, em que as revisões nomeadas de 000 a 899 são para dados de treinamento e as revisões de 900 em diante são para teste.

Carregando e limpando comentários

Os dados do texto já estão bem limpos; não é necessária muita preparação.

Se você é novo na limpeza de dados de texto, consulte esta postagem:

Sem nos preocuparmos muito com os detalhes, prepararemos os dados da seguinte maneira:

  • Divida os tokens no espaço em branco.
  • Remova toda a pontuação das palavras.
  • Remova todas as palavras que não são compostas exclusivamente de caracteres alfabéticos.
  • Remova todas as palavras que são palavras irrelevantes conhecidas.
  • Remova todas as palavras com comprimento <= 1 caractere.

Podemos colocar todas essas etapas em uma função chamada clean_doc () que toma como argumento o texto bruto carregado de um arquivo e retorna uma lista de tokens limpos. Também podemos definir uma função load_doc () que carrega um documento do arquivo pronto para uso com o clean_doc () função.

Um exemplo de limpeza da primeira avaliação positiva está listado abaixo.

Executar o exemplo imprime uma longa lista de tokens limpos.

Existem muitas outras etapas de limpeza que podemos explorar e deixo-as como exercícios adicionais.

Eu adoraria ver o que você pode fazer.
Publique suas abordagens e descobertas nos comentários no final.

Defina um vocabulário

É importante definir um vocabulário de palavras conhecidas ao usar um pacote de palavras ou modelo de incorporação.

Quanto mais palavras, maior será a representação dos documentos; portanto, é importante restringir as palavras apenas àquelas consideradas preditivas. Isso é difícil de saber de antemão e muitas vezes é importante testar diferentes hipóteses sobre como construir um vocabulário útil.

Já vimos como podemos remover pontuação e números do vocabulário na seção anterior. Podemos repetir isso para todos os documentos e construir um conjunto de todas as palavras conhecidas.

Podemos desenvolver um vocabulário como Contador, que é um mapeamento de dicionário de palavras e suas contagens que nos permite facilmente atualizar e consultar.

Cada documento pode ser adicionado ao contador (uma nova função chamada add_doc_to_vocab ()) e podemos passar por cima de todos os comentários no diretório negativo e, em seguida, no diretório positivo (uma nova função chamada process_docs ())

O exemplo completo está listado abaixo.

Você também pode estar interessado em