Data Science

Introdução à análise de sentimentos em Python

Read this post in other languages:

A análise de sentimentos é uma das maneiras mais populares de analisar textos. Ela permite visualizar em um relance como as pessoas se sentem em uma grande variedade de áreas e tem aplicações úteis em setores como o suporte ao cliente, a pesquisa de mercado e de produtos e a análise competitiva.

Como qualquer área do processamento de linguagem natural (NLP), a análise de sentimentos pode ficar complexa. Por sorte, o Python tem excelentes pacotes e ferramentas que tornam muito mais fácil abordar este ramo do NLP.

Nesta postagem de blog, vamos explorar alguns dos pacotes mais populares para análise de sentimentos em Python, como eles funcionam e como você pode treinar o seu próprio modelo de análise de sentimentos usando técnicas de ponta. Também daremos uma olhada em alguns recursos do PyCharm que tornam mais fácil e rápido trabalhar com esses pacotes.

O que é a análise de sentimentos?

A análise de sentimentos é o processo de analisar um texto para determinar seu tom emocional. Como você provavelmente pode perceber a partir desta definição, a análise de sentimentos é uma área muito ampla, que incorpora uma grande variedade de métodos dentro do campo do processamento de linguagem natural.

Há muitas maneiras de definir “tom emocional”. Os métodos mais usados determinam a valência ou polaridade de um texto — isto é, o quanto o sentimento expresso nele é positivo ou negativo. Geralmente, o tom emocional também é tratado como um problema de classificação de textos, no qual estes são classificados como positivos ou negativos.

Veja, por exemplo, esta avaliação de produto na Amazon:

Obviamente, este cliente não ficou satisfeito e as técnicas de análise de sentimentos classificariam esta avaliação como negativa.

Agora compare essa primeira avaliação com esta, de um comprador muito mais satisfeito:

Desta vez, as técnicas de análise de sentimentos classificariam esta avaliação como positiva.

Diferentes tipos de análise de sentimentos

Há diversas maneiras de extrair informações emocionais de um texto. Vamos ver algumas das mais importantes.

Maneiras de definir sentimentos

Em primeiro lugar, as abordagens de análise de sentimentos têm diversas maneiras de definir sentimentos ou emoções.

Binária: Aqui, a valência de um documento é dividida em duas categorias, positiva ou negativa, como no caso do conjunto de dados SST-2. Há classificações relacionadas de valência que adicionam uma classe neutra (na qual um texto não expressa nenhum sentimento em relação a um assunto) ou até uma classe conflitante (na qual um texto expressa sentimentos tanto positivos quanto negativos em relação a um assunto).

Alguns analisadores de sentimentos usam uma medida relacionada para classificar os textos em subjetivos ou objetivos.

Granular: Este termo descreve várias maneiras diferentes de abordar a análise de sentimentos, mas aqui ele se refere a decompor uma valência positiva ou negativa em uma escala de Likert. Um exemplo bem conhecido é o conjunto de dados SST-5, que usa uma escala de Likert de cinco pontos, com as classes muito positiva, positiva, neutra, negativa e muito negativa.

Contínua: A valência de um texto também pode ser medida de forma contínua, com pontuações indicando o quanto o sentimento do autor era positivo ou negativo. Por exemplo, o analisador de sentimentos VADER atribui a um texto uma pontuação entre −1 (fortemente negativa) e 1 (fortemente positiva), com pontuações próximas de 0 indicando um sentimento neutro.

Baseada em emoções: Esta abordagem também é conhecida como detecção ou identificação de emoções e tenta detectar a emoção específica que está sendo expressa em um texto. Pode-se usar essa abordagem de duas maneiras. A detecção categórica de emoções tenta enquadrar o sentimento expresso em um texto em uma emoção discreta dentro de um grupo delas, geralmente baseando-se no modelo de Ekman, que inclui raiva, asco, medo, alegria, tristeza e surpresa. Existem alguns conjuntos de dados para esse tipo de detecção de emoções. É menos comum usar a detecção dimensional de emoções na análise de sentimentos, que em vez disso tenta medir três aspectos emocionais em um texto: polaridade, empolgação (o quanto um sentimento é empolgante) e dominância (o quanto a expressão emocional é restrita).

Níveis da análise

