Como desenvolver um modelo de linguagem neural em nível de palavra e usá-lo para gerar texto

Como desenvolver um modelo de linguagem neural em nível de palavra e usá-lo para gerar texto

Um modelo de linguagem pode prever a probabilidade da próxima palavra na sequência, com base nas palavras já observadas na sequência.

Modelos de rede neural são um método preferido para desenvolver modelos de linguagem estatística porque podem usar uma representação distribuída onde palavras diferentes com significados semelhantes têm representação semelhante e porque podem usar um grande contexto de palavras observadas recentemente ao fazer previsões.

Neste tutorial, você descobrirá como desenvolver um modelo de linguagem estatística usando aprendizado profundo em Python.

Depois de concluir este tutorial, você saberá:

  • Como preparar texto para desenvolver um modelo de linguagem baseado em palavras.
  • Como projetar e ajustar um modelo de linguagem neural com uma incorporação aprendida e uma camada oculta LSTM.
  • Como usar o modelo de idioma aprendido para gerar um novo texto com propriedades estatísticas semelhantes às do texto de origem.

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 abril / 2018: Tipo fixo na descrição do modelo
  • Atualização maio / 2020: Corrigido um erro de digitação na expectativa do modelo.
Como desenvolver um modelo de linguagem neural em nível de palavra e usá-lo para gerar texto

Como desenvolver um modelo de linguagem neural em nível de palavra e usá-lo para gerar texto
Foto de Carlo Raso, alguns direitos reservados.

Visão geral do tutorial

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

  1. A República de Platão
  2. Preparação de dados
  3. Train Language Model
  4. Usar modelo de linguagem

A República de Platão

A República é a obra mais famosa do filósofo grego clássico Platão.

É estruturado como um diálogo (por exemplo, conversa) sobre o tema da ordem e justiça dentro de uma cidade-estado

Todo o texto está disponível gratuitamente em domínio público. Está disponível no site do Project Gutenberg em vários formatos.

Você pode baixar a versão em texto ASCII de todo o livro (ou livros) aqui:

Baixe o texto do livro e coloque-o no seu trabalho atual diretamente com o nome do arquivo 'republic.txt'

Abra o arquivo em um editor de texto e exclua a capa e o verso. Isso inclui detalhes sobre o livro no início, uma longa análise e informações sobre a licença no final.

O texto deve começar com:

LIVRO I.

Desci ontem ao Pireu com Glauco, filho de Ariston,

E terminar com


E estará bem conosco nesta vida e na peregrinação de mil anos que estamos descrevendo.

Aqui está um link direto para a versão limpa do arquivo de dados:

Salve a versão limpa como 'republic_clean.txt 'em seu diretório de trabalho atual. O arquivo deve ter cerca de 15.802 linhas de texto.

Agora podemos desenvolver um modelo de linguagem a partir deste texto.

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

Preparação de dados

Começaremos preparando os dados para modelagem.

A primeira etapa é examinar os dados.

Reveja o texto

Abra o texto em um editor e apenas observe os dados do texto.

Por exemplo, aqui está a primeira parte do diálogo:

LIVRO I.

Desci ontem ao Pireu com Glauco, filho de Ariston,
para que eu pudesse oferecer minhas orações à deusa (Bendis, a trácia
Artemis.); e também porque queria ver de que maneira eles iriam
celebrar o festival, que era uma coisa nova. Fiquei encantado com o
procissão dos habitantes; mas o dos trácios era igualmente,
se não mais, lindo. Quando terminamos nossas orações e vimos o
espetáculo, viramos na direção da cidade; e naquele instante
Polemarco, filho de Cefalo, por acaso nos avistou de um
distância quando estávamos começando em nosso caminho para casa, e disse a seu servo para
corra e peça que esperemos por ele. O servo me segurou pela capa
atrás, e disse: Polemarchus deseja que você espere.

Eu me virei e perguntei onde estava seu mestre.

Lá está ele, disse o jovem, vindo atrás de você, se você apenas esperar.

Certamente vamos, disse Glauco; e em poucos minutos Polemarchus
apareceu, e com ele Adeimantus, irmão de Glauco, Niceratus o filho
de Nícias e vários outros que estiveram na procissão.

Polemarco me disse: eu percebo, Sócrates, que você e sua
companheiro já está a caminho da cidade.

Você não está muito errado, eu disse.

O que você vê que teremos de lidar na preparação dos dados?

