O processamento de linguagem natural (PLN) é um campo fascinante que combina linguística e computação para entender, interpretar e manipular a linguagem humana. Uma das ferramentas mais poderosas para isso é a Natural Language Toolkit (NLTK) em Python. Neste texto, vamos explorar os conceitos de tokenização e o uso do WordNet, uma base lexical para a língua inglesa, que é amplamente utilizada em PLN.
O que é Tokenização?
Tokenização é o processo de dividir um texto em unidades menores, chamadas tokens. Esses tokens podem ser palavras, frases ou até mesmo caracteres individuais. A tokenização é um passo crucial no processamento de textos porque permite que os algoritmos compreendam e analisem o texto de forma mais eficaz.
Por exemplo, considere a frase "Olá, mundo!". A tokenização dessa frase pode resultar em três tokens: ["Olá", ",", "mundo", "!"]. Essa divisão permite que cada parte do texto seja analisada individualmente, facilitando tarefas como análise de sentimentos, tradução automática e reconhecimento de entidades nomeadas.
No NLTK, a tokenização pode ser feita de várias maneiras. Vamos ver alguns exemplos práticos.
Tokenizando Textos em Sentenças
Dividir um texto em sentenças é o primeiro passo em muitas tarefas de PLN. O NLTK facilita isso com a função sent_tokenize
.
import nltk
from nltk.tokenize import sent_tokenize
texto = "Olá mundo! Bem-vindo ao tutorial de NLTK. Vamos aprender a tokenizar textos."
sentencas = sent_tokenize(texto, language='portuguese')
print(sentencas)
O resultado será:
['Olá mundo!', 'Bem-vindo ao tutorial de NLTK.', 'Vamos aprender a tokenizar textos.']
Aqui, o texto foi dividido em três sentenças. Isso é útil para análises mais detalhadas, onde cada sentença pode ser processada individualmente.
Tokenizando Sentenças em Palavras
Depois de dividir o texto em sentenças, o próximo passo geralmente é dividir essas sentenças em palavras. A função word_tokenize
do NLTK é usada para isso.
from nltk.tokenize import word_tokenize
frase = "Olá mundo!"
palavras = word_tokenize(frase, language='portuguese')
print(palavras)
O resultado será:
['Olá', 'mundo', '!']
Agora, temos cada palavra e símbolo de pontuação como tokens separados. Isso é essencial para tarefas como análise de frequência de palavras, onde precisamos contar quantas vezes cada palavra aparece em um texto.
Usando Expressões Regulares para Tokenização
Em alguns casos, você pode querer uma tokenização mais personalizada. As expressões regulares (regex) são uma ferramenta poderosa para isso. O NLTK fornece a classe RegexpTokenizer
para criar tokenizadores personalizados.
from nltk.tokenize import RegexpTokenizer
tokenizer = RegexpTokenizer(r'\w+')
tokens = tokenizer.tokenize("Vamos aprender NLTK.")
print(tokens)
O resultado será:
['Vamos', 'aprender', 'NLTK']
Aqui, usamos uma expressão regular que seleciona apenas palavras compostas por caracteres alfanuméricos, ignorando a pontuação.
Introdução ao WordNet
O WordNet é uma base de dados lexical que agrupa palavras em conjuntos de sinônimos chamados synsets, fornece definições curtas e gerais, e registra várias relações semânticas entre essas palavras. No NLTK, o WordNet é utilizado para encontrar sinônimos, antônimos, hipônimos e hiperônimos, entre outras relações.
Para usar o WordNet, precisamos importar o módulo wordnet
do NLTK.
from nltk.corpus import wordnet
Buscando Synsets
Um synset, ou conjunto de sinônimos, é um grupo de palavras que compartilham o mesmo significado. Para buscar os synsets de uma palavra, usamos a função synsets
.
sinonimos = wordnet.synsets("dog")
print(sinonimos)
O resultado será uma lista de synsets que representam diferentes sentidos da palavra "dog".
[Synset('dog.n.01'), Synset('frump.n.01'), Synset('dog.n.03'), Synset('cad.n.01'), Synset('frank.n.02'), Synset('pawl.n.01'), Synset('andiron.n.01')]
Cada synset é identificado por um nome que inclui a palavra, a parte do discurso (n para substantivo, v para verbo, etc.), e um número que distingue diferentes sentidos.
Definições e Exemplos
Podemos obter a definição e exemplos de uso de um synset específico.
sinonimo = wordnet.synset('dog.n.01')
print(sinonimo.definition())
print(sinonimo.examples())
O resultado será:
a domesticated carnivorous mammal (Canis familiaris) that typically has a long snout, an acute sense of smell, non-retractile claws, and a barking, howling, or whining voice
['the dog barked all night']
Isso nos dá uma compreensão clara do significado e do uso de "dog" neste contexto.
Buscando Sinônimos e Antônimos
Para encontrar sinônimos e antônimos de uma palavra, podemos explorar os lemmas dos synsets.
sinonimos = []
antonimos = []
for syn in wordnet.synsets("good"):
for lemma in syn.lemmas():
sinonimos.append(lemma.name())
if lemma.antonyms():
antonimos.append(lemma.antonyms()[0].name())
print(set(sinonimos))
print(set(antonimos))
O resultado será uma lista de sinônimos e antônimos para a palavra "good".
{'skillful', 'proficient', 'practiced', 'unspoiled', 'goodness', 'good', 'dependable', 'sound', 'right', 'safe', 'respectable', 'effective', 'trade_good', 'adept', 'good', 'full', 'commodity', 'estimable', 'honorable', 'undecomposed', 'serious', 'secure', 'dear', 'ripe'}
{'evilness', 'evil', 'ill'}
Calculando Similaridade Semântica
O WordNet também permite calcular a similaridade semântica entre palavras. A similaridade é baseada na distância entre os synsets no gráfico de hipônimos/hiperônimos.
from nltk.corpus import wordnet
cachorro = wordnet.synset('dog.n.01')
gato = wordnet.synset('cat.n.01')
similaridade = cachorro.wup_similarity(gato)
print(similaridade)
O resultado será um valor de similaridade entre 0 e 1.
0.8571428571428571
Esse valor indica que "dog" e "cat" são bastante similares semanticamente.
Filtrando Stopwords
Stopwords são palavras comuns que geralmente não adicionam muito significado ao texto, como "e", "a", "de". Remover essas palavras pode ajudar a focar nas partes mais importantes do texto. O NLTK fornece uma lista de stopwords para várias línguas.
from nltk.corpus import stopwords
stop_words = set(stopwords.words('portuguese'))
palavras = ["Olá", "mundo", "é", "um", "lugar", "bonito"]
palavras_filtradas = [w for w in palavras if not w in stop_words]
print(palavras_filtradas)
O resultado será:
['Olá', 'mundo', 'lugar', 'bonito']
Aqui, as stopwords foram removidas da lista original de palavras.
Aplicações Práticas
Análise de Sentimentos
A análise de sentimentos é uma aplicação comum de PLN onde o objetivo é determinar a opinião ou emoção expressa em um texto. Tokenização e o uso de WordNet são passos importantes nesse processo.
Primeiro, dividimos o texto em palavras e removemos as stopwords. Em seguida, podemos usar os synsets para entender melhor o contexto e a polaridade das palavras.
texto = "Eu amo programação em Python!"
palavras = word_tokenize(texto, language='portuguese')
palavras_filtradas = [w for w in palavras if not w in stop_words]
polaridade = 0
for palavra in palavras_filtradas:
synsets = wordnet.synsets(palavra, lang='por')
if synsets:
for syn in synsets:
polaridade += syn.pos_score() - syn.neg_score()
print("Polaridade do texto:", polaridade)
Nesse exemplo simplificado, estamos somando os scores positivos e negativos dos synsets das palavras filtradas para determinar a polaridade geral do texto.
Reconhecimento de Entidades Nomeadas
Outra aplicação é o reconhecimento de entidades nomeadas (NER), que identifica e classifica nomes de pessoas, organizações, locais, etc., em um texto.
import nltk
nltk.download('maxent_ne_chunker')
nltk.download('words')
frase = "Barack Obama foi o 44º presidente dos Estados Unidos."
palavras = word_tokenize(frase, language='portuguese')
tags = nltk.pos_tag(palavras)
entidades = nltk.ne_chunk(tags)
print(entidades)
O resultado será uma árvore que identifica "Barack Obama" como uma pessoa e "Estados Unidos" como um local.
Conclusão
Neste texto, exploramos os conceitos básicos de tokenização e uso do WordNet com a biblioteca NLTK em Python. Vimos como dividir textos em sentenças e palavras, como buscar sinônimos e antônimos, calcular similaridades semânticas, e aplicações práticas como análise de sentimentos e reconhecimento de entidades nomeadas. A NLTK é uma ferramenta poderosa para qualquer pessoa interessada em processamento de linguagem natural, oferecendo uma ampla gama de funcionalidades para transformar e analisar textos de forma eficaz.
Top comments (0)