Também podemos considerar diferentes níveis nos quais podemos analisar um texto. Para compreendermos isso melhor, vamos considerar outra avaliação da cafeteira:

Nível do documento: Este é o nível mais básico de análise, que retorna um sentimento para todo um texto. A análise no nível do documento pode ser adequada para textos muito curtos, como tweets, mas pode dar respostas enganadoras se houver sentimentos mistos. Por exemplo, se basearmos a análise dos sentimentos desta avaliação no documento inteiro, ela provavelmente será classificada como neutra ou conflitante, pois há dois sentimentos opostos em relação à mesma cafeteira.

Nível das frases: Aqui, o sentimento de cada frase é previsto separadamente. Na avaliação da cafeteira, a análise no nível das frases nos dirá que o avaliador teve sentimentos positivos sobre algumas partes do produto, mas negativos sobre outras. Porém, essa análise não nos diz do que o avaliador gostou ou não na cafeteira.

Análise baseada nos aspectos: Este tipo de análise de sentimentos mergulha mais profundamente em um texto e tenta compreender o sentimento dos usuários quanto a aspectos específicos. Na nossa avaliação da cafeteira, a avaliadora mencionou dois aspectos: aparência e ruído. Extraindo esses aspectos, temos mais informações sobre do que a usuária gostou ou não especificamente. Ela teve um sentimento positivo quanto à aparência da máquina, mas teve um sentimento negativo quanto ao ruído que ela fazia.

Associando a análise de sentimentos com outras técnicas de NLP

Análise baseada em intenções: Neste último tipo de análise de sentimentos, o texto é classificado de duas maneiras: em termos do sentimento que está sendo expresso e do assunto. Por exemplo, se uma empresa de telecomunicações receber um ticket reclamando da frequência com que seu serviço sai do ar, poderá classificar a intenção ou assunto do texto como confiabilidade do serviço e o sentimento como negativo. Assim como no caso da análise de sentimentos baseada no aspecto, este tipo de análise dá à empresa muito mais informações que simplesmente saber se seus clientes estão satisfeitos ou não no geral.

Aplicações da análise de sentimentos

A esta altura, provavelmente você já consegue pensar em alguns casos de uso em potencial para a análise de sentimentos. Basicamente, ela pode ser usada em qualquer situação em que seja possível obter feedback ou opiniões na forma de texto a respeito de algum assunto. Pessoas e empresas podem usá-la para monitorar as redes sociais e ver como as pessoas se sentem a respeito de uma marca, entidade do governo ou assunto.

A análise do feedback de clientes pode ser usada para descobrir o sentimento expresso no feedback ou em tickets de suporte. Avaliações de produtos podem ser analisadas para ver o quanto as pessoas estão satisfeitas ou insatisfeitas com os produtos de uma empresa. Por fim, a análise de sentimentos pode ser um componente-chave na pesquisa de mercado e na análise competitiva, nas quais a forma como as pessoas se sentem a respeito de tendências, recursos e concorrentes emergentes pode ajudar a orientar as estratégias de uma empresa.

Como funciona a análise de sentimentos?

Em um nível mais geral, a análise de sentimentos opera associando palavras (ou, nos modelos mais sofisticados, o tom geral de um texto) a uma emoção. As abordagens mais comuns da análise de sentimentos caem em um dos três métodos abaixo.

Abordagens baseadas em léxico

Estes métodos usam um léxico que inclui pontuações de sentimentos para um conjunto de palavras. Eles combinam essas pontuações, usando um conjunto de regras para obterem o sentimento geral de um texto. Tendem a ser muito rápidos e também têm a vantagem de produzirem pontuações de sentimentos mais granulares. Porém, o léxico tem que ser elaborado manualmente e, por isso, pode ser demorado e dispendioso para produzir.

Modelos de aprendizado de máquina

Estes métodos treinam um modelo de aprendizado de máquina, geralmente um classificador bayesiano ingênuo, com um conjunto de dados que contém texto e rótulos de sentimento — por exemplo, avaliações de filmes. Neste modelo, os textos geralmente são classificados como positivos, negativos e às vezes, neutros. Estes modelos também tendem a ser muito rápidos, mas como geralmente não levam em conta a relação entre as palavras nos textos de entrada, podem ter dificuldades com textos mais complexos, envolvendo qualificadores e negações.

