O que é o NLTK?
O Natural Language Toolkit (NLTK) é uma biblioteca Python amplamente utilizada para pesquisa e desenvolvimento em Processamento de Linguagem Natural (PLN). Ela oferece interfaces fáceis de usar para trabalhar com mais de 50 corpora e recursos lexicais, além de ferramentas para classificação, tokenização, lematização, marcação de partes do discurso e análise sintática.
Exploração de Textos
A biblioteca inclui um módulo de amostras que facilita o aprendizado de suas funcionalidades. Podemos realizar buscas de concordância (encontrar palavras e seus contextos), identificar termos similares e analisar a distribuição lexical ao longo de um documento.
import nltk
# Baixa os dados de exemplo necessários
nltk.download('book')
from nltk.book import text1, text2
# Atribuindo a variáveis locais para facilitar a leitura
texto_base = text1
texto_complementar = text2
# Busca de concordância para uma palavra específica
print("Buscando o termo 'monstrous':")
texto_base.concordance('monstrous')
# Identificação de palavras que aparecem em contextos similares
print("\nTermos com contextos similares a 'monstrous':")
texto_complementar.similar('monstrous')
# Contextos compartilhados entre múltiplas palavras
print("\nContextos comuns para 'monstrous' e 'very':")
texto_complementar.common_contexts(['monstrous', 'very'])
# Gráfico de dispersão lexical
texto_base.dispersion_plot(['citizens', 'democracy', 'freedom', 'duties', 'America'])
Contagem e Estatísticas de Vocabulário
A análise textual frequentemente envolve a avaliação da riqueza do vocabulário e da frequência de palavras. Podemos calcular o tamanho total do texto, o número de termos únicos e a densidade lexical.
def calcular_densidade_lexical(corpus):
"""Calcula a repetição média de cada termo no corpus."""
total_palavras = len(corpus)
palavras_unicas = len(set(corpus))
return total_palavras / palavras_unicas
# Estatísticas do texto
tamanho_total = len(texto_base)
vocabulario_unico = sorted(set(texto_base))
densidade = calcular_densidade_lexical(texto_base)
print(f"Total de palavras: {tamanho_total}")
print(f"Densidade lexical: {densidade:.2f}")
# Frequência de uma palavra específica
ocorrencias = texto_base.count('smote')
percentual = (ocorrencias / tamanho_total) * 100
print(f"A palavra 'smote' aparece {ocorrencias} vezes ({percentual:.4f}% do texto).")
Listas e Distribuição de Frequências
No Python, textos são tratados como listas de palavras. Podemos fatiar (slicing) essas listas para extrair segmentos específicos. Além disso, a classe FreqDist do NLTK permite calcualr distribuições de frequência de maneira eficiente.
from nltk import FreqDist
# Exemplo de fatiamento de lista
frase_exemplo = ['O', 'Processamento', 'de', 'Linguagem', 'Natural', 'é', 'fascinante']
sub_lista = frase_exemplo[1:4]
print(f"Sub-lista extraída: {sub_lista}")
# Distribuição de frequência
distribuicao = FreqDist(texto_base)
print(distribuicao)
# Gráfico acumulativo das palavras mais frequentes
distribuicao.plot(50, cumulative=True)
Filtragem de Vocabulário e Colocações
Podemos refinar nossa análise filtrando palavras muito curtas ou raras, focando em termos com características específicas (como comprimento mínimo e frequência mínima). Além disso, a análise de bigramas (pares de palavras consecutivas) ajuda a encontrar colocações relevantes.
from nltk.util import bigrams
# Filtrando palavras longas e frequentes
vocabulario = set(texto_base)
termos_relevantes = [termo for termo in vocabulario if len(termo) > 7 and distribuicao[termo] > 7]
termos_ordenados = sorted(termos_relevantes)
# Encontrando colocações (pares de palavras que ocorrem juntas frequentemente)
print("\nColocações encontradas:")
texto_base.collocations()
# Gerando bigramas manualmente
lista_teste = ['mais', 'é', 'feito', 'do', 'que', 'dito']
pares = list(bigrams(lista_teste))
print(f"Bigramas: {pares}")
Distribuição do Comprimento das Palavras
A distribuição do tamanho das palavras em um texto pode revelar traços estilísticos do autor. Podemos mapear a frequência de cada comprimento de palavra.
# Mapeando o comprimento de cada palavra
comprimentos = [len(palavra) for palavra in texto_base]
dist_comprimentos = FreqDist(comprimentos)
# Exibindo a frequência de cada comprimento
print(dict(dist_comprimentos.items()))
Fundmaentos do Processamento de Linguagem Natural
Linguagem natural refere-se às línguas que evoluíram organicamente com a cultura humana, em oposição a linguagens artificiais ou de programação. O PLN é o campo da ciência da computação dedicado à interação entre computadores e linguagem humana, permitindo que máquinas compreendam, interpretem e gerem texto de forma significativa.
As principais áreas de pesquisa e aplicação em PLN incluem:
- Desambiguação de sentidos: Determinar o significado correto de uma palavra polissêmica com base no contexto.
- Resolução de anáfora e correferência: Identificar a que ou a quem pronomes e expressões se referem no texto.
- Geração de linguagem natural: Produzir texto coerente a partir de dados estruturados.
- Tradução automática: Converter texto de uma linguagem natural para outra.
- Sistemas de diálogo: Criar interfaces conversacionais, como chatbots e assistentes virtuais.
- Reconhecimento de implicação textual: Determinar se uma frase (hipótese) pode ser inferida a partir de outra (premissa).