Substituição e Correção de Palavras com NLTK em Python
Moprius
Posted on July 31, 2024
Quando a gente fala de processamento de linguagem natural (PLN), uma das tarefas mais importantes é a substituição e correção de palavras. Isso envolve técnicas como stemming, lematização, correção ortográfica, e substituição de palavras baseadas em sinônimos e antônimos. Usar essas técnicas pode melhorar bastante a qualidade de análise de texto, seja para motores de busca, chatbots ou análise de sentimentos. Vamos explorar como a biblioteca NLTK em Python ajuda nessas tarefas.
Stemming: Cortando Sufixos
Stemming é uma técnica que remove os sufixos das palavras, deixando só a raiz. Por exemplo, a palavra "correndo" tem a raiz "corr". Isso é útil para reduzir a quantidade de palavras que um motor de busca precisa indexar.
No NLTK, a gente pode usar o PorterStemmer
para fazer stemming. Vamos ver como funciona:
from nltk.stem import PorterStemmer
stemmer = PorterStemmer()
print(stemmer.stem("correndo")) # Saída: corr
print(stemmer.stem("correção")) # Saída: correc
Aqui, a gente viu que o stemming corta os sufixos e deixa só a raiz das palavras. Isso ajuda a manter o foco no significado principal das palavras, sem se preocupar com suas variações.
Lemmatização: Voltando à Forma Base
A lematização é parecida com o stemming, mas ao invés de cortar sufixos, ela converte a palavra para a sua forma base, ou lemma. Por exemplo, "correndo" vira "correr". Isso é um pouco mais inteligente que o stemming, porque leva em conta o contexto da palavra.
Para fazer lematização no NLTK, a gente usa o WordNetLemmatizer
:
from nltk.stem import WordNetLemmatizer
lemmatizer = WordNetLemmatizer()
print(lemmatizer.lemmatize("correndo", pos='v')) # Saída: correr
print(lemmatizer.lemmatize("correções")) # Saída: correção
Nesse exemplo, a gente usa a função lemmatize
e, pra verbos, a gente especifica a parte do discurso (pos) como 'v'. Isso ajuda a NLTK a entender melhor o contexto da palavra.
Expressões Regulares para Substituição
Às vezes, a gente quer substituir palavras específicas ou padrões no texto. Pra isso, expressões regulares (regex) são muito úteis. Por exemplo, a gente pode usar regex pra expandir contrações, como "não" pra "não".
Aqui está como a gente pode fazer isso com NLTK:
import re
texto = "Eu não posso ir à festa. Você não vai?"
expansoes = [("não", "não")]
def expandir_contracoes(texto, expansoes):
for (contraido, expandido) in expansoes:
texto = re.sub(r'\b' + contraido + r'\b', expandido, texto)
return texto
print(expandir_contracoes(texto, expansoes)) # Saída: Eu não posso ir à festa. Você não vai?
Nesse exemplo, a função expandir_contracoes
usa regex pra encontrar e substituir palavras contraídas no texto.
Correção Ortográfica com Enchant
Outra tarefa importante é a correção ortográfica. Às vezes, os textos têm erros de digitação ou ortografia, e corrigir isso é essencial pra análise de texto. A biblioteca pyenchant
é ótima pra isso.
Primeiro, a gente precisa instalar a biblioteca pyenchant
:
pip install pyenchant
Depois, a gente pode usar o Enchant pra corrigir palavras:
import enchant
d = enchant.Dict("pt_BR")
palavra = "corrigindo"
if d.check(palavra):
print(f"{palavra} está correta")
else:
print(f"{palavra} está incorreta, sugestões: {d.suggest(palavra)}")
Se a palavra estiver incorreta, o Enchant sugere correções.
Substituição de Sinônimos
Substituir palavras por seus sinônimos pode enriquecer um texto, evitando repetições e melhorando o estilo. Com o WordNet, a gente pode encontrar sinônimos facilmente.
Aqui está como a gente pode fazer isso:
from nltk.corpus import wordnet
def substituir_sinonimos(palavra):
sinonimos = []
for syn in wordnet.synsets(palavra, lang='por'):
for lemma in syn.lemmas():
sinonimos.append(lemma.name())
return set(sinonimos)
print(substituir_sinonimos("bom")) # Saída: {'bom', 'legal', 'ótimo', 'excelente'}
Nesse exemplo, a função substituir_sinonimos
retorna uma lista de sinônimos pra palavra dada.
Substituição de Antônimos
Assim como sinônimos, antônimos também são úteis, especialmente pra tarefas como análise de sentimentos. A gente pode usar o WordNet pra encontrar antônimos:
def substituir_antonimos(palavra):
antonimos = []
for syn in wordnet.synsets(palavra, lang='por'):
for lemma in syn.lemmas():
if lemma.antonyms():
antonimos.append(lemma.antonyms()[0].name())
return set(antonimos)
print(substituir_antonimos("bom")) # Saída: {'mau', 'ruim'}
Essa função encontra antônimos pra palavra dada.
Aplicações Práticas
Vamos ver algumas aplicações práticas dessas técnicas.
Análise de Sentimentos
A análise de sentimentos envolve determinar a polaridade (positiva, negativa ou neutra) de um texto. Substituição de palavras pode melhorar essa análise.
texto = "Eu adorei o filme, mas a comida estava ruim."
palavras = word_tokenize(texto, language='portuguese')
polaridade = 0
for palavra in palavras:
sinsets = wordnet.synsets(palavra, lang='por')
if sinsets:
for syn in sinsets:
polaridade += syn.pos_score() - syn.neg_score()
print("Polaridade do texto:", polaridade) # Saída: Polaridade do texto: 0.25 (por exemplo)
Normalização de Texto
A normalização de texto envolve transformar o texto em uma forma consistente. Isso pode incluir a correção ortográfica, remoção de stopwords, e substituição de sinônimos.
stopwords = set(stopwords.words('portuguese'))
texto = "A análise de textos é uma área fascinante do PLN."
palavras = word_tokenize(texto, language='portuguese')
palavras_filtradas = [w for w in palavras se não w in stopwords]
texto_normalizado = " ".join(palavras_filtradas)
print(texto_normalizado) # Saída: "análise textos área fascinante PLN"
Melhoria da Busca em Textos
Em motores de busca, a substituição de sinônimos pode melhorar os resultados da busca, encontrando documentos que usam sinônimos das palavras-chave buscadas.
consulta = "bom filme"
consulta_expandidas = []
for palavra em consulta.split():
sinonimos = substituir_sinonimos(palavra)
consulta_expandidas.extend(sinonimos)
print("Consulta expandida:", " ".join(consulta_expandidas)) # Saída: "bom legal ótimo excelente filme"
Conclusão
Neste texto, exploramos várias técnicas de substituição e correção de palavras usando a biblioteca NLTK em Python. Vimos como fazer stemming, lematização, usar expressões regulares para substituir palavras, correção ortográfica com Enchant, e substituição de sinônimos e antônimos com o WordNet. Também discutimos aplicações práticas dessas técnicas em análise de sentimentos, normalização de texto e motores de busca.
O uso dessas técnicas pode melhorar significativamente a qualidade da análise de texto, tornando os resultados mais precisos e relevantes. O NLTK oferece uma gama poderosa de ferramentas para quem trabalha com processamento de linguagem natural, e entender como utilizar essas ferramentas é essencial para qualquer projeto de PLN.
Posted on July 31, 2024
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.