Modelos grandes de linguagem

Estes métodos dependem de um ajuste fino de um modelo grande de linguagem pré-treinado, baseado em transformadores e usando os mesmos conjuntos de dados usados para treinar os demais classificadores de aprendizado de máquina mencionados acima. Estes modelos sofisticados conseguem modelar relações complexas entre as palavras de um texto, mas tendem a ser mais lentos que os outros dois métodos.

Análise de sentimentos em Python

O Python tem um rico ecossistema de pacotes para NLP. Isso significa que você tem inúmeras alternativas ao fazer análise de sentimentos nessa linguagem.

Vamos analisar alguns dos pacotes mais populares para análise de sentimentos em Python.

As melhores bibliotecas em Python para análise de sentimentos

VADER

O VADER (Valence Aware Dictionary and Sentiment Reasoner) é um analisador de sentimentos popular, baseado em léxico. Criado sobre o poderoso pacote NLTK, este analisador retorna quatro pontuações de sentimentos: o grau em que o texto é positivo, neutro ou negativo e uma pontuação composta dos sentimentos. As pontuações positiva, neutra e negativa variam de 0 a 1 e indicam a proporção do texto que era positiva, neutra ou negativa. A pontuação composta varia de −1 (extremamente negativa) a 1 (extremamente positiva) e indica a valência geral dos sentimentos no texto.

Vamos dar uma olhada em um exemplo básico de como ele funciona:

from nltk.sentiment.vader import SentimentIntensityAnalyzer
import nltk

Primeiro, precisamos baixar o léxico do VADER.

nltk.download('vader_lexicon')

Então, podemos criar uma instância do SentimentIntensityAnalyzer() do VADER e extrair as pontuações de sentimentos, através do método polarity_scores().

analyzer = SentimentIntensityAnalyzer()

sentence = "I love PyCharm! It's my favorite Python IDE."
sentiment_scores = analyzer.polarity_scores(sentence)
print(sentiment_scores)
{'neg': 0.0, 'neu': 0.572, 'pos': 0.428, 'compound': 0.6696}

Podemos ver que o VADER atribuiu uma pontuação geral de sentimentos de 0,67 a esse texto e classificou seu conteúdo como 43% positivo, 57% neutro e 0% negativo.

O VADER funciona consultando a pontuação de sentimentos de cada palavra em seu léxico e combinando essas pontuações através de um conjunto de regras com nuances. Por exemplo, a intensidade do sentimento de uma palavra pode ser aumentada ou diminuída por qualificadores. Assim, um qualificador como “um pouquinho” diminui a intensidade do sentimento, mas “extremamente” a amplifica.

O léxico do VADER inclui abreviaturas como “smh” (“shaking my head”, “balançando minha cabeça”) e emojis, o que o torna especialmente adequado para textos de redes sociais. A principal limitação do VADER é que ele só funciona para textos em inglês, mas você pode usar projetos como o vader-multi como alternativas. Se você estiver interessado em se aprofundar neste pacote, já escrevi sobre como o VADER funciona.

NLTK

Você também pode usar o NLTK para treinar o seu próprio classificador de sentimentos baseado em aprendizado de máquina, usando classificadores do scikit-learn.

Há muitas maneiras de processar o texto a ser fornecido a esses modelos, mas a maneira mais simples é baseando-se nas palavras presentes no texto, um tipo de modelagem de textos chamada abordagem “saco de palavras” (bag-of-words). O tipo mais direto de modelagem de saco de palavras é a vetorização binária, na qual cada palavra é tratada como uma característica e o valor dessa característica é 0 ou 1 (significando, respectivamente, que aquela palavra está presente ou ausente no texto).

Se você for novato em trabalhar com dados de texto e NLP e quiser saber mais sobre como se pode converter textos em entradas para modelos de aprendizado de máquina, dei uma palestra sobre esse assunto que dá uma introdução suave a ele.

Você pode ver um exemplo na documentação do NLTK, na qual se treina um classificador bayesiano ingênuo para prever se um texto é subjetivo ou objetivo. Nesse exemplo, alguns termos recebem um qualificador adicional de negação, com base em regras que indicam se é provável que aquela palavra ou caractere esteja negando um sentimento expresso em outro lugar do texto. Se você quiser saber mais sobre este assunto, o Real Python também tem um tutorial de análise de sentimentos que ensina como treinar os seus próprios classificadores usando o NLTK.

