Processamento de Linguagem Natural com Python
Nosso mundo atual está inundado por palavras. Artigos de notícias, feeds de mídia social, avaliações de clientes, postagens — a linguagem nos cerca constantemente. Mas, e se pudéssemos aproveitar o poder da linguagem para resolver problemas e construir sistemas mais inteligentes? Esses são alguns dos potenciais do processamento de linguagem natural (natural language processing, NLP).
O processamento da linguagem natural é um ramo da inteligência artificial (IA) dedicado a desenvolver algoritmos capazes de entender e manipular a linguagem humana. No centro da criação desses algoritmos está uma ferramenta poderosa: o Python. A popularidade do Python no mundo da IA e dos algoritmos de machine learning não é segredo. Mas, neste post, nos concentraremos no poder do Python especificamente para tarefas de processamento da linguagem natural.
Com sua sintaxe clara, vasto ecossistema de bibliotecas e comunidade ativa, o Python oferece uma plataforma perfeita para aplicações com processamento de linguagem. Mas navegar no cenário em constante expansão das bibliotecas Python não é fácil. Com novas opções surgindo rapidamente, escolher a biblioteca apropriada para um projeto pode ser complicado. Por isso, neste post, exploraremos as principais ferramentas disponíveis e suas principais características.
NLTK
NLTK (Natural Language Toolkit) é uma das bibliotecas mais tradicionais para processamento de linguagem natural. Com funcionalidades que cobrem desde tokenização até a classificação de textos, a NLTK tem amplo leque de aplicações. Consequentemente, ela é bastante empregada para limpeza e pré-processamento de textos, extração de recursos e criação de modelos de linguagem.
Para desempenhar suas diversas funções, a biblioteca NLTK conta com uma diversificada coleção de módulos. Cada módulo da NLTK atende a tarefas específicas de processamento de linguagem natural. Entre os principais módulos da NLTK estão:
NLTK Text: reúne uma variedade de funcionalidades para análise de textos.
NLTK Data: fornece acesso a conjuntos de dados pré-criados perfeitos para treinar modelos de machine learning.
Tokenizers: módulo específico para tarefas de divisão de textos em palavras, frases ou até caracteres.
# exemplo de tokenizers com a NLTK
import nltk
from nltk.tokenize import word_tokenize, sent_tokenize
exemplo = "Minha terra tem palmeiras Onde canta o sabiá. As aves que aqui gorjeiam Não gorjeiam como lá."
tokenizer_palavras = word_tokenize(exemplo)
tokenizer_sentencas = sent_tokenize(exemplo)
output:
['Minha', 'terra', 'tem', 'palmeiras', 'Onde', 'canta', 'o', 'sabiá', '.', 'As', 'aves', 'que', 'aqui', 'gorjeiam', 'Não', 'gorjeiam', 'como', 'lá', '.']
['Minha terra tem palmeiras Onde canta o sabiá.', 'As aves que aqui gorjeiam Não gorjeiam como lá.']
NLTK Downloader: permite o acesso a recursos linguísticos essenciais como corpora (coleções de textos).
Stemmers e Lemmatizers: realizam a redução das palavras às suas formas-base.
Part-of-Speech Tagging: realiza atribuições de rótulos gramaticais como substantivo, verbo ou adjetivo em cada palavra de um texto.
Named Entity Recognition (NER): para identificação e classificação de entidades nomeadas como pessoas, organizações e locais.
Sentiment Analysis (análise de sentimento): para avaliar o tom emocional de textos.
Além desses módulos, a NLTK conta com pacotes para tarefas avançadas de processamento de linguagem natural como classificações (nltk.classify), traduções (nltk.translate) e chatbots (nltk.chat).
Nem todas as funcionalidades da NLTK têm suporte para o português. Mas, mesmo para as funcionalidades sem suporte direto, a NLTK fornece recursos valiosos para inúmeros projetos.
SpaCy
import spacy
nlp = spacy.load("pt_core_news_sm") # um dos modelos pré-treinados para português
Os algoritmos da SpaCy são otimizados para garantir um processamento extremamente rápido, mesmo para grandes conjuntos de dados. Entre algumas das principais funcionalidades da SpaCy estão:
Reconhecimento de Entidade Nomeada (NER): realiza identificações de entidades nomeadas como pessoas, organizações e locais.
Análise de dependências: consegue extrair intrincadas relações entre palavras em textos.
Similaridades de textos: as representações vetoriais da SpaCy permitem medir as similaridades entre textos.
A SpaCy possui design modular e sua arquitetura é otimizada para trabalhar com pipelines customizadas. Numa pipeline, apenas os módulos necessários para um projeto são chamados e organizados na sequência apropriada.
TextBlob
TextBlob funciona sobre a biblioteca NLTK. Sua grande vantagem é ser muito amigável. Ela possui uma API simples para tarefas comuns de processamento de linguagem natural como:
Análise de Sentimentos: determina a polaridade, subjetividade e intensidade emocional de textos.
Part-of-Speech Tagging: identifica as categorias gramaticais das palavras de uma frase como substantivos, verbos, adjetivos, entre outros.
Reconhecimento de Entidade Nomeada (NER): extrai dados como nomes de pessoas, organizações e locais.
Extração de Frase Nominal: identifica os assuntos centrais em textos. Essa funcionalidade é especialmente importante para tarefas como modelagem de tópicos.
Correção de Textos: realiza correções em erros de escrita.
Para garantir eficiência, a biblioteca TextBlob conta com modelos pré-treinados e algoritmos otimizados que permitem a obtenção de resultados rapidamente. Porém, ela não possui suporte para português em todas as suas funcionalidades.
Gensim
Gensim é repleta de funcionalidades especializadas. Entre algumas de suas principais capacidades estão:
Modelagem de tópicos: Gensim possui diversos algoritmos de modelagem de tópicos, como a Alocação Latente de Dirichlet. Eles são utilizados para descobrir automaticamente clusters temáticos em grandes coleções de documentos.
Incorporação de palavras (word embedding): a biblioteca conta com várias técnicas de incorporação de palavras, como Word2Vec e FastText. Essas técnicas são usadas para transformar palavras e textos em vetores numéricos, capturando suas relações semânticas. Esses vetores são essenciais para tarefas como cálculos de similaridade de textos, traduções automáticas e até desenvolvimento de chatbots.
Medidas de similaridade: cálculos de similaridade semântica entre textos usando métricas como similaridade Jaccard e similaridade por cosseno.
Hugging Face Transformers
Hugging Face Transformers é outra biblioteca que vai muito além das operações tradicionais de processamento de linguagem natural. Seu ponto forte é contar com diversos modelos pré-treinados. Esses modelos são extremamente avançados e podem ser ajustados para projetos específicos e adquirir desempenhos excelentes.
Como o nome indica, os modelos da Hugging Face são transformers. Ou seja, são modelos de deep learning modernos e capazes de apresentar desempenhos bem acima de outras técnicas de machine learning especialmente para problemas complexos. Para tarefas de processamento de linguagem natural, uma das vantagens dos modelos transformers é a compreensão de contextos.
Os modelos pré-treinados da Hugging Face comumente rodam sobre o PyTorch. Portanto, eles não são amigáveis para iniciantes. Conhecer PyTorch extensamente não é um pré-requisito para usar a Hugging Face Transformers. Mas é fundamental ter conhecimento de Python e de redes neurais e deep learning. Para quem tem esses requisitos, a Hugging Face conta com uma comunidade vibrante e altamente colaborativa. Esses pontos, em conjunto com sua extensa documentação, garantem o suporte necessário para o desenvolvimento de projetos complexos e avançados.
A Hugging Face Transformers possui com modelos para diversas finalidades de processamento de linguagem natural. Entre elas estão: criação de resumos, traduções, análise de sentimentos, chatbots conversacionais, geração de textos, entre muitas outras.
# exemplo de código com Hugging Face Transformers para geração de textos
from transformers import AutoTokenizer, AutoModelWithLMHead
import torch
tokenizer = AutoTokenizer.from_pretrained("pierreguillou/gpt2-small-portuguese")
model = AutoModelWithLMHead.from_pretrained("pierreguillou/gpt2-small-portuguese")
tokenizer.model_max_length=1024
model.eval()
text = "Quem era Jim Henson? Jim Henson era um"
inputs = tokenizer(text, return_tensors="pt")
sample_outputs = model.generate(inputs.input_ids,
pad_token_id=50256,
do_sample=True,
max_length=50,
top_k=40,
num_return_sequences=1)
for i, sample_output in enumerate(sample_outputs):
print(">> Generated text {}\n\n{}".format(i+1, tokenizer.decode(sample_output.tolist())))
output:
Quem era Jim Henson? Jim Henson era um estudante em uma escola de negócios em Nova York que se tornou uma das pessoas mais ricas. Porém, ele fez muito mal e acabou sendo hospitalizado em seu bairro quando resolveu se mudar para Los Angeles.
Hugging Face Transformers tem design modular, o que permite que desenvolvedores usem apenas os recursos necessários para um projeto. Ela também é otimizada para velocidade e desempenho, mas seus modelos costumam ser grandes e podem ter alto custo computacional. Porém, a qualidade que eles apresentam em tarefas de processamento de linguagem natural complexas e avançadas vale o investimento em várias situações.