Skip to content

Construindo um Analisador de Sentimentos em Python

    A análise de sentimento é uma técnica poderosa que ajuda computadores a compreender se um texto tem sentimento positivo ou negativo.

    Neste guia você aprenderá a usar técnicas de Processamento de Linguagem Natural e Aprendizado de Máquina para determinar o sentimento de textos. Com o uso da biblioteca spaCy, criaremos um pipeline que alimenta um classificador de análise de sentimentos.

    1. Teoria: Pré-processamento de Dados Textuais com PLN:

    Pela teoria, antes de iniciarmos a construção do nosso analisador de sentimentos, é necessário preparar os dados textuais. Para isso, seguiremos algumas etapas de pré-processamento para garantir que os dados estejam em um formato adequado para análise.

    Tokenização:

    A tokenização envolve dividir um texto em unidades individuais chamadas tokens. Tokens podem ser palavras ou partes delas, como prefixos e sufixos. A tokenização é a base de muitos processos de PLN.

    Exemplo de código em Python usando spaCy para tokenização:

    import spacy
    
    nlp = spacy.load("en_core_web_sm")
    text = "Análise de sentimentos é interessante!"
    doc = nlp(text)
    tokens = [token.text for token in doc]
    print(tokens)
    

    Remoção de Palavras de Parada:

    Palavras como “e”, “o”, “para” não contribuem muito para a análise de sentimentos e podem ser removidas para melhorar o desempenho do modelo.

    import spacy
    
    nlp = spacy.load("pt_core_news_sm")
    
    # Exemplo de texto
    text = "Este é um exemplo de frase com algumas palavras de parada."
    
    # Processar o texto
    doc = nlp(text)
    
    # Remover palavras de parada
    filtered_tokens = [token.text for token in doc if not token.is_stop]
    
    print("Texto original:", text)
    print("Texto após remover palavras de parada:", " ".join(filtered_tokens))
    

    Normalização de Palavras:

    Normalizar palavras significa reduzi-las a uma forma básica. Isso ajuda o modelo a generalizar melhor, reduzindo variações.

    import spacy
    
    nlp = spacy.load("pt_core_news_sm")
    
    # Exemplo de texto com variações de palavras
    text = "correndo correu corria"
    
    # Processar o texto
    doc = nlp(text)
    
    # Normalização das palavras
    normalized_tokens = [token.lemma_ for token in doc]
    
    print("Texto original:", text)
    print("Texto após normalização:", " ".join(normalized_tokens))
    

    Vetorização de Texto:

    Como os modelos de Aprendizado de Máquina não podem lidar diretamente com texto, precisamos convertê-lo em representações numéricas. Uma abordagem comum é a vetorização de texto.

    import spacy
    
    nlp = spacy.load("pt_core_news_sm")
    
    # Exemplo de texto
    text = "Este é um exemplo de frase para vetorização."
    
    # Processar o texto
    doc = nlp(text)
    
    # Vetorização das palavras
    word_vectors = [token.vector for token in doc]
    
    print("Texto original:", text)
    print("Vetores das palavras:", word_vectors)
    

    2. Uso de Classificadores de Aprendizado de Máquina para Prever Sentimentos:

    Agora que os dados estão pré-processados, podemos construir um classificador de Aprendizado de Máquina para prever sentimentos com base no texto.

    Ferramentas de Aprendizado de Máquina:

    Utilizaremos o spaCy, que já inclui um modelo pré-treinado para análise de sentimentos.

    Como Funciona a Classificação:

    A classificação envolve treinar um modelo em dados rotulados para associar entradas a rótulos. O modelo aprende padrões nos dados de treinamento e faz previsões sobre novos exemplos.

    Como Usar spaCy para Classificação de Texto:

    No spaCy, adicionamos um componente “textcat” ao pipeline. Esse componente é um classificador que treinamos para categorizar textos, como sentimentos positivos e negativos.

    Exemplo de código para treinamento de classificador de sentimentos usando spaCy:

    import spacy
    from spacy.util import minibatch
    import random
    
    # Carregue o modelo de linguagem para o português do Brasil
    nlp = spacy.load("pt_core_news_sm")
    
    # Crie a tarefa de classificação de texto
    textcat = nlp.create_pipe("textcat", config={"exclusive_classes": True})
    textcat.add_label("positive")
    textcat.add_label("negative")
    nlp.add_pipe(textcat)
    
    # Dados de treinamento
    train_data = [
        ("Isso é ótimo!", {"cats": {"positive": 1, "negative": 0}}),
        ("Não estou feliz.", {"cats": {"positive": 0, "negative": 1}})
    ]
    
    # Preparação dos dados para treinamento
    train_texts, train_cats = zip(*train_data)
    train_data = list(zip(train_texts, train_cats))
    
    # Treinamento
    random_seed = 1
    spacy.util.fix_random_seed(random_seed)
    train_data = train_data[:10]  # Apenas para demonstração, use todos os dados
    other_pipes = [pipe for pipe in nlp.pipe_names if pipe != "textcat"]
    with nlp.disable_pipes(*other_pipes):  # Desative outros componentes durante o treinamento
        optimizer = nlp.begin_training()
        for epoch in range(10):
            random.shuffle(train_data)
            losses = {}
            # Crie minibatches e itere pelo conjunto de treinamento
            for batch in minibatch(train_data, size=8):
                texts, annotations = zip(*batch)
                example_texts = list(texts)  # Converta a tupla para lista
                example_annotations = list(annotations)  # Converta a tupla para lista
                # Atualize o modelo com os exemplos do minibatch
                nlp.update(example_texts, example_annotations, drop=0.5, losses=losses)
            print(losses)
    
    # Salve o modelo treinado
    nlp.to_disk("trained_textcat_model_pt")
    
    
    # Carregue o modelo treinado para português do Brasil
    nlp = spacy.load("trained_textcat_model_pt")
    
    # Textos para classificar
    texts_to_classify = [
        "Eu realmente gostei deste filme. A atuação foi ótima.",
        "Esse produto não atendeu às minhas expectativas.",
        "O atendimento ao cliente foi bom.",
        "O clima hoje está lindo.",
    ]
    
    # Classificação de texto
    for text in texts_to_classify:
        doc = nlp(text)
        if "positive" in doc.cats and "negative" in doc.cats:
            if doc.cats["positive"] < doc.cats["negative"]:
                sentiment = "positivo"
            else:
                sentiment = "negativo"
            print(f"Texto: '{text}'\nSentimento: {sentiment}\n")
        else:
            print(f"Texto: '{text}'\nNão foi possível classificar o sentimento.\n")
    

    Conclusão e Próximos Passos:

    A análise de sentimentos é uma aplicação valiosa do PLN com várias aplicações práticas. Com o spaCy e outras bibliotecas de Aprendizado de Máquina em Python, você pode criar analisadores de sentimentos eficazes para compreender os tons emocionais nos textos.

    Esse guia fornece uma visão geral do processo de construção de um analisador de sentimentos. No entanto, há muitas oportunidades para aprimoramento, como ajustar parâmetros, experimentar diferentes algoritmos de Aprendizado de Máquina e explorar fontes mais diversas de dados para treinamento.

    Leave a Reply

    Your email address will not be published. Required fields are marked *