Pattern e TextBlob

O pacote Pattern fornece outra abordagem baseada no léxico para analisar sentimentos. Ele usa o léxico SentiWordNet, no qual a cada grupo de sinônimos (synset) do WordNet é atribuída uma pontuação para positividade, negatividade e objetividade. As pontuações positiva e negativa de cada palavra são combinadas através de uma série de regras para darem uma pontuação final de polaridade. De forma semelhante, a pontuação de polaridade de cada palavra é combinada para dar uma pontuação final de subjetividade.

Como o WordNet contém informações sobre categorias gramaticais, as regras podem levar em conta se há adjetivos ou advérbios associados a uma palavra modificando seu sentimento. O conjunto de regras também considera negações, pontos de exclamação e emojis, e até inclui algumas regras para lidar com expressões idiomáticas e sarcasmo.

Porém, como biblioteca stand-alone, o Pattern só é compatível com o Python 3.6. Assim, a maneira mais comum de usar o Pattern é através do TextBlob. Como padrão, o analisador de sentimentos TextBlob usa sua própria implementação da biblioteca Pattern para gerar pontuações de sentimentos.

Vamos dar uma olhada nisso em ação:

from textblob import TextBlob

Veja que executamos o método TextBlob no nosso texto e depois extraimos os sentimentos usando o atributo sentiment:

pattern_blob = TextBlob("I love PyCharm! It's my favorite Python IDE.")
sentiment = pattern_blob.sentiment

print(f"Polarity: {sentiment.polarity}")
print(f"Subjectivity: {sentiment.subjectivity}")
Polarity: 0.625
Subjectivity: 0.6

Para nossa frase de exemplo, o Pattern no TextBlob dá uma pontuação de polaridade de 0,625 (relativamente próxima à dada pelo VADER) e uma pontuação de subjetividade de 0,6.

Mas também há uma outra maneira de obter pontuações de sentimentos com o TextBlob. Esse pacote também inclui um classificador bayesiano ingênuo pré-treinado, que rotula um texto como positivo ou negativo e fornece a probabilidade de esse texto ser positivo ou negativo.

Para usar este método, primeiro é preciso baixar do NLTK o módulo punkt e o conjunto de dados movie-reviews, usados para treinar este modelo.

import nltk
nltk.download('movie_reviews')
nltk.download('punkt')

from textblob import TextBlob
from textblob.sentiments import NaiveBayesAnalyzer

Mais uma vez, precisaremos executar o TextBlob no nosso texto, mas desta vez adicionando o argumento analyzer=NaiveBayesAnalyzer(). Em seguida, como antes, usaremos o atributo “sentiment” para extrair as pontuações de sentimentos.

nb_blob = TextBlob("I love PyCharm! It's my favorite Python IDE.", analyzer=NaiveBayesAnalyzer())
sentiment = nb_blob.sentiment
print(sentiment)
Sentiment(classification='pos', p_pos=0.5851800554016624, p_neg=0.4148199445983381)

Desta vez, terminamos com um rótulo pos (positivo), com o modelo prevendo que o texto tem uma probabilidade de 59% de ser positivo e de 41% de ser negativo.

spaCy

Outra opção é usar o spaCy para a análise de sentimentos. Este é outro pacote popular para NLP em Python. Ele tem uma grande variedade de opções para processar textos.

O primeiro método usa o plug-in spacytextblob para executar o analisador de sentimentos do TextBlob como parte do pipeline do spaCy. Mas antes que você possa fazer isso, precisará instalar tanto o spacy quanto o spacytextblob e baixar o modelo apropriado de linguagem.

import spacy
import spacy.cli
from spacytextblob.spacytextblob import SpacyTextBlob

spacy.cli.download("en_core_web_sm")

Então, carregamos esse modelo de linguagem e adicionamos spacytextblob ao nosso pipeline de processamento de textos. O TextBlob pode ser usado através do método pipe do spaCy, o que significa que podemos incluí-lo como parte de um pipeline mais complexo de processamento de textos, incluindo etapas de pré-processamento, como marcação de categorias gramaticais, lematização e reconhecimento de entidades nomeadas. O pré-processamento pode normatizar e enriquecer o texto, ajudando modelos executados mais adiante a obterem o máximo de informações das entradas de texto.