Aqui está o que vejo em uma rápida olhada:

  • Títulos de livro / capítulo (por exemplo, “LIVRO I.”).
  • Ortografia do inglês britânico (por exemplo, “honrado”)
  • Muita pontuação (por exemplo, “-“, “; -“, “? -“ e mais)
  • Nomes estranhos (por exemplo, “Polemarchus”).
  • Alguns longos monólogos que duram centenas de linhas.
  • Alguns diálogos citados (por exemplo, '…')

Essas observações, e mais, sugerem maneiras pelas quais podemos desejar preparar os dados do texto.

A maneira específica como preparamos os dados realmente depende de como pretendemos modelá-los, o que, por sua vez, depende de como pretendemos usá-los.

Design de modelo de linguagem

Neste tutorial, desenvolveremos um modelo de texto que podemos usar para gerar novas sequências de texto.

O modelo de linguagem será estatístico e irá prever a probabilidade de cada palavra dada uma seqüência de entrada de texto. A palavra prevista será alimentada como entrada para, por sua vez, gerar a próxima palavra.

Uma decisão importante de design é quanto tempo as sequências de entrada devem ter. Eles precisam ser longos o suficiente para permitir que o modelo aprenda o contexto para as palavras preverem. Este comprimento de entrada também definirá o comprimento do texto inicial usado para gerar novas sequências quando usamos o modelo.

Não existe uma resposta correta. Com tempo e recursos suficientes, poderíamos explorar a capacidade do modelo de aprender com sequências de entrada de tamanhos diferentes.

Em vez disso, escolheremos um comprimento de 50 palavras para o comprimento das sequências de entrada, um tanto arbitrariamente.

Poderíamos processar os dados de forma que o modelo sempre lidasse com frases independentes e preenchesse ou truncar o texto para atender a esse requisito para cada sequência de entrada. Você pode explorar isso como uma extensão deste tutorial.

Em vez disso, para manter o exemplo breve, deixaremos todo o texto fluir junto e treinaremos o modelo para prever a próxima palavra em sentenças, parágrafos e até mesmo livros ou capítulos no texto.

Agora que temos um design de modelo, podemos examinar a transformação do texto bruto em sequências de 50 palavras de entrada em 1 palavra de saída, pronto para se ajustar a um modelo.

Carregar Texto

O primeiro passo é carregar o texto na memória.

Podemos desenvolver uma pequena função para carregar todo o arquivo de texto na memória e devolvê-lo. A função é chamada load_doc () e está listado abaixo. Dado um nome de arquivo, ele retorna uma sequência de texto carregado.

Usando esta função, podemos carregar a versão mais limpa do documento no arquivo 'republic_clean.txt' do seguinte modo:

Executar este trecho carrega o documento e imprime os primeiros 200 caracteres como uma verificação de integridade.

LIVRO I.

Desci ontem ao Pireu com Glauco, filho de Ariston,
para que eu pudesse oferecer minhas orações à deusa (Bendis, a trácia
Artemis.); e também porque queria ver em que

Até agora tudo bem. A seguir, vamos limpar o texto.

Texto Limpo

Precisamos transformar o texto bruto em uma sequência de tokens ou palavras que podemos usar como fonte para treinar o modelo.

Com base na revisão do texto bruto (acima), abaixo estão algumas operações específicas que realizaremos para limpar o texto. Você pode querer explorar mais operações de limpeza como uma extensão.

  • Substitua '-' por um espaço em branco para que possamos dividir melhor as palavras.
  • Divida as palavras com base no espaço em branco.
  • Remova toda a pontuação das palavras para reduzir o tamanho do vocabulário (por exemplo, 'O quê?' Torna-se 'O quê').
  • Remova todas as palavras que não são alfabéticas para remover tokens de pontuação autônomos.
  • Normalize todas as palavras em minúsculas para reduzir o tamanho do vocabulário.

O tamanho do vocabulário é muito importante para a modelagem de linguagem. Um vocabulário menor resulta em um modelo menor que treina mais rápido.

Podemos implementar cada uma dessas operações de limpeza nesta ordem em uma função. Abaixo está a função clean_doc () que recebe um documento carregado como argumento e retorna uma matriz de tokens limpos.

Podemos executar esta operação de limpeza em nosso documento carregado e imprimir alguns dos tokens e estatísticas como uma verificação de integridade.

Primeiro, podemos ver uma boa lista de tokens que parecem mais limpos do que o texto bruto. Poderíamos remover o 'Livro I'marcadores de capítulo e muito mais, mas este é um bom começo.

Você também pode estar interessado em