DEV Community

Moprius
Moprius

Posted on

Substituição e Correção de Palavras com NLTK em Python

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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?
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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)}")
Enter fullscreen mode Exit fullscreen mode

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'}
Enter fullscreen mode Exit fullscreen mode

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'}
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode
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"
Enter fullscreen mode Exit fullscreen mode
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"
Enter fullscreen mode Exit fullscreen mode

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.

Top comments (0)