nlp = spacy.load('en_core_web_sm')
nlp.add_pipe('spacytextblob')

Por enquanto, apenas analisaremos nossa frase de exemplo, sem pré-processamento:

doc = nlp("I love PyCharm! It's my favorite Python IDE.")

print('Polarity: ', doc._.polarity)
print('Subjectivity: ', doc._.subjectivity)
Polarity:  0.625
Subjectivity:  0.6

Obteremos os mesmos resultados que quando usamos o TextBlob, acima.

Uma segunda maneira de fazer análise de sentimentos no spaCy é treinar nosso próprio modelo, usando a classe TextCategorizer. Isso permite treinar diversos modelos criados pelo spaCy através de um modelo de treinamento de análise de sentimentos. Novamente, como isso pode ser usado como parte do pipeline do spaCy, você tem muitas opções para pré-processar o seu texto antes de treinar o seu modelo.

Finalmente, você pode usar modelos grandes de linguagem (LLMs) para fazer análise de sentimentos através do spacy-llm. Isso permite enviar prompts a diversos LLMs da OpenAI, Anthropic, Cohere e Google para executar análise de sentimentos nos seus textos.

Esta abordagem funciona de forma ligeiramente diferente dos outros métodos que discutimos. Em vez de treinarmos um modelo, podemos usar modelos generalistas como o GPT-4 para prever o sentimento de um texto. Você pode fazer isso através de aprendizado “zero-shot” (no qual é passado um prompt ao modelo, mas não é passado nenhum exemplo) ou “few-shot” (no qual são passados um prompt e alguns exemplos ao modelo).

Transformers

O último pacote de análise de sentimentos em Python que discutiremos é o Transformers, da Hugging Face.

A Hugging Face hospeda todos os principais LLMs de código aberto para uso gratuito (dentre outros modelos, inclusive de visão computacional e de áudio) e oferece uma plataforma para treinar, implantar e compartilhar esses modelos. Seu pacote Transformers oferece uma grande variedade de recursos (incluindo análise de sentimentos) para trabalhar com os LLMs hospedados pela Hugging Face.

Compreendendo os resultados dos analisadores de sentimentos

Agora que já abordamos todas as maneiras pelas quais se pode fazer análise de sentimentos em Python, talvez você esteja se perguntando como pode aplicá-las aos seus próprios dados.

Para compreender isso, vamos usar o PyCharm para comparar dois pacotes: o VADER e o TextBlob. Suas várias pontuações de sentimentos oferecem algumas perspectivas diferentes a respeito dos nossos dados. Usaremos esses pacotes para analisar o conjunto de dados de avaliações da Amazon.

O PyCharm Professional é um poderoso IDE para ciência de dados em Python, com suporte a recursos avançados de complementação de código, inspeções e depuração em Python, rico suporte a bancos de dados, Jupyter, Git, Conda e muito mais — tudo isso desde a instalação. Além destes recursos, você também tem outros incrivelmente úteis, como nossas estatísticas de colunas e visualização em gráficos, além de integrações com o Hugging Face que tornam muito mais fácil e rápido trabalhar com LLMs. Nesta postagem, vamos explorar os recursos avançados do PyCharm para trabalhar com dataframes. Isso nos permitirá ter uma rápida visão geral de como as pontuações de sentimentos se distribuem nos dois pacotes.

Se você já estiver pronto para iniciar o seu próprio projeto de análise de sentimentos, pode ativar a sua assinatura gratuita de três meses do PyCharm. Clique no link abaixo e digite este código promocional: PCSA24. Você então receberá um código de ativação por e-mail.

A primeira coisa que precisamos fazer é carregar os dados. Podemos usar o método load_dataset(), do pacote Datasets, para baixar esses dados do hub do Hugging Face.

from datasets import load_dataset
amazon = load_dataset("fancyzhx/amazon_polarity")

Você pode passar o mouse sobre o nome do conjunto de dados para ver o resumo do conjunto de dados do Hugging Face dentro do PyCharm. Isso lhe dá uma maneira conveniente de obter informações sobre os ativos do Hugging Face, sem sair do IDE.

