Search
Close this search box.
Python NLP: como fazer a IA entender linguagem?
Python NLP

Posts Relacionados:

Processamento de linguagem natural (natural language processing, NLP) é um dos ramos mais importantes da inteligência artificial (IA). Mas como suas técnicas são implementadas? Neste post, exploraremos as ferramentas e conceitos práticos essenciais de NLP com Python. Como será que eles fazem a IA entender linguagem?

Receba nossa newsletter

É impossível interagir com ferramentas de inteligência artificial (IA) como Gemini e ChatGPT e não se fascinar por suas capacidades. Mas que tecnologia é essa que possibilita que computadores entendam e até gerem linguagem humana? Essa tecnologia se chama processamento de linguagem natural (Natural Language Processing, NLP), um ramo absolutamente fascinante da IA (clique aqui para saber mais).

Atualmente, o interesse por NLP está explodindo e existem ótimas razões para isso. As técnicas da área são o centro de várias aplicações de IA que antes eram apenas um sonho. Consequentemente, dominar as ferramentas de NLP abre um amplo leque de possibilidades.

Python NLP?

Assim como ocorre com outros ramos da IA, Python é a linguagem de escolha para o desenvolvimento e implementação de NLP. Python tem sintaxe clara, é versátil, pode ser facilmente otimizado para ganhar aceleração (aqui e aqui) e tem um amplo ecossistema de bibliotecas, incluindo algumas específicas para tarefas de processamento de linguagem natural. Portanto, neste post, o foco será nas técnicas principais de Python NLP.

NLP na Prática

De forma geral, os modelos de NLP têm como foco extrair significados da linguagem e/ou gerar linguagem natural. Para realizar tais objetivos, esses modelos são desenhados para encontrar relações entre as partes constituintes da linguagem. Porém, computadores não entendem palavras. Eles entendem apenas números. Portanto, para que os computadores possam usar a linguagem em modelos, as palavras devem ser traduzidas em números. Mais precisamente, em vetores.

Essa transformação ocorre por meio de várias etapas. Elas podem incluir: pré-processamento de dados, análises linguísticas, extração de recursos e, finalmente, a modelagem. Cada uma dessas etapas pode envolver o uso de vários algoritmos e contar com o auxílio de diferentes bibliotecas para tarefas de Python NLP. Além disso, as etapas específicas usadas e os algoritmos selecionados variam de projeto a projeto. 

Pré-Processamento

O pré-processamento de dados para tarefas de linguagem foi tema de outra postagem. Resumidamente, ele pode conter etapas de tokenização, limpeza, normalização, lematização/stemming. A tokenização consiste na divisão do texto bruto em unidades individuais chamadas tokens. Limpeza envolve a remoção de palavras comuns que carregam pouco significado, remoção de pontuações, emojis, URLs, etc. Normalização pode incluir a conversão dos textos em letras minúsculas, manipulações de abreviações e correções gramaticais. Lematização e stemming são técnicas de redução das palavras a suas formas-raiz. Para várias dessas etapas do pré-processamento, bibliotecas Python NLP como spaCy e NLTK são essenciais.

Mas note: nem todos os projetos de NLP precisam passar pelas mesmas etapas de pré-processamento. Por exemplo, para aplicações de análise de sentimentos, remoções de emojis e pontuações não são recomendadas.

Análise Linguística

Para muitas tarefas de NLP, a inclusão de análises linguísticas é fundamental. Elas podem envolver identificações do papel gramatical de palavras em textos, análises das estruturas de sentenças, classificações de palavras, entre outras. As principais técnicas de análises linguísticas são:

Marcação de parte da fala (part of speech (POS) tagging): identifica o papel gramatical de cada palavra num trecho de texto.

Análise da estrutura frasal: analisa as relações de dependências entre as palavras de textos.

Reconhecimento de entidade nomeada (NER): técnica usada para classificar palavras em categorias como pessoas, lugares ou organizações.

As bibliotecas spaCy e NLTK têm funcionalidades próprias para auxiliar em cada uma dessas análises linguísticas.

Extração de Recursos

A extração de recursos é uma etapa fundamental no desenvolvimento de aplicativos de NLP. Como mencionado anteriormente, modelos de NLP não podem processar textos diretamente. A maioria das técnicas de machine learning usadas para NLP trabalha com números que descrevem um documento em relação ao corpus que o contém. A extração de recursos, portanto, envolve a conversão de palavras em suas representações numéricas apropriadas. Existem diversas técnicas para realizar essa conversão. Elas incluem desde técnicas de vetorização simples como Bag-of-Words até técnicas avançadas de word embeddings (incorporação de palavras).

Bag-of-Words (BoW)

BoW é um algoritmo simples para transformar dados de textos em representações vetoriais. Ele cria um vetor para cada documento de um conjunto de dados. O comprimento do vetor é igual ao tamanho do vocabulário criado. Cada elemento no vetor representa a contagem de quantas vezes uma palavra do vocabulário aparece no documento. BoW extrai recursos numericamente de forma simples e flexível, mas sem considerar relações de dependência, gramática ou a ordem das palavras.

				
					# BoW com scikit-learn
