Como codificar dados de texto para aprendizado de máquina com scikit-learn

Como codificar dados de texto para aprendizado de máquina com scikit-learn

Os dados de texto requerem preparação especial antes de começar a usá-los para modelagem preditiva.

O texto deve ser analisado para remover palavras, chamado de tokenização. Em seguida, as palavras precisam ser codificadas como inteiros ou valores de ponto flutuante para uso como entrada para um algoritmo de aprendizado de máquina, chamado de extração de recurso (ou vetorização).

A biblioteca scikit-learn oferece ferramentas fáceis de usar para executar tokenização e extração de recursos de seus dados de texto.

Neste tutorial, você descobrirá exatamente como pode preparar seus dados de texto para modelagem preditiva em Python com scikit-learn.

Depois de concluir este tutorial, você saberá:

  • Como converter texto em vetores de contagem de palavras com CountVectorizer.
  • Como converter texto em vetores de frequência de palavras com TfidfVectorizer.
  • Como converter texto em inteiros exclusivos com HashingVectorizer.

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 preparar dados de texto para aprendizado de máquina com scikit-learn

Como preparar dados de texto para aprendizado de máquina com scikit-learn
Foto de Martin Kelly, alguns direitos reservados.

Modelo Bag-of-Words

Não podemos trabalhar com texto diretamente ao usar algoritmos de aprendizado de máquina.

Em vez disso, precisamos converter o texto em números.

Podemos querer realizar a classificação de documentos, então cada documento é um “entrada”E um rótulo de classe é o“resultado”Para nosso algoritmo preditivo. Os algoritmos tomam vetores de números como entrada, portanto, precisamos converter documentos em vetores de números de comprimento fixo.

Um modelo simples e eficaz para pensar sobre documentos de texto em aprendizado de máquina é chamado de Modelo Bag-of-Words, ou Arco.

O modelo é simples, pois descarta todas as informações de ordem das palavras e se concentra na ocorrência de palavras em um documento.

Isso pode ser feito atribuindo a cada palavra um número exclusivo. Então, qualquer documento que vemos pode ser codificado como um vetor de comprimento fixo com o comprimento do vocabulário de palavras conhecidas. O valor em cada posição no vetor pode ser preenchido com uma contagem ou frequência de cada palavra no documento codificado.

Este é o modelo do saco de palavras, em que nos preocupamos apenas com esquemas de codificação que representam quais palavras estão presentes ou o grau em que estão presentes em documentos codificados sem qualquer informação sobre a ordem.

Para saber mais sobre o modelo do saco de palavras, consulte o tutorial:

Existem muitas maneiras de estender este método simples, ambos esclarecendo melhor o que é um “palavra”É e na definição do que codificar sobre cada palavra no vetor.

A biblioteca scikit-learn oferece 3 esquemas diferentes que podemos usar, e veremos cada um brevemente.

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

Contagem de palavras com CountVectorizer

O CountVectorizer fornece uma maneira simples de tokenizar uma coleção de documentos de texto e construir um vocabulário de palavras conhecidas, mas também de codificar novos documentos usando esse vocabulário.

Você pode usá-lo da seguinte maneira:

  1. Crie uma instância do CountVectorizer aula.
  2. Ligar para ajuste() função para aprender um vocabulário de um ou mais documentos.
  3. Ligar para transformar() função em um ou mais documentos conforme necessário para codificar cada um como um vetor.

Um vetor codificado é retornado com um comprimento de todo o vocabulário e uma contagem inteira para o número de vezes que cada palavra apareceu no documento.

Como esses vetores conterão muitos zeros, os chamamos de esparsos. Python fornece uma maneira eficiente de lidar com vetores esparsos no pacote scipy.sparse.

Os vetores retornados de uma chamada para transform () serão vetores esparsos e você pode transformá-los de volta em matrizes numpy para ver e entender melhor o que está acontecendo chamando a função toarray ().

Abaixo está um exemplo de uso do CountVectorizer para tokenizar, construir um vocabulário e, em seguida, codificar um documento.

Acima, você pode ver que acessamos o vocabulário para ver o que exatamente foi tokenizado chamando:

Podemos ver que todas as palavras foram feitas em minúsculas por padrão e que a pontuação foi ignorada. Esses e outros aspectos da tokenização podem ser configurados e eu encorajo você a revisar todas as opções na documentação da API.