Aqui podemos ver o conteúdo desse conjunto de dados:

amazon
DatasetDict({
    train: Dataset({
        features: ['label', 'title', 'content'],
        num_rows: 3600000
    })
    test: Dataset({
        features: ['label', 'title', 'content'],
        num_rows: 400000
    })
})

O conjunto de dados de treinamento tem 3,6 milhões de observações e o conjunto de dados de teste contém 400.000. Neste tutorial, trabalharemos com o conjunto de dados de treinamento.

Agora vamos carregar o SentimentIntensityAnalyzer do VADER e o método do TextBlob.

from nltk.sentiment.vader import SentimentIntensityAnalyzer
import nltk

nltk.download("vader_lexicon")

analyzer = SentimentIntensityAnalyzer()
from textblob import TextBlob

O conjunto de dados de treinamento tem observações demais para se visualizar confortavelmente. Então, vamos pegar uma amostra aleatória de 1.000 avaliações para representar o sentimento geral de todos os avaliadores.

from random import sample
sample_reviews = sample(amazon["train"]["content"], 1000)

Agora, vamos obter as pontuações do VADER e do TextBlob para cada uma dessas avaliações. Vamos fazer um loop no texto de cada avaliação, passá-lo pelos analisadores de sentimentos e depois anexar as pontuações a uma lista dedicada.

vader_neg = []
vader_neu = []
vader_pos = []
vader_compound = []
textblob_polarity = []
textblob_subjectivity = []

for review in sample_reviews:
   vader_sent = analyzer.polarity_scores(review)
   vader_neg += [vader_sent["neg"]]
   vader_neu += [vader_sent["neu"]]
   vader_pos += [vader_sent["pos"]]
   vader_compound += [vader_sent["compound"]]
  
   textblob_sent = TextBlob(review).sentiment
   textblob_polarity += [textblob_sent.polarity]
   textblob_subjectivity += [textblob_sent.subjectivity]

Depois, vamos colocar cada uma dessas listas em uma coluna separada em uma dataframe do pandas:

import pandas as pd

sent_scores = pd.DataFrame({
   "vader_neg": vader_neg,
   "vader_neu": vader_neu,
   "vader_pos": vader_pos,
   "vader_compound": vader_compound,
   "textblob_polarity": textblob_polarity,
   "textblob_subjectivity": textblob_subjectivity
})

Agora estamos prontos para começarmos a explorar nossos resultados.

Tipicamente, este seria o momento de começarmos a criar algum código para a análise exploratória dos dados. Isso poderia ser feito usando o método describe do pandas para obter estatísticas de resumo das nossas colunas e criando código do Matplotlib ou do seaborn para visualizarmos nossos resultados. Porém, o PyCharm tem alguns recursos para acelerar todo esse processo.

Vamos prosseguir e imprimir nossa dataframe.

sent_scores

No canto superior direito, podemos ver um botão Show Column Statistics. Clicando nele, veem-se duas opções diferentes: Compact e Detailed. Vamos selecionar Detailed.

Agora temos estatísticas de resumo, fornecidas como parte dos cabeçalhos das nossas colunas! Olhando essas estatísticas, podemos ver que a pontuação composta do VADER tem uma média de 0,4 (mediana = 0,6), enquanto a pontuação de polaridade do TextBlob dá uma média de 0,2 (mediana = 0,2).

Este resultado indica que, em média, o VADER tende a considerar o mesmo conjunto de avaliações mais positivo que no TextBlob. Também mostra que em ambos os analisadores de sentimentos, é provável que haja mais avaliações positivas que negativas. Podemos analisar isso em mais detalhes olhando algumas visualizações.

Outro recurso do PyCharm que podemos usar é a dataframe Chart View. O botão desta função está no canto superior direito.

Ao clicarmos nesse botão, mudamos para o editor de gráficos. Nele podemos criar visualizações sem código, diretamente a partir da nossa dataframe.

Vamos começar com a pontuação composta do VADER. Para começar a criar este gráfico, vá até Show Series Settings, no canto superior direito.

Remova os valores-padrão de X Axis e Y Axis. Substitua os valores de X Axis e de Y Axis por vader_compound. Clique na seta junto ao nome da variável no campo Y Axis e selecione count.