from sklearn.feature_extraction.text import CountVectorizer

# Conjunto de documentos
documentos = ['Esse é o primeiro documento.',
        'Esse é o segundo documento.',
        'Esse é o terceiro documento.']

# Cria modelo BoW
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(documentos) # aplica modelo nos textos

print(f"Nomes dos recursos: {vectorizer.get_feature_names_out()}") # Imprime o nome dos recursos
print(f"Matriz do documento: {X.toarray()}") # Imprime a matriz com os vetores criados

				
			
				
					Nomes dos recursos: ['documento' 'esse' 'primeiro' 'segundo' 'terceiro']
Matriz do documento: [[1 1 1 0 0]
 [1 1 0 1 0]
 [1 1 0 0 1]]
				
			

Term Frequency-Inverse Document Frequency (TF-IDF)

TF-IDF é um algoritmo que supera algumas limitações do BoW. O BoW não considera a importância das palavras de um documento em relação a todo o corpus (coleção de documentos). Algumas palavras podem ser frequentes em muitos documentos e não carregar informações significativas. É aqui que o TF-IDF entra em jogo. O TF-IDF supera as limitações do BoW atribuindo pesos às palavras com base em sua importância em um documento em relação à coleção de documentos. Ou seja, em essência, a vetorização TF-IDF descreve o quão importante cada palavra é para um conjunto de documentos.

O termo TF se refere à medida da frequência de ocorrências de cada palavra em cada documento de um corpus. O IDF mede a importância de uma palavra em todo o acervo documental de um conjunto de dados. Para cada palavra, ele é calculado como o logaritmo do número de documentos no corpus dividido pelo número de documentos que incluem a palavra. A importância real de uma palavra é indicada pela combinação dos valores de TF e IDF.

				
					# TF-IDF com scikit-learn
# veja detalhes aqui: https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html
from sklearn.feature_extraction.text import TfidfVectorizer

# Conjunto de documentos
documentos = ['Esse é o primeiro documento.',
        'Esse é o segundo documento.',
        'Esse é o terceiro documento.']

# Cria modelo BoW
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(documentos) # aplica modelo nos textos

print(f"Nomes dos recursos: {vectorizer.get_feature_names_out()}") # Imprime o nome dos recursos
print(f"Matriz do documento: {X.toarray()}") # Imprime a matriz com os vetores criados

				
			
				
					Nomes dos recursos: ['documento' 'esse' 'primeiro' 'segundo' 'terceiro']
Matriz do documento: [[0.45329466 0.45329466 0.76749457 0.         0.        ]
 [0.45329466 0.45329466 0.         0.76749457 0.        ]
 [0.45329466 0.45329466 0.         0.         0.76749457]]
				
			

Word Embedding (Incorporação de Palavras)

Word embeddings são métodos avançados de extração de recursos. Eles “incorporam” palavras em espaços vetoriais n-dimensionais contínuos, capturando relações semânticas e nuances contextuais. Cada palavra é representada por um vetor de valor real, mas com dezenas ou centenas de dimensões. Cada dimensão mapeia algum tipo de relação entre as palavras. Palavras com significados equivalentes tem representações semelhantes.

Há uma teoria linguística por trás dessa abordagem: a “hipótese distribucional” de Zellig Harris. Ela afirma que palavras que têm contexto semelhante têm significados semelhantes.

O sucesso dos métodos de word embedding está na forma como as palavras são mapeadas. Os métodos de incorporação de palavras aprendem uma representação vetorial de valor real. O processo de aprendizagem costuma ser feito com redes neurais.

Existem várias técnicas de word embedding. Suas diferenças principais residem na estrutura das redes usadas e no tipo de treinamento empregado. A biblioteca Keras, por exemplo, tem uma camada denominada Embedding Layer que cria representações vetoriais para um vocabulário como parte do treinamento de uma tarefa. SpaCy também tem representações vetoriais que podem ser usadas como embeddings. Além dessas estratégias, existem várias outras abordagens de wording embedding. A seguir, nos concentraremos em duas bastante populares: Word2Vec e BERT.

Word2Vec

Word2Vec é uma técnica bastante popular para “incorporar” palavras em espaços vetoriais n-dimensionais. Ela usa uma rede neural para aprender incorporações de palavras de alta dimensão a partir de textos brutos. Cada palavra recebe uma única representação vetorial fixa. Esse vetor é criado com base em suas palavras circundantes num determinado corpus textual. A técnica tem duas variações: Continuous Bag of Words (CBOW) e Skip-gram.

No CBOW, o modelo tenta prever uma palavra-alvo a partir de palavras circundantes. As palavras circundantes são usadas como entrada, e a palavra-alvo é a saída. O modelo é treinado para minimizar a diferença entre as palavras-alvo previstas e reais. Já o modelo Skip-gram precisa prever palavras circundantes a partir de palavras-alvo usadas como entrada. O objetivo do treinamento do modelo é minimizar a diferença entre as palavras circundantes previstas e reais.

