{"id":571577,"date":"2025-05-27T04:20:00","date_gmt":"2025-05-27T03:20:00","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=pycharm&#038;p=571577"},"modified":"2025-05-29T22:41:10","modified_gmt":"2025-05-29T21:41:10","slug":"introducao-a-analise-de-sentimentos-em-python","status":"publish","type":"pycharm","link":"https:\/\/blog.jetbrains.com\/pt-br\/pycharm\/2025\/05\/introducao-a-analise-de-sentimentos-em-python\/","title":{"rendered":"Introdu\u00e7\u00e3o \u00e0 an\u00e1lise de sentimentos em Python"},"content":{"rendered":"<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-571581 size-full\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/05\/PC-social-BlogFeatured-1280x720-2x-17.png\" alt=\"\" width=\"2559\" height=\"1439\" \/><\/figure>\n<p>A an\u00e1lise de sentimentos \u00e9 uma das maneiras mais populares de analisar textos. Ela permite visualizar em um relance como as pessoas se sentem em uma grande variedade de \u00e1reas e tem aplica\u00e7\u00f5es \u00fateis em setores como o suporte ao cliente, a pesquisa de mercado e de produtos e a an\u00e1lise competitiva.<\/p>\n<p>Como qualquer \u00e1rea do processamento de linguagem natural (NLP), a an\u00e1lise de sentimentos pode ficar complexa. Por sorte, o <a href=\"https:\/\/www.jetbrains.com\/guide\/python\/\" target=\"_blank\" rel=\"noopener\">Python<\/a> tem excelentes pacotes e ferramentas que tornam muito mais f\u00e1cil abordar este ramo do NLP.<\/p>\n<p>Nesta postagem de blog, vamos explorar alguns dos pacotes mais populares para an\u00e1lise de sentimentos em Python, como eles funcionam e como voc\u00ea pode treinar o seu pr\u00f3prio modelo de an\u00e1lise de sentimentos usando t\u00e9cnicas de ponta. Tamb\u00e9m daremos uma olhada em alguns recursos do <a href=\"https:\/\/www.jetbrains.com\/pycharm\/data-science\/\" target=\"_blank\" rel=\"noopener\" data-type=\"link\" data-id=\"https:\/\/www.jetbrains.com\/pycharm\/data-science\/\">PyCharm<\/a> que tornam mais f\u00e1cil e r\u00e1pido trabalhar com esses pacotes.<\/p>\n<h2 class=\"wp-block-heading\">O que \u00e9 a an\u00e1lise de sentimentos?<\/h2>\n<p>A an\u00e1lise de sentimentos \u00e9 o processo de analisar um texto para determinar seu tom emocional. Como voc\u00ea provavelmente pode perceber a partir desta defini\u00e7\u00e3o, a an\u00e1lise de sentimentos \u00e9 uma \u00e1rea muito ampla, que incorpora uma grande variedade de m\u00e9todos dentro do campo do processamento de linguagem natural.<\/p>\n<p>H\u00e1 muitas maneiras de definir &#8220;tom emocional&#8221;. Os m\u00e9todos mais usados determinam a <em>val\u00eancia<\/em> ou <em>polaridade<\/em> de um texto \u2014 isto \u00e9, o quanto o sentimento expresso nele \u00e9 positivo ou negativo. Geralmente, o tom emocional tamb\u00e9m \u00e9 tratado como um problema de classifica\u00e7\u00e3o de textos, no qual estes s\u00e3o classificados como positivos ou negativos.<\/p>\n<p>Veja, por exemplo, esta <a href=\"https:\/\/www.amazon.com\/AmazonBasics-12-Cup-Coffee-Reusable-Stainless\/dp\/B084ZH769P\/ref=sr_1_1_ffob_sspa?th=1\" target=\"_blank\" rel=\"noopener\">avalia\u00e7\u00e3o de produto na Amazon<\/a>:<\/p>\n<figure class=\"wp-block-image size-full is-resized\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-532284\" style=\"aspect-ratio: 3.373529411764706; width: 840px; height: auto;\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/11\/Screenshot-2024-07-24-at-15.14.00.png\" alt=\"\" width=\"2294\" height=\"680\" \/><\/figure>\n<p>Obviamente, este cliente n\u00e3o ficou satisfeito e as t\u00e9cnicas de an\u00e1lise de sentimentos classificariam esta avalia\u00e7\u00e3o como negativa.<\/p>\n<p>Agora compare essa primeira avalia\u00e7\u00e3o com esta, de um comprador muito mais satisfeito:<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-532295\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/11\/Screenshot-2024-07-24-at-15.13.21.png\" alt=\"\" width=\"1566\" height=\"408\" \/><\/figure>\n<p>Desta vez, as t\u00e9cnicas de an\u00e1lise de sentimentos classificariam esta avalia\u00e7\u00e3o como positiva.<\/p>\n<h3 class=\"wp-block-heading\">Diferentes tipos de an\u00e1lise de sentimentos<\/h3>\n<p>H\u00e1 diversas maneiras de extrair informa\u00e7\u00f5es emocionais de um texto. Vamos ver algumas das mais importantes.<\/p>\n<h4 class=\"wp-block-heading\">Maneiras de definir sentimentos<\/h4>\n<p>Em primeiro lugar, as abordagens de an\u00e1lise de sentimentos t\u00eam diversas maneiras de definir sentimentos ou emo\u00e7\u00f5es.<\/p>\n<p><strong>Bin\u00e1ria<\/strong>: Aqui, a val\u00eancia de um documento \u00e9 dividida em duas categorias, <em>positiva<\/em> ou <em>negativa<\/em>, como no caso do <a href=\"https:\/\/huggingface.co\/datasets\/stanfordnlp\/sst2\" target=\"_blank\" rel=\"noopener\">conjunto de dados SST-2<\/a>. H\u00e1 classifica\u00e7\u00f5es relacionadas de val\u00eancia que adicionam uma classe <em>neutra<\/em> (na qual um texto n\u00e3o expressa nenhum sentimento em rela\u00e7\u00e3o a um assunto) ou at\u00e9 uma classe <em>conflitante<\/em> (na qual um texto expressa sentimentos tanto positivos quanto negativos em rela\u00e7\u00e3o a um assunto).<\/p>\n<p>Alguns analisadores de sentimentos usam uma medida relacionada para classificar os textos em <em>subjetivos<\/em> ou <em>objetivos<\/em>.<\/p>\n<p><strong>Granular<\/strong>: Este termo descreve v\u00e1rias maneiras diferentes de abordar a an\u00e1lise de sentimentos, mas aqui ele se refere a decompor uma val\u00eancia positiva ou negativa em uma escala de Likert. Um exemplo bem conhecido \u00e9 o <a href=\"https:\/\/huggingface.co\/datasets\/SetFit\/sst5\" target=\"_blank\" rel=\"noopener\">conjunto de dados SST-5<\/a>, que usa uma escala de Likert de cinco pontos, com as classes <em>muito positiva<\/em>, <em>positiva<\/em>, <em>neutra<\/em>, <em>negativa<\/em> e <em>muito negativa<\/em>.<\/p>\n<p><strong>Cont\u00ednua<\/strong>: A val\u00eancia de um texto tamb\u00e9m pode ser medida de forma cont\u00ednua, com pontua\u00e7\u00f5es indicando o quanto o sentimento do autor era positivo ou negativo. Por exemplo, o <a href=\"https:\/\/github.com\/cjhutto\/vaderSentiment\" target=\"_blank\" rel=\"noopener\">analisador de sentimentos VADER<\/a> atribui a um texto uma pontua\u00e7\u00e3o entre \u22121 (<em>fortemente negativa<\/em>) e 1 (<em>fortemente positiva<\/em>), com pontua\u00e7\u00f5es pr\u00f3ximas de 0 indicando um sentimento neutro.<\/p>\n<p><strong>Baseada em emo\u00e7\u00f5es<\/strong>: Esta abordagem tamb\u00e9m \u00e9 conhecida como detec\u00e7\u00e3o ou identifica\u00e7\u00e3o de emo\u00e7\u00f5es e tenta detectar a emo\u00e7\u00e3o espec\u00edfica que est\u00e1 sendo expressa em um texto. Pode-se usar essa abordagem de duas maneiras. A detec\u00e7\u00e3o categ\u00f3rica de emo\u00e7\u00f5es tenta enquadrar o sentimento expresso em um texto em uma emo\u00e7\u00e3o discreta dentro de um grupo delas, geralmente baseando-se no modelo de <a href=\"https:\/\/www.tandfonline.com\/doi\/abs\/10.1080\/02699939208411068\" target=\"_blank\" rel=\"noopener\">Ekman<\/a>, que inclui <em>raiva<\/em>, <em>asco<\/em>, <em>medo<\/em>, <em>alegria<\/em>, <em>tristeza<\/em> e <em>surpresa<\/em>. Existem <a href=\"https:\/\/huggingface.co\/j-hartmann\/emotion-english-distilroberta-base#appendix-%F0%9F%93%9A\" target=\"_blank\" rel=\"noopener\">alguns conjuntos de dados<\/a> para esse tipo de detec\u00e7\u00e3o de emo\u00e7\u00f5es. \u00c9 menos comum usar a detec\u00e7\u00e3o dimensional de emo\u00e7\u00f5es na an\u00e1lise de sentimentos, que em vez disso tenta medir <a href=\"https:\/\/link.springer.com\/article\/10.1007\/s12144-014-9219-4\" target=\"_blank\" rel=\"noopener\">tr\u00eas aspectos emocionais<\/a> em um texto: <em>polaridade<\/em>, <em>empolga\u00e7\u00e3o<\/em> (o quanto um sentimento \u00e9 empolgante) e <em>domin\u00e2ncia<\/em> (o quanto a express\u00e3o emocional \u00e9 restrita).<\/p>\n<h4 class=\"wp-block-heading\">N\u00edveis da an\u00e1lise<\/h4>\n<p>Tamb\u00e9m podemos considerar diferentes n\u00edveis nos quais podemos analisar um texto. Para compreendermos isso melhor, vamos considerar outra avalia\u00e7\u00e3o da cafeteira:<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-532307\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/11\/Screenshot-2024-07-24-at-16.43.21.png\" alt=\"\" width=\"1438\" height=\"374\" \/><\/figure>\n<p><strong>N\u00edvel do documento<\/strong>: Este \u00e9 o n\u00edvel mais b\u00e1sico de an\u00e1lise, que retorna um sentimento para todo um texto. A an\u00e1lise no n\u00edvel 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\u00e1lise dos sentimentos desta avalia\u00e7\u00e3o no documento inteiro, ela provavelmente ser\u00e1 classificada como neutra ou conflitante, pois h\u00e1 dois sentimentos opostos em rela\u00e7\u00e3o \u00e0 mesma cafeteira.<\/p>\n<p><strong>N\u00edvel das frases<\/strong>: Aqui, o sentimento de cada frase \u00e9 previsto separadamente. Na avalia\u00e7\u00e3o da cafeteira, a an\u00e1lise no n\u00edvel das frases nos dir\u00e1 que o avaliador teve sentimentos positivos sobre algumas partes do produto, mas negativos sobre outras. Por\u00e9m, essa an\u00e1lise n\u00e3o nos diz do que o avaliador gostou ou n\u00e3o na cafeteira.<\/p>\n<p><strong>An\u00e1lise baseada nos aspectos<\/strong>: Este tipo de an\u00e1lise de sentimentos mergulha mais profundamente em um texto e tenta compreender o sentimento dos usu\u00e1rios quanto a aspectos espec\u00edficos. Na nossa avalia\u00e7\u00e3o da cafeteira, a avaliadora mencionou dois aspectos: <em>apar\u00eancia<\/em> e <em>ru\u00eddo<\/em>. Extraindo esses aspectos, temos mais informa\u00e7\u00f5es sobre do que a usu\u00e1ria gostou ou n\u00e3o especificamente. Ela teve um sentimento positivo quanto \u00e0 apar\u00eancia da m\u00e1quina, mas teve um sentimento negativo quanto ao ru\u00eddo que ela fazia.<\/p>\n<h4 class=\"wp-block-heading\">Associando a an\u00e1lise de sentimentos com outras t\u00e9cnicas de NLP<\/h4>\n<p><strong>An\u00e1lise baseada em inten\u00e7\u00f5es<\/strong>: Neste \u00faltimo tipo de an\u00e1lise de sentimentos, o texto \u00e9 classificado de duas maneiras: em termos do sentimento que est\u00e1 sendo expresso e do assunto. Por exemplo, se uma empresa de telecomunica\u00e7\u00f5es receber um ticket reclamando da frequ\u00eancia com que seu servi\u00e7o sai do ar, poder\u00e1 classificar a inten\u00e7\u00e3o ou assunto do texto como <em>confiabilidade do servi\u00e7o<\/em> e o sentimento como <em>negativo<\/em>. Assim como no caso da an\u00e1lise de sentimentos baseada no aspecto, este tipo de an\u00e1lise d\u00e1 \u00e0 empresa muito mais informa\u00e7\u00f5es que simplesmente saber se seus clientes est\u00e3o satisfeitos ou n\u00e3o no geral.<\/p>\n<h3 class=\"wp-block-heading\">Aplica\u00e7\u00f5es da an\u00e1lise de sentimentos<\/h3>\n<p>A esta altura, provavelmente voc\u00ea j\u00e1 consegue pensar em alguns casos de uso em potencial para a an\u00e1lise de sentimentos. Basicamente, ela pode ser usada em qualquer situa\u00e7\u00e3o em que seja poss\u00edvel obter feedback ou opini\u00f5es na forma de texto a respeito de algum assunto. Pessoas e empresas podem us\u00e1-la para monitorar as redes sociais e ver como as pessoas se sentem a respeito de uma marca, entidade do governo ou assunto.<\/p>\n<p>A an\u00e1lise do feedback de clientes pode ser usada para descobrir o sentimento expresso no feedback ou em tickets de suporte. Avalia\u00e7\u00f5es de produtos podem ser analisadas para ver o quanto as pessoas est\u00e3o satisfeitas ou insatisfeitas com os produtos de uma empresa. Por fim, a an\u00e1lise de sentimentos pode ser um componente-chave na pesquisa de mercado e na an\u00e1lise competitiva, nas quais a forma como as pessoas se sentem a respeito de tend\u00eancias, recursos e concorrentes emergentes pode ajudar a orientar as estrat\u00e9gias de uma empresa.<\/p>\n<h2 class=\"wp-block-heading\">Como funciona a an\u00e1lise de sentimentos?<\/h2>\n<p>Em um n\u00edvel mais geral, a an\u00e1lise de sentimentos opera associando palavras (ou, nos modelos mais sofisticados, o tom geral de um texto) a uma emo\u00e7\u00e3o. As abordagens mais comuns da an\u00e1lise de sentimentos caem em um dos tr\u00eas m\u00e9todos abaixo.<\/p>\n<h3 class=\"wp-block-heading\">Abordagens baseadas em l\u00e9xico<\/h3>\n<p>Estes m\u00e9todos usam um l\u00e9xico que inclui pontua\u00e7\u00f5es de sentimentos para um conjunto de palavras. Eles combinam essas pontua\u00e7\u00f5es, usando um conjunto de regras para obterem o sentimento geral de um texto. Tendem a ser muito r\u00e1pidos e tamb\u00e9m t\u00eam a vantagem de produzirem pontua\u00e7\u00f5es de sentimentos mais granulares. Por\u00e9m, o l\u00e9xico tem que ser elaborado manualmente e, por isso, pode ser demorado e dispendioso para produzir.<\/p>\n<h3 class=\"wp-block-heading\">Modelos de aprendizado de m\u00e1quina<\/h3>\n<p>Estes m\u00e9todos treinam um modelo de aprendizado de m\u00e1quina, geralmente um classificador bayesiano ing\u00eanuo, com um conjunto de dados que cont\u00e9m texto e r\u00f3tulos de sentimento \u2014 por exemplo, avalia\u00e7\u00f5es de filmes. Neste modelo, os textos geralmente s\u00e3o classificados como positivos, negativos e \u00e0s vezes, neutros. Estes modelos tamb\u00e9m tendem a ser muito r\u00e1pidos, mas como geralmente n\u00e3o levam em conta a rela\u00e7\u00e3o entre as palavras nos textos de entrada, podem ter dificuldades com textos mais complexos, envolvendo qualificadores e nega\u00e7\u00f5es.<\/p>\n<h3 class=\"wp-block-heading\">Modelos grandes de linguagem<\/h3>\n<p>Estes m\u00e9todos dependem de um ajuste fino de um modelo grande de linguagem pr\u00e9-treinado, baseado em transformadores e usando os mesmos conjuntos de dados usados para treinar os demais classificadores de aprendizado de m\u00e1quina mencionados acima. Estes modelos sofisticados conseguem modelar rela\u00e7\u00f5es complexas entre as palavras de um texto, mas tendem a ser mais lentos que os outros dois m\u00e9todos.<\/p>\n<h2 class=\"wp-block-heading\">An\u00e1lise de sentimentos em Python<\/h2>\n<p>O <a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/python.html\" target=\"_blank\" rel=\"noopener\">Python<\/a> tem um rico ecossistema de pacotes para <a href=\"https:\/\/blog.jetbrains.com\/pycharm\/tag\/nlp\/\">NLP<\/a>. Isso significa que voc\u00ea tem in\u00fameras alternativas ao fazer an\u00e1lise de sentimentos nessa linguagem.<\/p>\n<p>Vamos analisar alguns dos <a href=\"https:\/\/www.jetbrains.com\/guide\/python\/tutorials\/getting-started-pycharm\/installing-and-managing-python-packages\/\" target=\"_blank\" rel=\"noopener\">pacotes mais populares<\/a> para an\u00e1lise de sentimentos em Python.<\/p>\n<h3 class=\"wp-block-heading\">As melhores bibliotecas em Python para an\u00e1lise de sentimentos<\/h3>\n<h4 class=\"wp-block-heading\">VADER<\/h4>\n<p>O <a href=\"https:\/\/www.nltk.org\/api\/nltk.sentiment.vader.html\" target=\"_blank\" rel=\"noopener\">VADER (Valence Aware Dictionary and Sentiment Reasoner)<\/a> \u00e9 um analisador de sentimentos popular, baseado em l\u00e9xico. Criado sobre o poderoso <a href=\"https:\/\/www.nltk.org\/index.html\" target=\"_blank\" rel=\"noopener\">pacote NLTK<\/a>, este analisador retorna quatro pontua\u00e7\u00f5es de sentimentos: o grau em que o texto \u00e9 <em>positivo<\/em>, <em>neutro<\/em> ou <em>negativo<\/em> e uma pontua\u00e7\u00e3o <em>composta<\/em> dos sentimentos. As pontua\u00e7\u00f5es positiva, neutra e negativa variam de 0 a 1 e indicam a propor\u00e7\u00e3o do texto que era positiva, neutra ou negativa. A pontua\u00e7\u00e3o composta varia de \u22121 (extremamente negativa) a 1 (extremamente positiva) e indica a val\u00eancia geral dos sentimentos no texto.<\/p>\n<p>Vamos dar uma olhada em um exemplo b\u00e1sico de como ele funciona:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from nltk.sentiment.vader import SentimentIntensityAnalyzer\nimport nltk<\/pre>\n<p>Primeiro, precisamos baixar o l\u00e9xico do VADER.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">nltk.download('vader_lexicon')<\/pre>\n<p>Ent\u00e3o, podemos criar uma inst\u00e2ncia do <code>SentimentIntensityAnalyzer()<\/code> do VADER e extrair as pontua\u00e7\u00f5es de sentimentos, atrav\u00e9s do m\u00e9todo <code>polarity_scores()<\/code>.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">analyzer = SentimentIntensityAnalyzer()\n\nsentence = \"I love PyCharm! It's my favorite Python IDE.\"\nsentiment_scores = analyzer.polarity_scores(sentence)\nprint(sentiment_scores)<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">{'neg': 0.0, 'neu': 0.572, 'pos': 0.428, 'compound': 0.6696}<\/pre>\n<p>Podemos ver que o VADER atribuiu uma pontua\u00e7\u00e3o geral de sentimentos de 0,67 a esse texto e classificou seu conte\u00fado como 43% positivo, 57% neutro e 0% negativo.<\/p>\n<p>O VADER funciona consultando a pontua\u00e7\u00e3o de sentimentos de cada palavra em seu l\u00e9xico e combinando essas pontua\u00e7\u00f5es atrav\u00e9s de um conjunto de regras com nuances. Por exemplo, a intensidade do sentimento de uma palavra pode ser aumentada ou diminu\u00edda por qualificadores. Assim, um qualificador como &#8220;um pouquinho&#8221; diminui a intensidade do sentimento, mas &#8220;extremamente&#8221; a amplifica.<\/p>\n<p>O l\u00e9xico do VADER inclui abreviaturas como &#8220;smh&#8221; (&#8220;shaking my head&#8221;, &#8220;balan\u00e7ando minha cabe\u00e7a&#8221;) e emojis, o que o torna especialmente adequado para textos de redes sociais. A principal limita\u00e7\u00e3o do VADER \u00e9 que ele s\u00f3 funciona para textos em ingl\u00eas, mas voc\u00ea pode usar projetos como o <a href=\"https:\/\/github.com\/brunneis\/vader-multi\" target=\"_blank\" rel=\"noopener\"><code>vader-multi<\/code><\/a> como alternativas. Se voc\u00ea estiver interessado em se aprofundar neste pacote, j\u00e1 escrevi sobre <a href=\"https:\/\/t-redactyl.io\/blog\/2017\/04\/using-vader-to-handle-sentiment-analysis-with-social-media-text.html\" target=\"_blank\" rel=\"noopener\">como o VADER funciona<\/a>.<\/p>\n<h4 class=\"wp-block-heading\">NLTK<\/h4>\n<p>Voc\u00ea tamb\u00e9m pode usar o NLTK para treinar o seu pr\u00f3prio classificador de sentimentos baseado em aprendizado de m\u00e1quina, usando classificadores do <code>scikit-learn<\/code>.<\/p>\n<p>H\u00e1 muitas maneiras de processar o texto a ser fornecido a esses modelos, mas a maneira mais simples \u00e9 baseando-se nas palavras presentes no texto, um tipo de modelagem de textos chamada abordagem &#8220;saco de palavras&#8221; (bag-of-words). O tipo mais direto de modelagem de saco de palavras \u00e9 a <em>vetoriza\u00e7\u00e3o bin\u00e1ria<\/em>, na qual cada palavra \u00e9 tratada como uma caracter\u00edstica e o valor dessa caracter\u00edstica \u00e9 0 ou 1 (significando, respectivamente, que aquela palavra est\u00e1 presente ou ausente no texto).<\/p>\n<p>Se voc\u00ea 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\u00e1quina, dei uma <a href=\"https:\/\/www.youtube.com\/live\/WYmyZBg2VFI?feature=shared&amp;t=261\" target=\"_blank\" rel=\"noopener\">palestra sobre esse assunto<\/a> que d\u00e1 uma introdu\u00e7\u00e3o suave a ele.<\/p>\n<p>Voc\u00ea pode ver um exemplo na <a href=\"https:\/\/www.nltk.org\/howto\/sentiment.html#sentiment-analysis\" target=\"_blank\" rel=\"noopener\">documenta\u00e7\u00e3o do NLTK<\/a>, na qual se treina um classificador bayesiano ing\u00eanuo para prever se um texto \u00e9 subjetivo ou objetivo. Nesse exemplo, alguns termos recebem um qualificador adicional de nega\u00e7\u00e3o, com base em regras que indicam se \u00e9 prov\u00e1vel que aquela palavra ou caractere esteja negando um sentimento expresso em outro lugar do texto. Se voc\u00ea quiser saber mais sobre este assunto, o Real Python tamb\u00e9m tem um <a href=\"https:\/\/realpython.com\/python-nltk-sentiment-analysis\/#customizing-nltks-sentiment-analysis\" target=\"_blank\" rel=\"noopener\">tutorial de an\u00e1lise de sentimentos<\/a> que ensina como treinar os seus pr\u00f3prios classificadores usando o NLTK.<\/p>\n<h4 class=\"wp-block-heading\">Pattern e TextBlob<\/h4>\n<p>O pacote <a href=\"https:\/\/github.com\/clips\/pattern\" target=\"_blank\" rel=\"noopener\">Pattern<\/a> fornece outra abordagem baseada no l\u00e9xico para <a href=\"https:\/\/github.com\/clips\/pattern\/blob\/d25511f9ca7ed9356b801d8663b8b5168464e68f\/pattern\/text\/__init__.py#L2316\" target=\"_blank\" rel=\"noopener\">analisar sentimentos<\/a>. Ele usa o l\u00e9xico <a href=\"https:\/\/github.com\/aesuli\/SentiWordNet\" target=\"_blank\" rel=\"noopener\">SentiWordNet<\/a>, no qual a cada grupo de sin\u00f4nimos (<em>synset<\/em>) do <a href=\"https:\/\/github.com\/clips\/pattern\" target=\"_blank\" rel=\"noopener\">WordNet<\/a> \u00e9 atribu\u00edda uma pontua\u00e7\u00e3o para positividade, negatividade e objetividade. As pontua\u00e7\u00f5es positiva e negativa de cada palavra s\u00e3o combinadas atrav\u00e9s de uma s\u00e9rie de regras para darem uma pontua\u00e7\u00e3o final de polaridade. De forma semelhante, a pontua\u00e7\u00e3o de polaridade de cada palavra \u00e9 combinada para dar uma pontua\u00e7\u00e3o final de subjetividade.<\/p>\n<p>Como o WordNet cont\u00e9m informa\u00e7\u00f5es sobre categorias gramaticais, as regras podem levar em conta se h\u00e1 adjetivos ou adv\u00e9rbios associados a uma palavra modificando seu sentimento. O conjunto de regras tamb\u00e9m considera nega\u00e7\u00f5es, pontos de exclama\u00e7\u00e3o e emojis, e at\u00e9 inclui algumas regras para lidar com express\u00f5es idiom\u00e1ticas e sarcasmo.<\/p>\n<p>Por\u00e9m, como biblioteca stand-alone, o Pattern s\u00f3 \u00e9 compat\u00edvel com o Python 3.6. Assim, a maneira mais comum de usar o Pattern \u00e9 atrav\u00e9s do <a href=\"https:\/\/textblob.readthedocs.io\/en\/dev\/\" target=\"_blank\" rel=\"noopener\">TextBlob<\/a>. Como padr\u00e3o, o <a href=\"https:\/\/github.com\/sloria\/TextBlob\/blob\/e19171014bfba910d1e33527f46d514837da234e\/src\/textblob\/en\/sentiments.py#L15\" target=\"_blank\" rel=\"noopener\">analisador de sentimentos TextBlob<\/a> usa sua pr\u00f3pria implementa\u00e7\u00e3o da biblioteca Pattern para gerar pontua\u00e7\u00f5es de sentimentos.<\/p>\n<p>Vamos dar uma olhada nisso em a\u00e7\u00e3o:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from textblob import TextBlob<\/pre>\n<p>Veja que executamos o m\u00e9todo TextBlob no nosso texto e depois extraimos os sentimentos usando o atributo <code>sentiment<\/code>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">pattern_blob = TextBlob(\"I love PyCharm! It's my favorite Python IDE.\")\nsentiment = pattern_blob.sentiment\n\nprint(f\"Polarity: {sentiment.polarity}\")\nprint(f\"Subjectivity: {sentiment.subjectivity}\")<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Polarity: 0.625\nSubjectivity: 0.6<\/pre>\n<p>Para nossa frase de exemplo, o Pattern no TextBlob d\u00e1 uma pontua\u00e7\u00e3o de polaridade de 0,625 (relativamente pr\u00f3xima \u00e0 dada pelo VADER) e uma pontua\u00e7\u00e3o de subjetividade de 0,6.<\/p>\n<p>Mas tamb\u00e9m h\u00e1 uma outra maneira de obter pontua\u00e7\u00f5es de sentimentos com o TextBlob. Esse pacote tamb\u00e9m inclui um <a href=\"https:\/\/github.com\/sloria\/TextBlob\/blob\/e19171014bfba910d1e33527f46d514837da234e\/src\/textblob\/en\/sentiments.py#L53\" target=\"_blank\" rel=\"noopener\">classificador bayesiano ing\u00eanuo pr\u00e9-treinado<\/a>, que rotula um texto como positivo ou negativo e fornece a probabilidade de esse texto ser positivo ou negativo.<\/p>\n<p>Para usar este m\u00e9todo, primeiro \u00e9 preciso baixar do NLTK o m\u00f3dulo <code>punkt<\/code> e o conjunto de dados <code>movie-reviews<\/code>, usados para treinar este modelo.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import nltk\nnltk.download('movie_reviews')\nnltk.download('punkt')\n\nfrom textblob import TextBlob\nfrom textblob.sentiments import NaiveBayesAnalyzer<\/pre>\n<p>Mais uma vez, precisaremos executar o <code>TextBlob<\/code> no nosso texto, mas desta vez adicionando o argumento <code>analyzer=NaiveBayesAnalyzer()<\/code>. Em seguida, como antes, usaremos o atributo &#8220;sentiment&#8221; para extrair as pontua\u00e7\u00f5es de sentimentos.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">nb_blob = TextBlob(\"I love PyCharm! It's my favorite Python IDE.\", analyzer=NaiveBayesAnalyzer())\nsentiment = nb_blob.sentiment\nprint(sentiment)<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Sentiment(classification='pos', p_pos=0.5851800554016624, p_neg=0.4148199445983381)<\/pre>\n<p>Desta vez, terminamos com um r\u00f3tulo <code>pos<\/code> (positivo), com o modelo prevendo que o texto tem uma probabilidade de 59% de ser positivo e de 41% de ser negativo.<\/p>\n<h4 class=\"wp-block-heading\">spaCy<\/h4>\n<p>Outra op\u00e7\u00e3o \u00e9 usar o <a href=\"https:\/\/spacy.io\/\" target=\"_blank\" rel=\"noopener\">spaCy<\/a> para a an\u00e1lise de sentimentos. Este \u00e9 outro pacote popular para NLP em Python. Ele tem uma grande variedade de op\u00e7\u00f5es para processar textos.<\/p>\n<p>O primeiro m\u00e9todo usa o plug-in <a href=\"https:\/\/spacy.io\/universe\/project\/spacy-textblob\" target=\"_blank\" rel=\"noopener\">spacytextblob<\/a> para executar o analisador de sentimentos do TextBlob como parte do pipeline do spaCy. Mas antes que voc\u00ea possa fazer isso, precisar\u00e1 instalar tanto o <code>spacy<\/code> quanto o <code>spacytextblob<\/code> e baixar o modelo apropriado de linguagem.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import spacy\nimport spacy.cli\nfrom spacytextblob.spacytextblob import SpacyTextBlob\n\nspacy.cli.download(\"en_core_web_sm\")<\/pre>\n<p>Ent\u00e3o, carregamos esse modelo de linguagem e adicionamos <code>spacytextblob<\/code> ao nosso pipeline de processamento de textos. O TextBlob pode ser usado atrav\u00e9s do m\u00e9todo <code>pipe<\/code> do spaCy, o que significa que podemos inclu\u00ed-lo como parte de um pipeline mais complexo de processamento de textos, incluindo etapas de pr\u00e9-processamento, como marca\u00e7\u00e3o de categorias gramaticais, lematiza\u00e7\u00e3o e reconhecimento de entidades nomeadas. O pr\u00e9-processamento pode normatizar e enriquecer o texto, ajudando modelos executados mais adiante a obterem o m\u00e1ximo de informa\u00e7\u00f5es das entradas de texto.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">nlp = spacy.load('en_core_web_sm')\nnlp.add_pipe('spacytextblob')<\/pre>\n<p>Por enquanto, apenas analisaremos nossa frase de exemplo, sem pr\u00e9-processamento:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">doc = nlp(\"I love PyCharm! It's my favorite Python IDE.\")\n\nprint('Polarity: ', doc._.polarity)\nprint('Subjectivity: ', doc._.subjectivity)<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Polarity:  0.625\nSubjectivity:  0.6<\/pre>\n<p>Obteremos os mesmos resultados que quando usamos o TextBlob, acima.<\/p>\n<p>Uma segunda maneira de fazer an\u00e1lise de sentimentos no spaCy \u00e9 treinar nosso pr\u00f3prio modelo, usando a <a href=\"https:\/\/spacy.io\/api\/textcategorizer\" target=\"_blank\" rel=\"noopener\">classe TextCategorizer<\/a>. Isso permite treinar diversos <a href=\"https:\/\/spacy.io\/api\/architectures\" target=\"_blank\" rel=\"noopener\">modelos criados pelo spaCy<\/a> atrav\u00e9s de um modelo de treinamento de an\u00e1lise de sentimentos. Novamente, como isso pode ser usado como parte do pipeline do spaCy, voc\u00ea tem muitas op\u00e7\u00f5es para pr\u00e9-processar o seu texto antes de treinar o seu modelo.<\/p>\n<p>Finalmente, voc\u00ea pode usar modelos grandes de linguagem (LLMs) para fazer an\u00e1lise de sentimentos atrav\u00e9s do <a href=\"https:\/\/spacy.io\/api\/large-language-models#sentiment\" target=\"_blank\" rel=\"noopener\">spacy-llm<\/a>. Isso permite enviar prompts a diversos LLMs da OpenAI, Anthropic, Cohere e Google para executar an\u00e1lise de sentimentos nos seus textos.<\/p>\n<p>Esta abordagem funciona de forma ligeiramente diferente dos outros m\u00e9todos que discutimos. Em vez de treinarmos um modelo, podemos usar modelos generalistas como o GPT-4 para prever o sentimento de um texto. Voc\u00ea pode fazer isso atrav\u00e9s de aprendizado &#8220;zero-shot&#8221; (no qual \u00e9 passado um prompt ao modelo, mas n\u00e3o \u00e9 passado nenhum exemplo) ou &#8220;few-shot&#8221; (no qual s\u00e3o passados um prompt e alguns exemplos ao modelo).<\/p>\n<h4 class=\"wp-block-heading\">Transformers<\/h4>\n<p>O \u00faltimo pacote de an\u00e1lise de sentimentos em Python que discutiremos \u00e9 o <a href=\"https:\/\/huggingface.co\/docs\/transformers\/en\/index\" target=\"_blank\" rel=\"noopener\">Transformers<\/a>, da <a href=\"https:\/\/huggingface.co\/\" target=\"_blank\" rel=\"noopener\">Hugging Face<\/a>.<\/p>\n<p>A Hugging Face hospeda todos os principais LLMs de c\u00f3digo aberto para uso gratuito (dentre outros modelos, inclusive de vis\u00e3o computacional e de \u00e1udio) e oferece uma plataforma para treinar, implantar e compartilhar esses modelos. Seu pacote Transformers oferece uma grande variedade de recursos (incluindo an\u00e1lise de sentimentos) para trabalhar com os LLMs hospedados pela Hugging Face.<\/p>\n<h2 class=\"wp-block-heading\">Compreendendo os resultados dos analisadores de sentimentos<\/h2>\n<p>Agora que j\u00e1 abordamos todas as maneiras pelas quais se pode fazer an\u00e1lise de sentimentos em Python, talvez voc\u00ea esteja se perguntando como pode aplic\u00e1-las aos seus pr\u00f3prios dados.<\/p>\n<p>Para compreender isso, vamos usar o PyCharm para comparar dois pacotes: o VADER e o TextBlob. Suas v\u00e1rias pontua\u00e7\u00f5es de sentimentos oferecem algumas perspectivas diferentes a respeito dos nossos dados. Usaremos esses pacotes para analisar o conjunto de dados de avalia\u00e7\u00f5es da Amazon.<\/p>\n<p>O PyCharm Professional \u00e9 um poderoso IDE para <a href=\"https:\/\/www.jetbrains.com\/pycharm\/data-science\/\" target=\"_blank\" rel=\"noopener\">ci\u00eancia de dados<\/a> em Python, com suporte a recursos avan\u00e7ados de <a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/auto-completing-code.html\" target=\"_blank\" rel=\"noopener\">complementa\u00e7\u00e3o de c\u00f3digo<\/a>, inspe\u00e7\u00f5es e <a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/debugging-code.html\" target=\"_blank\" rel=\"noopener\">depura\u00e7\u00e3o<\/a> em Python, rico suporte a <a href=\"https:\/\/www.jetbrains.com\/pycharm\/integrations\/#databases\" target=\"_blank\" rel=\"noopener\">bancos de dados<\/a>, <a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/running-jupyter-notebook-cells.html\" target=\"_blank\" rel=\"noopener\">Jupyter<\/a>, <a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/using-git-integration.html\" target=\"_blank\" rel=\"noopener\">Git<\/a>, <a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/conda-support-creating-conda-virtual-environment.html\" target=\"_blank\" rel=\"noopener\">Conda<\/a> e muito mais \u2014 tudo isso desde a instala\u00e7\u00e3o. Al\u00e9m destes recursos, voc\u00ea tamb\u00e9m tem outros incrivelmente \u00fateis, como nossas <em>estat\u00edsticas de colunas<\/em> e <em>visualiza\u00e7\u00e3o em gr\u00e1ficos<\/em>, al\u00e9m de <a href=\"https:\/\/www.jetbrains.com\/pycharm\/integrations\/\" target=\"_blank\" rel=\"noopener\">integra\u00e7\u00f5es<\/a> com o Hugging Face que tornam muito mais f\u00e1cil e r\u00e1pido trabalhar com LLMs. Nesta postagem, vamos explorar os recursos avan\u00e7ados do PyCharm para trabalhar com dataframes. Isso nos permitir\u00e1 ter uma r\u00e1pida vis\u00e3o geral de como as pontua\u00e7\u00f5es de sentimentos se distribuem nos dois pacotes.<\/p>\n<p>Se voc\u00ea j\u00e1 estiver pronto para iniciar o seu pr\u00f3prio projeto de an\u00e1lise de sentimentos, pode ativar a sua assinatura gratuita de tr\u00eas meses do PyCharm. Clique no link abaixo e digite este c\u00f3digo promocional: <strong>PCSA24<\/strong>. Voc\u00ea ent\u00e3o receber\u00e1 um c\u00f3digo de ativa\u00e7\u00e3o por e-mail.<\/p>\n<div class=\"buttons\">\n<div class=\"buttons__row\"><a class=\"btn\" href=\"https:\/\/www.jetbrains.com\/store\/redeem\/\" target=\"\" rel=\"noopener\">Ative a sua assinatura de 3 meses<\/a><\/div>\n<\/div>\n<p>A primeira coisa que precisamos fazer \u00e9 carregar os dados. Podemos usar o m\u00e9todo <code>load_dataset()<\/code>, do pacote Datasets, para baixar esses <a href=\"https:\/\/huggingface.co\/datasets\/fancyzhx\/amazon_polarity\" target=\"_blank\" rel=\"noopener\">dados do hub do Hugging Face<\/a>.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from datasets import load_dataset\namazon = load_dataset(\"fancyzhx\/amazon_polarity\")<\/pre>\n<p>Voc\u00ea 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\u00e1 uma maneira conveniente de obter informa\u00e7\u00f5es sobre os ativos do Hugging Face, sem sair do IDE.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-532334\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/11\/Screenshot-2024-11-29-at-16.59.07.png\" alt=\"\" width=\"2354\" height=\"1372\" \/><\/figure>\n<p>Aqui podemos ver o conte\u00fado desse conjunto de dados:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">amazon<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">DatasetDict({\n    train: Dataset({\n        features: ['label', 'title', 'content'],\n        num_rows: 3600000\n    })\n    test: Dataset({\n        features: ['label', 'title', 'content'],\n        num_rows: 400000\n    })\n})<\/pre>\n<p>O conjunto de dados de treinamento tem 3,6 milh\u00f5es de observa\u00e7\u00f5es e o conjunto de dados de teste cont\u00e9m 400.000. Neste tutorial, trabalharemos com o conjunto de dados de treinamento.<\/p>\n<p>Agora vamos carregar o <code>SentimentIntensityAnalyzer<\/code> do VADER e o m\u00e9todo do TextBlob.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from nltk.sentiment.vader import SentimentIntensityAnalyzer\nimport nltk\n\nnltk.download(\"vader_lexicon\")\n\nanalyzer = SentimentIntensityAnalyzer()<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from textblob import TextBlob<\/pre>\n<p>O conjunto de dados de treinamento tem observa\u00e7\u00f5es demais para se visualizar confortavelmente. Ent\u00e3o, vamos pegar uma amostra aleat\u00f3ria de 1.000 avalia\u00e7\u00f5es para representar o sentimento geral de todos os avaliadores.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from random import sample\nsample_reviews = sample(amazon[\"train\"][\"content\"], 1000)<\/pre>\n<p>Agora, vamos obter as pontua\u00e7\u00f5es do VADER e do TextBlob para cada uma dessas avalia\u00e7\u00f5es. Vamos fazer um loop no texto de cada avalia\u00e7\u00e3o, pass\u00e1-lo pelos analisadores de sentimentos e depois anexar as pontua\u00e7\u00f5es a uma lista dedicada.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">vader_neg = []\nvader_neu = []\nvader_pos = []\nvader_compound = []\ntextblob_polarity = []\ntextblob_subjectivity = []\n\nfor review in sample_reviews:\n   vader_sent = analyzer.polarity_scores(review)\n   vader_neg += [vader_sent[\"neg\"]]\n   vader_neu += [vader_sent[\"neu\"]]\n   vader_pos += [vader_sent[\"pos\"]]\n   vader_compound += [vader_sent[\"compound\"]]\n  \n   textblob_sent = TextBlob(review).sentiment\n   textblob_polarity += [textblob_sent.polarity]\n   textblob_subjectivity += [textblob_sent.subjectivity]<\/pre>\n<p>Depois, vamos colocar cada uma dessas listas em uma coluna separada em uma dataframe do <a href=\"https:\/\/pandas.pydata.org\/\" target=\"_blank\" rel=\"noopener\">pandas<\/a>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import pandas as pd\n\nsent_scores = pd.DataFrame({\n   \"vader_neg\": vader_neg,\n   \"vader_neu\": vader_neu,\n   \"vader_pos\": vader_pos,\n   \"vader_compound\": vader_compound,\n   \"textblob_polarity\": textblob_polarity,\n   \"textblob_subjectivity\": textblob_subjectivity\n})<\/pre>\n<p>Agora estamos prontos para come\u00e7armos a explorar nossos resultados.<\/p>\n<p>Tipicamente, este seria o momento de come\u00e7armos a criar algum c\u00f3digo para a an\u00e1lise explorat\u00f3ria dos dados. Isso poderia ser feito usando o m\u00e9todo <code>describe<\/code> do pandas para obter estat\u00edsticas de resumo das nossas colunas e criando c\u00f3digo do <a href=\"https:\/\/matplotlib.org\/\" target=\"_blank\" rel=\"noopener\">Matplotlib<\/a> ou do <a href=\"https:\/\/seaborn.pydata.org\/\" target=\"_blank\" rel=\"noopener\">seaborn<\/a> para visualizarmos nossos resultados. Por\u00e9m, o PyCharm tem alguns recursos para acelerar todo esse processo.<\/p>\n<p>Vamos prosseguir e imprimir nossa dataframe.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sent_scores<\/pre>\n<p>No canto superior direito, podemos ver um bot\u00e3o <em>Show Column Statistics<\/em>. Clicando nele, veem-se duas op\u00e7\u00f5es diferentes: <em>Compact<\/em> e <em>Detailed<\/em>. Vamos selecionar <em>Detailed<\/em>.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-532356\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/11\/Screenshot-2024-11-29-at-17.10.32.png\" alt=\"\" width=\"898\" height=\"420\" \/><\/figure>\n<p>Agora temos estat\u00edsticas de resumo, fornecidas como parte dos cabe\u00e7alhos das nossas colunas! Olhando essas estat\u00edsticas, podemos ver que a pontua\u00e7\u00e3o composta do VADER tem uma m\u00e9dia de 0,4 (mediana = 0,6), enquanto a pontua\u00e7\u00e3o de polaridade do TextBlob d\u00e1 uma m\u00e9dia de 0,2 (mediana = 0,2).<\/p>\n<p>Este resultado indica que, em m\u00e9dia, o VADER tende a considerar o mesmo conjunto de avalia\u00e7\u00f5es mais positivo que no TextBlob. Tamb\u00e9m mostra que em ambos os analisadores de sentimentos, \u00e9 prov\u00e1vel que haja mais avalia\u00e7\u00f5es positivas que negativas. Podemos analisar isso em mais detalhes olhando algumas visualiza\u00e7\u00f5es.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-532367\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/11\/Screenshot-2024-11-29-at-17.33.49.png\" alt=\"\" width=\"2816\" height=\"1534\" \/><\/figure>\n<p>Outro recurso do PyCharm que podemos usar \u00e9 a dataframe <em>Chart View<\/em>. O bot\u00e3o desta fun\u00e7\u00e3o est\u00e1 no canto superior direito.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-532378\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/11\/Screenshot-2024-11-29-at-17.55.46.png\" alt=\"\" width=\"764\" height=\"454\" \/><\/figure>\n<\/div>\n<p>Ao clicarmos nesse bot\u00e3o, mudamos para o editor de gr\u00e1ficos. Nele podemos criar visualiza\u00e7\u00f5es sem c\u00f3digo, diretamente a partir da nossa dataframe.<\/p>\n<p>Vamos come\u00e7ar com a pontua\u00e7\u00e3o composta do VADER. Para come\u00e7ar a criar este gr\u00e1fico, v\u00e1 at\u00e9 <em>Show Series Settings<\/em>, no canto superior direito.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-532389\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/11\/Screenshot-2024-11-29-at-17.57.11.png\" alt=\"\" width=\"634\" height=\"368\" \/><\/figure>\n<\/div>\n<p>Remova os valores-padr\u00e3o de <em>X Axis<\/em> e <em>Y Axis<\/em>. Substitua os valores de <em>X Axis<\/em> e de <em>Y Axis<\/em> por <code>vader_compound<\/code>. Clique na seta junto ao nome da vari\u00e1vel no campo <em>Y Axis<\/em> e selecione <code>count<\/code>.<\/p>\n<p>Por fim, selecione <em>Histogram<\/em> nos \u00edcones de gr\u00e1ficos, logo abaixo de <em>Series Settings<\/em>. \u00c9 prov\u00e1vel que a pontua\u00e7\u00e3o composta do VADER tenha uma distribui\u00e7\u00e3o bimodal, com um ligeiro pico por volta de \u22120,8 e um bem maior por volta de 0,9. \u00c9 prov\u00e1vel que estes picos representem a divis\u00e3o das avalia\u00e7\u00f5es entre positivas e negativas. Tamb\u00e9m h\u00e1 muito mais avalia\u00e7\u00f5es positivas que negativas.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-532401\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/12\/Screenshot-2024-12-02-at-09.26.23.png\" alt=\"\" width=\"2856\" height=\"1534\" \/><\/figure>\n<p>Vamos repetir o mesmo exerc\u00edcio e criar um histograma para vermos a distribui\u00e7\u00e3o das pontua\u00e7\u00f5es de polaridade do TextBlob.<\/p>\n<p>Ao contr\u00e1rio do VADER, o TextBlob tende a considerar a maioria das avalia\u00e7\u00f5es como neutras, com muito poucas fortemente positivas ou negativas. Para compreendermos por que h\u00e1 essa discrep\u00e2ncia entre as pontua\u00e7\u00f5es desses dois analisadores de sentimentos, vamos dar uma olhada em uma avalia\u00e7\u00e3o que o VADER considerou fortemente positiva e em outra que ele considerou fortemente negativa, mas o TextBlob considerou ambas neutras.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-532412\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/12\/Screenshot-2024-12-02-at-09.32.45.png\" alt=\"\" width=\"2850\" height=\"1528\" \/><\/figure>\n<p>Vamos obter o \u00edndice da primeira avalia\u00e7\u00e3o que o VADER considerou positiva, mas o TextBlob considerou neutra:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sent_scores[(sent_scores[\"vader_compound\"] &gt;= 0.8) &amp; (sent_scores[\"textblob_polarity\"].between(-0.1, 0.1))].index[0]<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">42<\/pre>\n<p>Depois, vamos obter o \u00edndice da primeira avalia\u00e7\u00e3o que o VADER considerou negativa, mas o TextBlob considerou neutra:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sent_scores[(sent_scores[\"vader_compound\"] &lt;= -0.8) &amp; (sent_scores[\"textblob_polarity\"].between(-0.1, 0.1))].index[0]<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">0<\/pre>\n<p>Primeiro, vamos obter a avalia\u00e7\u00e3o positiva:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sample_reviews[42]<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\"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.\"<\/pre>\n<p>Esta avalia\u00e7\u00e3o parece ambivalente, mas no geral, \u00e9 algo positiva.<\/p>\n<p>Agora, vamos ver a avalia\u00e7\u00e3o negativa:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sample_reviews[0]<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">'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.'<\/pre>\n<p>Esta avalia\u00e7\u00e3o \u00e9 inequivocamente negativa. Comparando os dois analisadores, o VADER parece ser mais preciso, mas tende a dar prioridade demais \u00e0s palavras positivas de um texto.<\/p>\n<p>A \u00faltima coisa que podemos considerar \u00e9 o quanto cada avalia\u00e7\u00e3o \u00e9 subjetiva ou objetiva. Faremos isso criando um histograma da pontua\u00e7\u00e3o de subjetividade do TextBlob.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-532423\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/12\/Screenshot-2024-12-02-at-09.36.19.png\" alt=\"\" width=\"2848\" height=\"1524\" \/><\/figure>\n<p>\u00c9 interessante observar que h\u00e1 uma boa distribui\u00e7\u00e3o de subjetividade nas avalia\u00e7\u00f5es, com a maioria delas misturando reda\u00e7\u00e3o subjetiva e objetiva. Um n\u00famero pequeno de avalia\u00e7\u00f5es tamb\u00e9m \u00e9 muito subjetivo (pr\u00f3ximo a 1) ou muito objetivo (pr\u00f3ximo a 0).<\/p>\n<p>As pontua\u00e7\u00f5es entre esses valores proporcionam uma boa maneira de fazer um corte dos dados. Se voc\u00ea precisar saber de que coisas objetivas as pessoas gostaram ou n\u00e3o nos produtos, poder\u00e1 olhar as avalia\u00e7\u00f5es com uma pontua\u00e7\u00e3o baixa de subjetividade e pontua\u00e7\u00f5es compostas do VADER pr\u00f3ximas de 1 e \u22121, respectivamente.<\/p>\n<p>Mas se voc\u00ea quiser saber qual foi a rea\u00e7\u00e3o emocional das pessoas aos produtos, poder\u00e1 pegar as avalia\u00e7\u00f5es com uma alta pontua\u00e7\u00e3o de subjetividade e pontua\u00e7\u00f5es compostas altas e baixas no VADER.<\/p>\n<h2 class=\"wp-block-heading\">Pontos a considerar<\/h2>\n<p>Como acontece com qualquer problema de processamento de linguagem natural, h\u00e1 uma s\u00e9rie de coisas que devemos observar ao fazer an\u00e1lise de sentimentos.<\/p>\n<p>Uma das coisas mais importantes a considerar \u00e9 o idioma dos textos que voc\u00ea est\u00e1 tentando analisar. Muitos dos m\u00e9todos baseados em l\u00e9xico s\u00f3 funcionam para um n\u00famero limitado de idiomas. Assim, se voc\u00ea estiver trabalhando com idiomas sem suporte nesses l\u00e9xicos, talvez precise adotar outra abordagem, como usar um LLM com ajuste fino ou treinar os seus pr\u00f3prios modelos.<\/p>\n<p>\u00c0 medida que aumenta a complexidade dos textos, detectar sentimentos corretamente tamb\u00e9m pode ficar dif\u00edcil para modelos baseados em l\u00e9xicos e em sacos de palavras. Detectar sarcasmo ou indicadores mais sutis de contexto pode ser dif\u00edcil para modelos mais simples, e esses modelos podem n\u00e3o conseguir classificar precisamente o sentimento desses textos. Talvez LLMs consigam lidar com textos mais complexos, mas voc\u00ea precisar\u00e1 experimentar diversos modelos.<\/p>\n<p>Por fim, ao efetuar uma an\u00e1lise de sentimentos, aparecem os mesmos problemas que com qualquer outra aplica\u00e7\u00e3o de aprendizado de m\u00e1quina. A qualidade dos seus modelos depender\u00e1 da qualidade dos dados de treinamento usados. Se n\u00e3o for poss\u00edvel obter conjuntos de dados de alta qualidade e adequados ao escopo do seu problema para fazer o treinamento e os testes, voc\u00ea n\u00e3o conseguir\u00e1 prever corretamente o sentimento do seu p\u00fablico-alvo.<\/p>\n<p>Voc\u00ea tamb\u00e9m precisa garantir que os seus alvos sejam apropriados para o seu problema de neg\u00f3cios. Pode parecer atraente criar um modelo para saber se os seus produtos deixam os seus clientes &#8220;tristes&#8221;, &#8220;com raiva&#8221; ou &#8220;enojados&#8221;, mas se isso n\u00e3o ajudar voc\u00ea a tomar uma decis\u00e3o sobre como melhorar os seus produtos, ent\u00e3o n\u00e3o est\u00e1 resolvendo o seu problema.<\/p>\n<h2 class=\"wp-block-heading\">Concluindo<\/h2>\n<p>Nesta postagem, mergulhamos a fundo na \u00e1rea fascinante da an\u00e1lise de sentimentos em Python e mostramos como essa \u00e1rea complexa fica mais acess\u00edvel com alguns pacotes poderosos.<\/p>\n<p>Cobrimos as aplica\u00e7\u00f5es em potencial da an\u00e1lise de sentimentos, as diferentes maneiras de avaliar os sentimentos e os principais m\u00e9todos para extrair os sentimentos de um texto. Tamb\u00e9m vimos alguns recursos \u00fateis do PyCharm que tornam mais simples e r\u00e1pido trabalhar com modelos e interpretar seus resultados.<\/p>\n<p>Embora no momento a \u00e1rea de processamento de linguagem natural esteja fortemente concentrada em modelos grandes de linguagem, as t\u00e9cnicas mais antigas, que usam analisadores baseados em l\u00e9xicos ou modelos tradicionais de aprendizado de m\u00e1quina, como classificadores bayesianos ing\u00eanuos, ainda t\u00eam seu lugar na an\u00e1lise de sentimentos. Essas t\u00e9cnicas brilham na an\u00e1lise de textos mais simples ou quando a prioridade est\u00e1 na rapidez, nas previs\u00f5es ou na facilidade de implanta\u00e7\u00e3o. Os LLMs s\u00e3o mais adequados a textos mais complexos ou cheios de nuances.<\/p>\n<p>Agora que voc\u00ea j\u00e1 aprendeu os conceitos b\u00e1sicos, pode aprender como fazer <a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2024\/12\/how-to-do-sentiment-analysis-with-large-language-models\/\" data-type=\"link\" data-id=\"https:\/\/blog.jetbrains.com\/pycharm\/2024\/12\/how-to-do-sentiment-analysis-with-large-language-models\/\">an\u00e1lise de sentimentos com LLMs<\/a> atrav\u00e9s do nosso tutorial. Esse guia passo a passo ajuda voc\u00ea a descobrir como selecionar o modelo certo para a sua tarefa, us\u00e1-lo na an\u00e1lise de sentimentos e at\u00e9 fazer voc\u00ea mesmo o ajuste fino dele.<\/p>\n<p>Se voc\u00ea quiser continuar a aprender de forma mais ampla sobre processamento de linguagem natural ou aprendizado de m\u00e1quina ap\u00f3s terminar de ler esta postagem, aqui est\u00e3o alguns recursos:<\/p>\n<ul>\n<li><a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2024\/12\/how-to-do-sentiment-analysis-with-large-language-models\/\" data-type=\"link\" data-id=\"https:\/\/blog.jetbrains.com\/pycharm\/2024\/12\/how-to-do-sentiment-analysis-with-large-language-models\/\">Aprenda como fazer an\u00e1lise de sentimentos com modelos grandes de linguagem<\/a><\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2022\/06\/start-studying-machine-learning-with-pycharm\/\">Comece a estudar aprendizado de m\u00e1quina com o PyCharm<\/a><\/li>\n<li><a href=\"https:\/\/lp.jetbrains.com\/research\/ml_methods\/\" target=\"_blank\" rel=\"noopener\" data-type=\"link\" data-id=\"https:\/\/lp.jetbrains.com\/research\/ml_methods\/\">Explore m\u00e9todos de aprendizado de m\u00e1quina em engenharia de software<\/a><\/li>\n<\/ul>\n<h2 class=\"wp-block-heading\">Comece a usar a an\u00e1lise de sentimentos no PyCharm hoje mesmo<\/h2>\n<p>Se voc\u00ea j\u00e1 estiver pronto para iniciar o seu pr\u00f3prio projeto de an\u00e1lise de sentimentos, pode ativar a sua assinatura gratuita de tr\u00eas meses do PyCharm. Clique no link abaixo e digite este c\u00f3digo promocional: <strong>PCSA24<\/strong>. Voc\u00ea ent\u00e3o receber\u00e1 um c\u00f3digo de ativa\u00e7\u00e3o por e-mail.<\/p>\n<div class=\"buttons\">\n<div class=\"buttons__row\"><a class=\"btn\" href=\"https:\/\/www.jetbrains.com\/store\/redeem\/\" target=\"\" rel=\"noopener\">Ative a sua assinatura de 3 meses<\/a><\/div>\n<\/div>\n\n\n<p><em>Artigo original em ingl\u00eas por:<\/em><br><\/p>\n\n\n    <div class=\"about-author \">\n        <div class=\"about-author__box\">\n            <div class=\"row\">\n                <div class=\"about-author__box-img\">\n                    <img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/11\/BK7A9876_korr_sRGB_8_1000x1500px_square_resized-200x200.jpg\" width=\"200\" height=\"200\" alt=\"Jodie Burchell\" loading=\"lazy\"  class=\"avatar avatar-200 wp-user-avatar wp-user-avatar-200 photo avatar-default\">\n                <\/div>\n                <div class=\"about-author__box-text\">\n                                            <h4>Jodie Burchell<\/h4>\n                                        <p>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&#8217;s blogs.<\/p>\n                <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n","protected":false},"author":1086,"featured_media":571581,"comment_status":"closed","ping_status":"closed","template":"","categories":[952],"tags":[8557,3252,5377,8652],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/pycharm\/571577"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/pycharm"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/types\/pycharm"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/users\/1086"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/comments?post=571577"}],"version-history":[{"count":4,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/pycharm\/571577\/revisions"}],"predecessor-version":[{"id":571594,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/pycharm\/571577\/revisions\/571594"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/media\/571581"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/media?parent=571577"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/categories?post=571577"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/tags?post=571577"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/cross-post-tag?post=571577"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}