Por fim, selecione Histogram nos ícones de gráficos, logo abaixo de Series Settings. É provável que a pontuação composta do VADER tenha uma distribuição bimodal, com um ligeiro pico por volta de −0,8 e um bem maior por volta de 0,9. É provável que estes picos representem a divisão das avaliações entre positivas e negativas. Também há muito mais avaliações positivas que negativas.

Vamos repetir o mesmo exercício e criar um histograma para vermos a distribuição das pontuações de polaridade do TextBlob.

Ao contrário do VADER, o TextBlob tende a considerar a maioria das avaliações como neutras, com muito poucas fortemente positivas ou negativas. Para compreendermos por que há essa discrepância entre as pontuações desses dois analisadores de sentimentos, vamos dar uma olhada em uma avaliação que o VADER considerou fortemente positiva e em outra que ele considerou fortemente negativa, mas o TextBlob considerou ambas neutras.

Vamos obter o índice da primeira avaliação que o VADER considerou positiva, mas o TextBlob considerou neutra:

sent_scores[(sent_scores["vader_compound"] >= 0.8) & (sent_scores["textblob_polarity"].between(-0.1, 0.1))].index[0]
42

Depois, vamos obter o índice da primeira avaliação que o VADER considerou negativa, mas o TextBlob considerou neutra:

sent_scores[(sent_scores["vader_compound"] <= -0.8) & (sent_scores["textblob_polarity"].between(-0.1, 0.1))].index[0]
0

Primeiro, vamos obter a avaliação positiva:

sample_reviews[42]
"I love carpet sweepers for a fast clean up and a way to conserve energy. The Ewbank Multi-Sweep is a solid, well built appliance. However, if you have pets, you will find that it takes more time cleaning the sweeper than it does to actually sweep the room. The Ewbank does pick up pet hair most effectively but emptying it is a bit awkward. You need to take a rag to clean out both dirt trays and then you need a small tooth comb to pull the hair out of the brushes and the wheels. To do a proper cleaning takes quite a bit of time. My old Bissell is easier to clean when it comes to pet hair and it does a great job. If you do not have pets, I would recommend this product because it is definitely well made and for small cleanups, it would suffice. For those who complain about appliances being made of plastic, unfortunately, these days, that's the norm. It's not great and plastic definitely does not hold up but, sadly, product quality is no longer a priority in business."

Esta avaliação parece ambivalente, mas no geral, é algo positiva.

Agora, vamos ver a avaliação negativa:

sample_reviews[0]
'The only redeeming feature of this Cuisinart 4-cup coffee maker is the sleek black and silver design. After that, it rapidly goes downhill. It is frustratingly difficult to pour water from the carafe into the chamber unless it's done extremely slow and with accurate positioning. Even then, water still tends to dribble out and create a mess. The lid, itself, is VERY poorly designed with it's molded, round "grip" to supposedly remove the lid from the carafe. The only way I can remove it is to insert a sharp pointed object into one of the front pouring holes and pry it off! I've also occasionally had a problem with the water not filtering down through the grounds, creating a coffee ground lake in the upper chamber and a mess below. I think the designer should go back to the drawing-board for this one.'

Esta avaliação é inequivocamente negativa. Comparando os dois analisadores, o VADER parece ser mais preciso, mas tende a dar prioridade demais às palavras positivas de um texto.

A última coisa que podemos considerar é o quanto cada avaliação é subjetiva ou objetiva. Faremos isso criando um histograma da pontuação de subjetividade do TextBlob.

É interessante observar que há uma boa distribuição de subjetividade nas avaliações, com a maioria delas misturando redação subjetiva e objetiva. Um número pequeno de avaliações também é muito subjetivo (próximo a 1) ou muito objetivo (próximo a 0).

As pontuações entre esses valores proporcionam uma boa maneira de fazer um corte dos dados. Se você precisar saber de que coisas objetivas as pessoas gostaram ou não nos produtos, poderá olhar as avaliações com uma pontuação baixa de subjetividade e pontuações compostas do VADER próximas de 1 e −1, respectivamente.

Mas se você quiser saber qual foi a reação emocional das pessoas aos produtos, poderá pegar as avaliações com uma alta pontuação de subjetividade e pontuações compostas altas e baixas no VADER.

Pontos a considerar