Incorporações com Word2Vec podem ser criadas com a biblioteca Gensim (Python NLP). Também existem modelos treinados de word embeddings com Word2Vec disponíveis em repositórios online. Nesse repositório, por exemplo, existem vários modelos específicos para português.

Word2Vec é relativamente rápido de treinar e mais simples de usar em comparação com modelos mais avançados. Porém, como cada palavra recebe uma única representação vetorial fixa em seu espaço vetorial, a técnica é susceptível a apresentar ambiguidades (polissemia). Essas ambiguidades são mais raras em modelos de word embedding dinâmicos como BERT.

BERT
BERT

BERT (Bidirectional Encoder Representations from Transformers) é um modelo de linguagem pré-treinado com arquitetura Transformer. Ele pode ser submetido a ajuste fino para criar modelos de última geração para uma ampla gama de tarefas. Portanto, o BERT é altamente adaptável e eficaz para várias tarefas de NLP.

O BERT consegue aprender representações de palavras ricas e contextualizadas. Em consequência, ele pode ser usado para gerar word embeddings de alta qualidade. Ele gera incorporações de palavras que mudam dinamicamente dependendo do contexto em que a palavra aparece (veja mais sobre incorporações com BERT aqui e aqui).

O BERT captura significados contextuais de palavras de forma muito melhor do que incorporações estáticas criadas por algoritmos como Word2Vec. Obviamente, essa diferença garante um desempenho superior em muitas tarefas de NLP. Mas isso tem um custo computacional elevado. Para muitas situações, alternativas como Word2Vec são mais adequadas.

O BERT está disponível na plataforma da Hugging Face para quem deseja treinar word embeddings de alta qualidade para aplicações específicas. Também vale a pena dar uma boa olhada no BERTimbau treinado especificamente para português do Brasil.

BERTimbau

Modelagem

Depois que os dados são pré-processados e seus recursos são extraídos, eles são usados para alimentar um modelo de NLP. De forma bem geral, a modelagem pode ser entendida como a etapa de criação de um mapeamento. Um modelo consiste em um conjunto de operações matemáticas e computacionais que mapeiam dados de entradas em dados de saídas. A modelagem em NLP ajuda a preencher a lacuna entre a linguagem humana e os computadores. Seus modelos têm como objetivos compreender a linguagem humana e, em alguns casos, gerar linguagem também.

Existem várias estratégias de modelagem que podem ser empregadas em tarefas de NLP. Elas pertencem a dois grupos principais. A área de NLP é dominada por técnicas tradicionais de machine learning e modelos com arquiteturas avançadas de redes neurais e deep learning.

Algoritmos de machine learning são muito populares em aplicações de processamento de linguagem natural em função de sua capacidade de aprender com os dados. Isso confere a eles a habilidade de extrair padrões complexos eficientemente. Técnicas tradicionais de machine learning como regressão logística apresentam bons desempenhos em diversas tarefas de NLP e possuem baixo custo computacional. Porém, para aplicações avançadas de NLP, modelos de deep learning são fundamentais.

Arquiteturas de redes neurais profundas especializadas, como Seq2Seq e Transformers, são necessárias para capturar padrões de linguagem complexos. Mas isso tem um custo computacional alto e, para muitas aplicações, não é a melhor estratégia. Felizmente, para situações que precisam de ferramentas avançadas, uma opção viável é o uso de modelos pré-treinados. Nesse quesito, a biblioteca Hugging Face Transformers é a mais indicada. Ela conta com inúmeros modelos pré-treinados para as mais variadas aplicações.

Para Terminar

Cobrimos um monte de coisas nesta exploração sobre as técnicas de processamento de linguagem natural. Desde as etapas essenciais de pré-processamento e análise linguística até as complexidades da extração de recursos e modelagem, mostramos um panorama de como a área de NLP pode ser usada para extrair insights e significados de dados brutos de texto. Não importa se você está criando um chatbot ou deseja implementar uma ferramenta para resumir documentos grandes, os conceitos que discutimos formam uma base fundamental. O próximo passo é claro: pegue essas técnicas e coloque-as em prática. Conhecer a área é uma tarefa com muita exploração e experimentação. O processamento de linguagem natural, juntamente com o Python, permite transformar dados não estruturados em aplicativos poderosos e de alto valor comercial.

Para conhecer mais sobre a área, veja uma descrição sobre suas principais bibliotecas aqui. Conheça as capacidades da excelente biblioteca spaCy aqui. A NLTK tem um livro online ótimo. Outros livros bons podem ser encontrados aqui e aqui. Além disso, existem cursos e materiais disponíveis em sites como Coursera e YouTube.

Imagem com IA Generativa – Dia 274

IA generativa img 274

Arte com IA generativa: imagem do dia

Todos os dias, postamos um exemplo de imagem artística gerada com inteligência artificial.

Tutoriais

Postagens Mais Recentes

Outras Postagens Que Podem Interessar

Veja
Mais

Fique em contato

Se inscreva para receber nossa newsletter com novidades.

aprendiz artificial