Introdução à Análise de Textos e Processamento de Linguagem Natural com NLTK

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).

Tags: NLTK Processamento de Linguagem Natural Python PLN Análise de Texto

Publicado em 7-11 10:22