Como acontece com qualquer problema de processamento de linguagem natural, há uma série de coisas que devemos observar ao fazer análise de sentimentos.

Uma das coisas mais importantes a considerar é o idioma dos textos que você está tentando analisar. Muitos dos métodos baseados em léxico só funcionam para um número limitado de idiomas. Assim, se você estiver trabalhando com idiomas sem suporte nesses léxicos, talvez precise adotar outra abordagem, como usar um LLM com ajuste fino ou treinar os seus próprios modelos.

À medida que aumenta a complexidade dos textos, detectar sentimentos corretamente também pode ficar difícil para modelos baseados em léxicos e em sacos de palavras. Detectar sarcasmo ou indicadores mais sutis de contexto pode ser difícil para modelos mais simples, e esses modelos podem não conseguir classificar precisamente o sentimento desses textos. Talvez LLMs consigam lidar com textos mais complexos, mas você precisará experimentar diversos modelos.

Por fim, ao efetuar uma análise de sentimentos, aparecem os mesmos problemas que com qualquer outra aplicação de aprendizado de máquina. A qualidade dos seus modelos dependerá da qualidade dos dados de treinamento usados. Se não for possível obter conjuntos de dados de alta qualidade e adequados ao escopo do seu problema para fazer o treinamento e os testes, você não conseguirá prever corretamente o sentimento do seu público-alvo.

Você também precisa garantir que os seus alvos sejam apropriados para o seu problema de negócios. Pode parecer atraente criar um modelo para saber se os seus produtos deixam os seus clientes “tristes”, “com raiva” ou “enojados”, mas se isso não ajudar você a tomar uma decisão sobre como melhorar os seus produtos, então não está resolvendo o seu problema.

Concluindo

Nesta postagem, mergulhamos a fundo na área fascinante da análise de sentimentos em Python e mostramos como essa área complexa fica mais acessível com alguns pacotes poderosos.

Cobrimos as aplicações em potencial da análise de sentimentos, as diferentes maneiras de avaliar os sentimentos e os principais métodos para extrair os sentimentos de um texto. Também vimos alguns recursos úteis do PyCharm que tornam mais simples e rápido trabalhar com modelos e interpretar seus resultados.

Embora no momento a área de processamento de linguagem natural esteja fortemente concentrada em modelos grandes de linguagem, as técnicas mais antigas, que usam analisadores baseados em léxicos ou modelos tradicionais de aprendizado de máquina, como classificadores bayesianos ingênuos, ainda têm seu lugar na análise de sentimentos. Essas técnicas brilham na análise de textos mais simples ou quando a prioridade está na rapidez, nas previsões ou na facilidade de implantação. Os LLMs são mais adequados a textos mais complexos ou cheios de nuances.

Agora que você já aprendeu os conceitos básicos, pode aprender como fazer análise de sentimentos com LLMs através do nosso tutorial. Esse guia passo a passo ajuda você a descobrir como selecionar o modelo certo para a sua tarefa, usá-lo na análise de sentimentos e até fazer você mesmo o ajuste fino dele.

Se você quiser continuar a aprender de forma mais ampla sobre processamento de linguagem natural ou aprendizado de máquina após terminar de ler esta postagem, aqui estão alguns recursos:

Comece a usar a análise de sentimentos no PyCharm hoje mesmo

Se você já estiver pronto para iniciar o seu próprio projeto de análise de sentimentos, pode ativar a sua assinatura gratuita de três meses do PyCharm. Clique no link abaixo e digite este código promocional: PCSA24. Você então receberá um código de ativação por e-mail.

Artigo original em inglês por:

Jodie Burchell

Jodie Burchell

Dr. Jodie Burchell is the Developer Advocate in Data Science at JetBrains, and was previously a Lead Data Scientist at Verve Group Europe. She completed a PhD in clinical psychology and a postdoc in biostatistics, before leaving academia for a data science career. She has worked for 7 years as a data scientist in both Australia and Germany, developing a range of products including recommendation systems, analysis platforms, search engine improvements and audience profiling. She has held a broad range of responsibilities in her career, doing everything from data analytics to maintaining machine learning solutions in production. She is a long time content creator in data science, across conference and user group presentations, books, webinars, and posts on both her own and JetBrain’s blogs.

image description