Executar o exemplo primeiro imprime o vocabulário e, em seguida, a forma do documento codificado. Podemos ver que há 8 palavras no vocabulário e, portanto, os vetores codificados têm um comprimento de 8.

Podemos então ver que o vetor codificado é uma matriz esparsa. Finalmente, podemos ver uma versão de array do vetor codificado mostrando uma contagem de 1 ocorrência para cada palavra, exceto o (índice e id 7) que tem uma ocorrência de 2.

É importante ressaltar que o mesmo vetorizador pode ser usado em documentos que contenham palavras não incluídas no vocabulário. Essas palavras são ignoradas e nenhuma contagem é fornecida no vetor resultante.

Por exemplo, a seguir está um exemplo de uso do vetorizador acima para codificar um documento com uma palavra no vocabulário e uma palavra que não está.

A execução deste exemplo imprime a versão do array do vetor esparso codificado, mostrando uma ocorrência de uma palavra no vocabulário e a outra palavra que não está no vocabulário completamente ignorada.

Os vetores codificados podem então ser usados ​​diretamente com um algoritmo de aprendizado de máquina.

Frequências de palavras com TfidfVectorizer

A contagem de palavras é um bom ponto de partida, mas é muito básica.

Um problema com contagens simples é que algumas palavras como “a”Aparecerá muitas vezes e suas grandes contagens não serão muito significativas nos vetores codificados.

Uma alternativa é calcular as frequências das palavras e, de longe, o método mais popular é o TF-IDF. Este é um acrônimo que significa “Frequência do termo - Documento inverso”Frequência que são os componentes das pontuações resultantes atribuídas a cada palavra.

  • Frequência do termo: Resume a frequência com que uma determinada palavra aparece em um documento.
  • Frequência inversa do documento: Isso reduz as palavras que aparecem muito nos documentos.

Sem entrar em matemática, TF-IDF são pontuações de frequência de palavras que tentam destacar palavras que são mais interessantes, por exemplo, frequentes em um documento, mas não entre documentos.

O TfidfVectorizer irá tokenizar documentos, aprender o vocabulário e pesos de frequência inversa de documentos e permitir que você codifique novos documentos. Como alternativa, se você já tiver um CountVectorizer reconhecido, poderá usá-lo com um TfidfTransformer para apenas calcular as frequências inversas do documento e iniciar a codificação de documentos.

O mesmo processo de criação, ajuste e transformação é usado com o CountVectorizer.

Abaixo está um exemplo de uso do TfidfVectorizer para aprender vocabulário e frequências inversas de documentos em 3 pequenos documentos e, em seguida, codificar um desses documentos.

Um vocabulário de 8 palavras é aprendido a partir dos documentos e cada palavra recebe um índice inteiro exclusivo no vetor de saída.

As frequências inversas dos documentos são calculadas para cada palavra do vocabulário, atribuindo-se a pontuação mais baixa de 1,0 à palavra mais frequentemente observada: “a”No índice 7.

Finalmente, o primeiro documento é codificado como uma matriz esparsa de 8 elementos e podemos revisar as pontuações finais de cada palavra com valores diferentes para “a“,“Raposa", e "cão”Das outras palavras do vocabulário.

As pontuações são normalizadas para valores entre 0 e 1 e os vetores de documentos codificados podem ser usados ​​diretamente com a maioria dos algoritmos de aprendizado de máquina.

Hashing com HashingVectorizer

Contagens e frequências podem ser muito úteis, mas uma limitação desses métodos é que o vocabulário pode se tornar muito grande.

Isso, por sua vez, exigirá grandes vetores para codificar documentos e imporá grandes requisitos de memória e algoritmos de lentidão.

Uma solução inteligente é usar um hash unilateral de palavras para convertê-las em inteiros. A parte inteligente é que nenhum vocabulário é necessário e você pode escolher um vetor de comprimento fixo longo arbitrário. Uma desvantagem é que o hash é uma função unilateral, então não há como converter a codificação de volta em uma palavra (o que pode não importar para muitas tarefas de aprendizado supervisionado).

A classe HashingVectorizer implementa essa abordagem que pode ser usada para hash palavras consistentes e, em seguida, tokenizar e codificar documentos conforme necessário.

O exemplo abaixo demonstra o ...

Você também pode estar interessado em