Como desenvolver modelos de linguagem neural baseados em palavras em Python com Keras

Como desenvolver modelos de linguagem neural baseados em palavras em Python com Keras

A modelagem de linguagem envolve prever a próxima palavra em uma sequência, dada a sequência de palavras já presente.

Um modelo de linguagem é um elemento chave em muitos modelos de processamento de linguagem natural, como tradução automática e reconhecimento de fala. A escolha de como o modelo de linguagem é estruturado deve corresponder à forma como o modelo de linguagem deve ser usado.

Neste tutorial, você descobrirá como o enquadramento de um modelo de linguagem afeta a habilidade do modelo ao gerar sequências curtas de uma canção de ninar.

Depois de concluir este tutorial, você saberá:

  • O desafio de desenvolver um bom enquadramento de um modelo de linguagem baseado em palavras para um determinado aplicativo.
  • Como desenvolver enquadramentos de uma, duas palavras e linhas para modelos de linguagem baseados em palavras.
  • Como gerar sequências usando um modelo de linguagem de ajuste.

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.

Como desenvolver modelos de linguagem neural baseados em palavras em Python com Keras

Como desenvolver modelos de linguagem neural baseados em palavras em Python com Keras
Foto de Stephanie Chapman, alguns direitos reservados.

Visão geral do tutorial

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

  1. Framing Language Modeling
  2. Rima infantil de Jack e Jill
  3. Modelo 1: Sequências de uma palavra, uma palavra de saída
  4. Modelo 2: Sequência Linha a Linha
  5. Modelo 3: sequência de duas palavras, uma palavra de saída

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

Framing Language Modeling

Um modelo estatístico de linguagem é aprendido a partir do texto bruto e prevê a probabilidade da próxima palavra na sequência, dadas as palavras já presentes na sequência.

Os modelos de linguagem são um componente-chave em modelos maiores para desafiar problemas de processamento de linguagem natural, como tradução automática e reconhecimento de fala. Eles também podem ser desenvolvidos como modelos independentes e usados ​​para gerar novas sequências com as mesmas propriedades estatísticas do texto de origem.

Os modelos de linguagem aprendem e predizem uma palavra de cada vez. O treinamento da rede envolve o fornecimento de sequências de palavras como entrada que são processadas uma por vez, onde uma previsão pode ser feita e aprendida para cada sequência de entrada.

Da mesma forma, ao fazer previsões, o processo pode ser semeado com uma ou algumas palavras, então as palavras previstas podem ser reunidas e apresentadas como entrada em previsões subsequentes, a fim de construir uma sequência de saída gerada

Portanto, cada modelo envolverá a divisão do texto de origem em sequências de entrada e saída, de modo que o modelo possa aprender a prever palavras.

Existem muitas maneiras de enquadrar as sequências de um texto de origem para modelagem de linguagem.

Neste tutorial, exploraremos 3 maneiras diferentes de desenvolver modelos de linguagem baseados em palavras na biblioteca de aprendizado profundo Keras.

Não existe uma abordagem única e ideal, apenas diferentes enquadramentos que podem se adequar a diferentes aplicações.

Rima infantil de Jack e Jill

Jack and Jill é uma canção infantil simples.

É composto por 4 linhas, da seguinte forma:

Jack e Jill subiram a colina
Para buscar um balde de água
Jack caiu e quebrou sua coroa
E Jill veio cambaleando depois

Usaremos isso como nosso texto-fonte para explorar diferentes enquadramentos de um modelo de linguagem baseado em palavras.

Podemos definir esse texto em Python da seguinte maneira:

Modelo 1: Sequências de uma palavra, uma palavra de saída

Podemos começar com um modelo muito simples.

Dada uma palavra como entrada, o modelo aprenderá a prever a próxima palavra na sequência.

Por exemplo:

A primeira etapa é codificar o texto como inteiros.

Cada palavra minúscula no texto de origem recebe um número inteiro único e podemos converter as sequências de palavras em sequências de inteiros.

Keras fornece a classe Tokenizer que pode ser usada para realizar essa codificação. Primeiro, o Tokenizer é ajustado ao texto fonte para desenvolver o mapeamento de palavras para inteiros únicos. Então as sequências de texto podem ser convertidas em sequências de inteiros chamando o text_to_sequences () função.

Precisaremos saber o tamanho do vocabulário posteriormente para definir a camada de incorporação de palavras no modelo e para codificar palavras de saída usando uma codificação única.

O tamanho do vocabulário pode ser recuperado do Tokenizer treinado acessando o word_index atributo.

Executando este exemplo, podemos ver que o tamanho do vocabulário é de 21 palavras.

Adicionamos um, porque precisaremos especificar o inteiro para a maior palavra codificada como um índice de array, por exemplo, palavras codificadas de 1 a 21 com indícios de array de 0 a 21 ou 22 posições.

Em seguida, precisamos criar sequências de palavras para ajustar o modelo com uma palavra como entrada e uma palavra como saída.

A execução desta peça mostra que temos um total de 24 pares de entrada-saída para treinar a rede.

Podemos então dividir as sequências em entradas (X) e elementos de saída (y) Isso é simples, pois temos apenas duas colunas nos dados.

Ajustaremos nosso modelo para prever uma distribuição de probabilidade em todas as palavras do vocabulário. Isso significa que precisamos transformar o elemento de saída de um único inteiro em uma codificação única com um 0 para cada palavra no vocabulário e um 1 para a palavra real que representa o valor. Isso dá à rede uma verdade básica a ser buscada, a partir da qual podemos calcular o erro e atualizar o modelo.

Keras fornece o to_categorical () função que podemos usar para converter o inteiro em uma codificação única enquanto especificamos o número de classes como o tamanho do vocabulário.

Agora estamos prontos para definir o modelo de rede neural.

O modelo usa uma palavra aprendida embutida na camada de entrada. Isso tem um vetor de valor real para cada palavra no vocabulário, onde cada vetor de palavra tem um comprimento especificado. Neste caso, usaremos uma projeção de 10 dimensões. A sequência de entrada contém uma única palavra, portanto, o comprimento_de_entrada = 1.

O modelo possui uma única camada LSTM oculta com 50 unidades. Isso é muito mais do que o necessário. A camada de saída é composta por um neurônio para cada palavra no vocabulário e usa uma função de ativação softmax para garantir que a saída seja normalizada para parecer uma probabilidade.

A estrutura da rede pode ser resumida da seguinte forma:

Usaremos essa mesma estrutura geral de rede para cada exemplo neste tutorial, com pequenas alterações na camada de incorporação aprendida.

Em seguida, podemos compilar e ajustar a rede aos dados de texto codificados. Tecnicamente, estamos modelando um problema de classificação multiclasse (prever a palavra no vocabulário), portanto, usando a função de perda de entropia cruzada categórica. Usamos a implementação eficiente de Adam de descida gradiente e precisão de rastreamento no final de cada época. O modelo é adequado para 500 períodos de treinamento, novamente, talvez mais do que o necessário.

A configuração da rede não foi ajustada para este e experimentos posteriores; uma configuração prescrita em excesso foi escolhida para garantir que pudéssemos nos concentrar no enquadramento do modelo de linguagem.

Depois que o modelo é ajustado, nós o testamos passando uma determinada palavra do vocabulário e fazendo com que o modelo preveja a próxima palavra. Aqui nós passamos 'Jack'codificando e chamando model.predict_classes () para obter a saída de número inteiro para a palavra prevista. Esta...

Você também pode estar interessado em