{"id":571579,"date":"2025-05-27T22:52:17","date_gmt":"2025-05-27T21:52:17","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=pycharm&#038;p=571579"},"modified":"2025-05-29T22:53:06","modified_gmt":"2025-05-29T21:53:06","slug":"introduccion-al-analisis-de-sentimientos-en-python","status":"publish","type":"pycharm","link":"https:\/\/blog.jetbrains.com\/es\/pycharm\/2025\/05\/introduccion-al-analisis-de-sentimientos-en-python\/","title":{"rendered":"Introducci\u00f3n al an\u00e1lisis de sentimientos en Python"},"content":{"rendered":"<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-571595 size-full\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/05\/PC-social-BlogFeatured-1280x720-2x-18.png\" alt=\"\" width=\"2559\" height=\"1439\" \/><\/figure>\n<p>El an\u00e1lisis de sentimientos es una de las formas m\u00e1s populares de analizar texto. Nos permite ver de un vistazo c\u00f3mo se sienten las personas en una amplia gama de \u00e1mbitos y tiene aplicaciones \u00fatiles en campos como la atenci\u00f3n al cliente, la investigaci\u00f3n de mercados y productos, y el an\u00e1lisis de la competencia.<\/p>\n<p>Como cualquier \u00e1rea del procesamiento del lenguaje natural (PLN), el an\u00e1lisis de sentimientos puede resultar complejo. Por suerte, <a href=\"https:\/\/www.jetbrains.com\/guide\/python\/\" target=\"_blank\" rel=\"noopener\">Python<\/a> cuenta con excelentes paquetes y herramientas que hacen que esta rama del PNL sea mucho m\u00e1s accesible.<\/p>\n<p>En este art\u00edculo del blog, exploraremos algunos de los paquetes m\u00e1s populares para analizar sentimientos en Python, c\u00f3mo funcionan y c\u00f3mo puede entrenar su propio modelo de an\u00e1lisis de sentimientos utilizando las t\u00e9cnicas m\u00e1s avanzadas. Tambi\u00e9n veremos algunas funcionalidades de <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 facilitan y agilizan el trabajo con estos paquetes.<\/p>\n<h2 class=\"wp-block-heading\">\u00bfQu\u00e9 es el an\u00e1lisis de sentimientos?<\/h2>\n<p>El an\u00e1lisis de sentimientos es el proceso de analizar un texto para determinar su tono emocional. Como probablemente deduzca de esta definici\u00f3n, el an\u00e1lisis de sentimientos es un campo muy amplio que incorpora una gran variedad de m\u00e9todos dentro del \u00e1mbito del procesamiento del lenguaje natural.<\/p>\n<p>Hay muchas formas de definir el \u00abtono emocional\u00bb. Los m\u00e9todos m\u00e1s utilizados determinan la <em>valencia<\/em> o la <em>polaridad<\/em> de un texto, es decir, lo positivo o negativo que es el sentimiento que expresa. El tono emocional tambi\u00e9n suele tratarse como un problema de clasificaci\u00f3n de textos, en el que estos se clasifican como positivos o negativos.<\/p>\n<p>Tome como ejemplo la siguiente <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\">rese\u00f1a de producto de 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, no se trata de un cliente satisfecho, y las t\u00e9cnicas de an\u00e1lisis de sentimientos clasificar\u00edan esta rese\u00f1a como negativa.<\/p>\n<p>Contrast\u00e9mosla con la de un comprador mucho m\u00e1s satisfecho:<\/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>Las t\u00e9cnicas de an\u00e1lisis de sentimientos clasificar\u00edan esta como positiva.<\/p>\n<h3 class=\"wp-block-heading\">Diferentes tipos de an\u00e1lisis de sentimientos<\/h3>\n<p>Existen varias formas de extraer informaci\u00f3n emocional de un texto. Repasemos algunas de las m\u00e1s importantes.<\/p>\n<h4 class=\"wp-block-heading\">Formas de definir el sentimiento<\/h4>\n<p>En primer lugar, los enfoques de an\u00e1lisis de sentimientos tienen varias formas diferentes de definir el sentimiento o la emoci\u00f3n.<\/p>\n<p><strong>Binario<\/strong>: en este caso, la valencia de un documento se divide en dos categor\u00edas, <em>positivo<\/em> o <em>negativo<\/em>, como ocurre con el <a href=\"https:\/\/huggingface.co\/datasets\/stanfordnlp\/sst2\" target=\"_blank\" rel=\"noopener\">conjunto de datos SST-2<\/a>. En relaci\u00f3n con esto est\u00e1n las clasificaciones de valencia que a\u00f1aden una clase <em>neutra<\/em> (en la que un texto no expresa ning\u00fan sentimiento sobre un tema) o incluso una clase <em>conflictiva<\/em> (en la que un texto expresa un sentimiento por un lado positivo y por otro negativo sobre un tema).<\/p>\n<p>Algunos analizadores de sentimientos utilizan una medida relacionada para clasificar los textos en <em>subjetivos<\/em> u <em>objetivos<\/em>.<\/p>\n<p><strong>Granular<\/strong>: este t\u00e9rmino describe varias formas diferentes de enfocar el an\u00e1lisis de sentimientos, pero aqu\u00ed se refiere a desglosar la valencia positiva y negativa en una escala Likert. Un ejemplo conocido de esto es el <a href=\"https:\/\/huggingface.co\/datasets\/SetFit\/sst5\" target=\"_blank\" rel=\"noopener\">conjunto de datos SST-5<\/a>, que utiliza una escala Likert de cinco puntos con las clases <em>muy positiva<\/em>, <em>positiva<\/em>, <em>neutra<\/em>, <em>negativa<\/em> y <em>muy negativa<\/em>.<\/p>\n<p><strong>Continua<\/strong>: la valencia de un texto tambi\u00e9n puede medirse de forma continua, con puntuaciones que indiquen lo positivo o negativo que era el sentimiento del autor. Por ejemplo, el <a href=\"https:\/\/github.com\/cjhutto\/vaderSentiment\" target=\"_blank\" rel=\"noopener\">analizador de sentimientos VADER<\/a> otorga a un fragmento de texto una puntuaci\u00f3n entre -1 (<em>fuertemente negativo<\/em>) y 1 (<em>fuertemente positivo<\/em>), y las puntuaciones cercanas a 0 indican un sentimiento neutro.<\/p>\n<p><strong>Basada en la emoci\u00f3n<\/strong>: este enfoque, tambi\u00e9n se conoce como detecci\u00f3n de emociones o identificaci\u00f3n de emociones, intenta detectar la emoci\u00f3n espec\u00edfica que se expresa en un texto. Esto se puede abordar de dos maneras. La detecci\u00f3n categ\u00f3rica de emociones trata de clasificar el sentimiento expresado por un texto en una emoci\u00f3n concreta de entre un n\u00famero determinado, normalmente bas\u00e1ndose en el <a href=\"https:\/\/www.tandfonline.com\/doi\/abs\/10.1080\/02699939208411068\" target=\"_blank\" rel=\"noopener\">modelo de Ekman<\/a>, que incluye las siguientes: <em>enfado<\/em>, <em>asco<\/em>, <em>miedo<\/em>, <em>alegr\u00eda<\/em>, <em>tristeza<\/em> y <em>sorpresa<\/em>. Existe un <a href=\"https:\/\/huggingface.co\/j-hartmann\/emotion-english-distilroberta-base#appendix-%F0%9F%93%9A\" target=\"_blank\" rel=\"noopener\">n\u00famero de conjuntos de datos<\/a> para este tipo de detecci\u00f3n de emociones. La detecci\u00f3n emocional dimensional se utiliza menos en el an\u00e1lisis de sentimientos y, en su lugar, trata de medir <a href=\"https:\/\/link.springer.com\/article\/10.1007\/s12144-014-9219-4\" target=\"_blank\" rel=\"noopener\">tres aspectos emocionales<\/a> de un texto: <em>polaridad<\/em>, <em>excitaci\u00f3n<\/em> (lo intensa que es la emoci\u00f3n) y <em>dominancia<\/em> (el grado de control de la expresi\u00f3n emocional).<\/p>\n<h4 class=\"wp-block-heading\">Niveles de an\u00e1lisis<\/h4>\n<p>Tambi\u00e9n podemos considerar los diferentes niveles en los que podemos analizar un texto. Para entenderlo mejor, veamos otra rese\u00f1a de la cafetera:<\/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>A nivel de documento<\/strong>: este es el nivel m\u00e1s b\u00e1sico de an\u00e1lisis, en el que se obtendr\u00e1 un sentimiento para todo un texto. El an\u00e1lisis a nivel de documento puede estar bien para fragmentos de texto muy cortos, como los tuits, pero puede dar respuestas enga\u00f1osas si hay sentimientos mixtos. Por ejemplo, si bas\u00e1ramos el an\u00e1lisis de sentimientos de esta rese\u00f1a en todo el documento, probablemente se clasificar\u00eda como neutro o conflictivo, ya que tenemos dos sentimientos opuestos sobre la misma cafetera.<\/p>\n<p><strong>A nivel de frase<\/strong>: aqu\u00ed se predice el sentimiento de cada frase por separado. En el caso de la rese\u00f1a de la cafetera, el an\u00e1lisis a nivel de frase nos dir\u00eda que el autor opin\u00f3 positivamente sobre algunas partes del producto, pero negativamente sobre otras. Sin embargo, este an\u00e1lisis no nos dice qu\u00e9 cosas le gustaron la cafetera y cu\u00e1les no.<\/p>\n<p><strong>Basado en aspectos<\/strong>: este tipo de an\u00e1lisis de sentimientos profundiza en un texto e intenta comprender el sentimiento de los usuarios sobre aspectos concretos. En nuestra rese\u00f1a de la cafetera, el autor mencion\u00f3 dos aspectos: la <em>apariencia<\/em> y el <em>ruido<\/em>. Al extraer estos aspectos, tenemos m\u00e1s informaci\u00f3n sobre lo que le gust\u00f3 y lo que no le gust\u00f3 espec\u00edficamente al usuario. Ten\u00eda una opini\u00f3n positiva sobre el aspecto de la m\u00e1quina, pero negativa sobre el ruido que hac\u00eda.<\/p>\n<h4 class=\"wp-block-heading\">Combinaci\u00f3n del an\u00e1lisis de sentimientos con otras t\u00e9cnicas de PNL<\/h4>\n<p><strong>Basado en la intenci\u00f3n<\/strong>: en este \u00faltimo tipo de an\u00e1lisis de sentimientos, el texto se clasifica de dos maneras: en funci\u00f3n del sentimiento que se expresa y del tema del texto. Por ejemplo, si una empresa de telecomunicaciones recibe una reclamaci\u00f3n quej\u00e1ndose de la frecuencia con la que se cae su servicio, podr\u00eda clasificar la intenci\u00f3n del texto o el tema como <em>fiabilidad del servicio<\/em> y el sentimiento como <em>negativo<\/em>. Al igual que el an\u00e1lisis de sentimientos basado en aspectos, este an\u00e1lisis proporciona a la empresa mucha m\u00e1s informaci\u00f3n que saber si sus clientes est\u00e1n en general contentos o descontentos.<\/p>\n<h3 class=\"wp-block-heading\">Aplicaciones del an\u00e1lisis de sentimientos<\/h3>\n<p>A estas alturas, probablemente ya se le ocurran algunos casos de uso potencial para el an\u00e1lisis de sentimientos. B\u00e1sicamente, puede utilizarse en cualquier lugar en el que pueda obtener comentarios escritos u opiniones sobre un tema. Las organizaciones o los particulares pueden utilizar el an\u00e1lisis de sentimientos para hacer un seguimiento de las redes sociales y ver qu\u00e9 opina la gente sobre una marca, una entidad gubernamental o un tema.<\/p>\n<p>El an\u00e1lisis de los comentarios de los clientes puede utilizarse para conocer los sentimientos expresados en los comentarios o tickets. Las rese\u00f1as de productos pueden analizarse para ver el grado de satisfacci\u00f3n o insatisfacci\u00f3n de la gente con los productos de una empresa. Por \u00faltimo, el an\u00e1lisis de sentimientos puede ser un componente clave en la investigaci\u00f3n de mercado y el an\u00e1lisis de la competencia, donde la opini\u00f3n de los usuarios sobre las tendencias emergentes, las caracter\u00edsticas y los competidores puede ayudar a orientar las estrategias de una empresa.<\/p>\n<h2 class=\"wp-block-heading\">\u00bfC\u00f3mo funciona el an\u00e1lisis de sentimientos?<\/h2>\n<p>A nivel general, el an\u00e1lisis de sentimientos funciona vinculando palabras (o, en modelos m\u00e1s sofisticados, el tono general de un texto) a una emoci\u00f3n. Los enfoques m\u00e1s comunes del an\u00e1lisis de sentimientos se encuadran en uno de los tres m\u00e9todos siguientes.<\/p>\n<h3 class=\"wp-block-heading\">Enfoques basados en el l\u00e9xico<\/h3>\n<p>Estos m\u00e9todos se basan en un l\u00e9xico que incluye puntuaciones de sentimientos para una serie de palabras. Combinan estas puntuaciones utilizando un conjunto de reglas para obtener el sentimiento global de un fragmento de texto. Estos m\u00e9todos suelen ser muy r\u00e1pidos y tambi\u00e9n tienen la ventaja de proporcionar puntuaciones de sentimientos m\u00e1s granulares. Sin embargo, como los l\u00e9xicos deben elaborarse artesanalmente, su producci\u00f3n puede llevar mucho tiempo y ser costosa.<\/p>\n<h3 class=\"wp-block-heading\">Modelos de aprendizaje autom\u00e1tico<\/h3>\n<p>Estos m\u00e9todos entrenan un modelo de aprendizaje autom\u00e1tico, normalmente un clasificador Naive Bayes, en un conjunto de datos que contiene texto y sus etiquetas de sentimiento, como las cr\u00edticas de pel\u00edculas. En este modelo, los textos se clasifican generalmente en positivos, negativos y, a veces, neutros. Estos modelos tambi\u00e9n suelen ser muy r\u00e1pidos, pero como no suelen tener en cuenta la relaci\u00f3n entre las palabras de la entrada, pueden tener problemas con textos m\u00e1s complejos que incluyan calificadores y negaciones.<\/p>\n<h3 class=\"wp-block-heading\">Modelos de lenguaje de gran tama\u00f1o<\/h3>\n<p>Estos m\u00e9todos consisten en refinar un modelo de lenguaje de gran tama\u00f1o preentrenado basado en transformadores sobre los mismos conjuntos de datos utilizados para entrenar los clasificadores de aprendizaje autom\u00e1tico mencionados anteriormente. Estos sofisticados modelos son capaces de modelar relaciones complejas entre las palabras de un texto, pero suelen ser m\u00e1s lentos que los otros dos m\u00e9todos.<\/p>\n<h2 class=\"wp-block-heading\">An\u00e1lisis de sentimientos en Python<\/h2>\n<p><a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/python.html\" target=\"_blank\" rel=\"noopener\">Python<\/a> cuenta con un rico ecosistema de paquetes para <a href=\"https:\/\/blog.jetbrains.com\/pycharm\/tag\/nlp\/\">PNL<\/a>, lo que significa que tiene mucho donde elegir a la hora de realizar an\u00e1lisis de sentimientos en este lenguaje.<\/p>\n<p>Repasemos algunos de los <a href=\"https:\/\/www.jetbrains.com\/guide\/python\/tutorials\/getting-started-pycharm\/installing-and-managing-python-packages\/\" target=\"_blank\" rel=\"noopener\">paquetes Python<\/a> m\u00e1s populares para el an\u00e1lisis de sentimientos.<\/p>\n<h3 class=\"wp-block-heading\">Las mejores bibliotecas Python para el an\u00e1lisis de sentimientos<\/h3>\n<h4 class=\"wp-block-heading\">VADER<\/h4>\n<p><a href=\"https:\/\/www.nltk.org\/api\/nltk.sentiment.vader.html\" target=\"_blank\" rel=\"noopener\">VADER (Valence Aware Dictionary and Sentiment Reasoner)<\/a> es un popular analizador de sentimientos basado en l\u00e9xico. Integrado en el potente <a href=\"https:\/\/www.nltk.org\/index.html\" target=\"_blank\" rel=\"noopener\">paquete NLTK<\/a>, este analizador presenta cuatro puntuaciones de sentimiento: el grado en que el texto era <em>positivo<\/em>, <em>neutro<\/em> o <em>negativo<\/em>, as\u00ed como una puntuaci\u00f3n de sentimiento <em>compuesta<\/em>. Las puntuaciones positivas, neutras y negativas van de 0 a 1 e indican la proporci\u00f3n del texto que era positiva, neutra o negativa. La puntuaci\u00f3n compuesta oscila entre -1 (extremadamente negativo) y 1 (extremadamente positivo) e indica la valencia general del sentimiento del texto.<\/p>\n<p>Veamos un ejemplo b\u00e1sico de c\u00f3mo 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>Primero tenemos que descargar el l\u00e9xico 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>A continuaci\u00f3n, podemos instanciar el VADER <code>SentimentIntensityAnalyzer()<\/code> y extraer las puntuaciones de sentimiento mediante el 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 VADER ha otorgado a este fragmento de texto una puntuaci\u00f3n global de sentimiento de 0,67, y ha clasificado su contenido como un 43\u00a0% positivo, un 57\u00a0% neutro y un 0\u00a0% negativo.<\/p>\n<p>VADER funciona buscando las puntuaciones de sentimiento de cada palabra de su l\u00e9xico y combin\u00e1ndolas mediante un conjunto de reglas matizadas. Por ejemplo, los calificativos pueden aumentar o disminuir la intensidad del sentimiento de una palabra, de modo que un calificativo como \u00abun poco\u00bb antes de una palabra disminuir\u00eda la intensidad del sentimiento, pero \u00abextremadamente\u00bb la amplificar\u00eda.<\/p>\n<p>El l\u00e9xico de VADER incluye abreviaturas como \u00absmh\u00bb (shaking my head) y emojis, lo que lo hace especialmente adecuado para los textos de redes sociales. La principal limitaci\u00f3n de VADER es que no funciona para idiomas distintos del ingl\u00e9s, pero puede utilizar proyectos como <a href=\"https:\/\/github.com\/brunneis\/vader-multi\" target=\"_blank\" rel=\"noopener\"><code>vader-multi<\/code><\/a> como alternativa. Escrib\u00ed 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\">c\u00f3mo funciona VADER<\/a> si le interesa profundizar en este paquete.<\/p>\n<h4 class=\"wp-block-heading\">NLTK<\/h4>\n<p>Adem\u00e1s, puede utilizar NLTK para entrenar su propio clasificador de sentimientos basado en el aprendizaje autom\u00e1tico, utilizando clasificadores de <code>scikit-learn<\/code>.<\/p>\n<p>Hay muchas formas de procesar el texto para alimentar estos modelos, pero la m\u00e1s sencilla es hacerlo bas\u00e1ndose en las palabras presentes en el texto, un tipo de modelado de texto denominado enfoque de \u00abbolsa de palabras\u00bb. El tipo m\u00e1s directo de modelado de bolsa de palabras es la <em>vectorizaci\u00f3n binaria<\/em>, en la que cada palabra se trata como una caracter\u00edstica, siendo el valor de esa caracter\u00edstica 0 o 1 (si la palabra est\u00e1 ausente o presente en el texto, respectivamente).<\/p>\n<p>Si no ha trabajado antes con datos de texto y PNL, y desea obtener m\u00e1s informaci\u00f3n sobre c\u00f3mo se puede convertir el texto en entradas para los modelos de aprendizaje autom\u00e1tico, impart\u00ed una <a href=\"https:\/\/www.youtube.com\/live\/WYmyZBg2VFI?feature=shared&amp;t=261\" target=\"_blank\" rel=\"noopener\">charla sobre este tema<\/a> que ofrece una ligera introducci\u00f3n.<\/p>\n<p>Puede ver un ejemplo en la <a href=\"https:\/\/www.nltk.org\/howto\/sentiment.html#sentiment-analysis\" target=\"_blank\" rel=\"noopener\">documentaci\u00f3n de NLTK<\/a>, donde se entrena un clasificador Naive Bayes para predecir si un fragmento de texto es subjetivo u objetivo. En este ejemplo, a\u00f1aden un calificador adicional de negaci\u00f3n a algunos de los t\u00e9rminos bas\u00e1ndose en reglas que indican si es probable que esa palabra o car\u00e1cter est\u00e9 implicado en la negaci\u00f3n de un sentimiento expresado en otra parte del texto. Real Python tambi\u00e9n tiene un <a href=\"https:\/\/realpython.com\/python-nltk-sentiment-analysis\/#customizing-nltks-sentiment-analysis\" target=\"_blank\" rel=\"noopener\">tutorial de an\u00e1lisis de sentimientos<\/a> sobre c\u00f3mo entrenar sus propios clasificadores utilizando NLTK, si desea aprender m\u00e1s sobre este tema.<\/p>\n<h4 class=\"wp-block-heading\">Pattern y TextBlob<\/h4>\n<p>El paquete <a href=\"https:\/\/github.com\/clips\/pattern\" target=\"_blank\" rel=\"noopener\">Pattern<\/a> ofrece otro enfoque basado en el l\u00e9xico para <a href=\"https:\/\/github.com\/clips\/pattern\/blob\/d25511f9ca7ed9356b801d8663b8b5168464e68f\/pattern\/text\/__init__.py#L2316\" target=\"_blank\" rel=\"noopener\">analizar los sentimientos<\/a>. Utiliza el l\u00e9xico <a href=\"https:\/\/github.com\/aesuli\/SentiWordNet\" target=\"_blank\" rel=\"noopener\">SentiWordNet<\/a>, donde a cada grupo de sin\u00f3nimos (<em>synset<\/em>) de <a href=\"https:\/\/github.com\/clips\/pattern\" target=\"_blank\" rel=\"noopener\">WordNet<\/a> se le asigna una puntuaci\u00f3n de positividad, negatividad y objetividad. Las puntuaciones positivas y negativas de cada palabra se combinan mediante una serie de reglas para obtener una puntuaci\u00f3n final de polaridad. Del mismo modo, la puntuaci\u00f3n de objetividad de cada palabra se combina para obtener una puntuaci\u00f3n final de subjetividad.<\/p>\n<p>Como WordNet contiene informaci\u00f3n sobre las partes del discurso, las reglas pueden tener en cuenta si los adjetivos o adverbios que acompa\u00f1an a una palabra modifican su sentimiento. El conjunto de reglas tambi\u00e9n tiene en cuenta las negaciones, los signos de exclamaci\u00f3n y los emojis, e incluso incluye algunas reglas para considerar las expresiones idiom\u00e1ticas y el sarcasmo.<\/p>\n<p>Sin embargo, Pattern como biblioteca independiente solo es compatible con Python 3.6. Como tal, la forma m\u00e1s com\u00fan de utilizar Pattern es a trav\u00e9s de <a href=\"https:\/\/textblob.readthedocs.io\/en\/dev\/\" target=\"_blank\" rel=\"noopener\">TextBlob<\/a>. De forma predeterminada, el <a href=\"https:\/\/github.com\/sloria\/TextBlob\/blob\/e19171014bfba910d1e33527f46d514837da234e\/src\/textblob\/en\/sentiments.py#L15\" target=\"_blank\" rel=\"noopener\">analizador de sentimientos TextBlob<\/a> utiliza su propia implementaci\u00f3n de la biblioteca Pattern para generar puntuaciones de sentimientos.<\/p>\n<p>Ve\u00e1moslo en acci\u00f3n:<\/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>Puede ver que ejecutamos el m\u00e9todo TextBlob sobre nuestro texto y, a continuaci\u00f3n, extraemos el sentimiento utilizando el 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 nuestra frase de ejemplo, Pattern en TextBlob nos da una puntuaci\u00f3n de polaridad de 0,625 (relativamente similar a la puntuaci\u00f3n otorgada por VADER), y una puntuaci\u00f3n de subjetividad de 0,6.<\/p>\n<p>Pero tambi\u00e9n hay una segunda forma de obtener puntuaciones de sentimientos en TextBlob. Este paquete tambi\u00e9n incluye un <a href=\"https:\/\/github.com\/sloria\/TextBlob\/blob\/e19171014bfba910d1e33527f46d514837da234e\/src\/textblob\/en\/sentiments.py#L53\" target=\"_blank\" rel=\"noopener\">clasificador Naive Bayes preentrenado<\/a>, que etiquetar\u00e1 un fragmento de texto como positivo o negativo, y le indicar\u00e1 la probabilidad de que el texto sea positivo o negativo.<\/p>\n<p>Para utilizar este m\u00e9todo, primero tenemos que descargar tanto el m\u00f3dulo <code>punkt<\/code> como el conjunto de datos <code>movie-reviews<\/code> de NLTK, que se utiliza para entrenar 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>Una vez m\u00e1s, tenemos que ejecutar <code>TextBlob<\/code> sobre nuestro texto, pero esta vez a\u00f1adimos el argumento <code>analyzer=NaiveBayesAnalyzer()<\/code>. A continuaci\u00f3n, como antes, utilizamos el atributo sentiment para extraer las puntuaciones de sentimiento.<\/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>Esta vez acabamos con una etiqueta de <code>pos<\/code> (positivo), con lo que el modelo predice que el texto tiene un 59\u00a0% de probabilidad de ser positivo y un 41\u00a0% de probabilidad de ser negativo.<\/p>\n<h4 class=\"wp-block-heading\">spaCy<\/h4>\n<p>Otra opci\u00f3n es utilizar <a href=\"https:\/\/spacy.io\/\" target=\"_blank\" rel=\"noopener\">spaCy<\/a> para el an\u00e1lisis de sentimientos. spaCy es otro paquete popular para la PNL en Python, y dispone de una amplia gama de opciones para el procesamiento de texto.<\/p>\n<p>El primer m\u00e9todo consiste en emplear el complemento <a href=\"https:\/\/spacy.io\/universe\/project\/spacy-textblob\" target=\"_blank\" rel=\"noopener\">spacytextblob<\/a> para utilizar el analizador de sentimientos TextBlob como parte de su proceso spaCy. Antes de poder hacerlo, tendr\u00e1 que instalar tanto <code>spacy<\/code> como <code>spacytextblob<\/code> y descargar el modelo ling\u00fc\u00edstico correspondiente.<\/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>A continuaci\u00f3n, cargamos este modelo ling\u00fc\u00edstico y a\u00f1adimos <code>spacytextblob<\/code> a nuestro proceso de procesamiento de texto. TextBlob puede utilizarse a trav\u00e9s del m\u00e9todo <code>pipe<\/code> de spaCy, lo que significa que podemos incluirlo como parte de una cadena de procesamiento de texto m\u00e1s compleja, incluyendo pasos de preprocesamiento como el etiquetado de partes del discurso, la lematizaci\u00f3n y el reconocimiento de entidades nombradas. El preprocesamiento puede normalizar y enriquecer el texto, con el fin de ayudar a los modelos posteriores a obtener la m\u00e1xima informaci\u00f3n de las 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 ahora, nos limitaremos a analizar nuestra frase de ejemplo sin preprocesamiento:<\/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>Obtenemos los mismos resultados que al utilizar TextBlob anteriormente.<\/p>\n<p>Una segunda forma en la que podemos analizar el sentimiento en spaCy es entrenando nuestro propio modelo utilizando la clase <a href=\"https:\/\/spacy.io\/api\/textcategorizer\" target=\"_blank\" rel=\"noopener\">TextCategorizer<\/a>. Esto le permite entrenar una serie de <a href=\"https:\/\/spacy.io\/api\/architectures\" target=\"_blank\" rel=\"noopener\">modelos creados por SpaCy<\/a> utilizando un conjunto de entrenamiento de an\u00e1lisis de sentimientos. Una vez m\u00e1s, como esto puede utilizarse como parte del proceso spaCy, tiene muchas opciones para preprocesar su texto antes de entrenar su modelo.<\/p>\n<p>Por \u00faltimo, puede utilizar grandes modelos ling\u00fc\u00edsticos para realizar an\u00e1lisis de sentimientos a trav\u00e9s de <a href=\"https:\/\/spacy.io\/api\/large-language-models#sentiment\" target=\"_blank\" rel=\"noopener\">spacy-llm<\/a>. Esto le permite hacer peticiones a varios modelos de lenguaje de gran tama\u00f1o (LLM) patentados de OpenAI, Anthropic, Cohere y Google que realicen un an\u00e1lisis de sentimientos de sus textos.<\/p>\n<p>Este enfoque funciona de forma ligeramente diferente a los otros m\u00e9todos de los que hemos hablado. En lugar de entrenar el modelo, podemos utilizar modelos generalistas como GPT-4 para predecir el sentimiento de un texto. Puede hacerlo mediante el aprendizaje de cero intentos (en el que se pasa al modelo una petici\u00f3n pero ning\u00fan ejemplo) o el aprendizaje de pocos intentos (en el que se pasa al modelo una petici\u00f3n y varios ejemplos).<\/p>\n<h4 class=\"wp-block-heading\">Transformers<\/h4>\n<p>El \u00faltimo paquete Python para el an\u00e1lisis de sentimientos del que hablaremos es <a href=\"https:\/\/huggingface.co\/docs\/transformers\/en\/index\" target=\"_blank\" rel=\"noopener\">Transformers<\/a> de <a href=\"https:\/\/huggingface.co\/\" target=\"_blank\" rel=\"noopener\">Hugging Face<\/a>.<\/p>\n<p>Hugging Face aloja todos los principales LLM de c\u00f3digo abierto para su uso gratuito (entre otros modelos, incluidos los de visi\u00f3n por ordenador y audio), y proporciona una plataforma para entrenar, implementar y compartir estos modelos. Su paquete Transformers ofrece una amplia gama de funcionalidades (incluido el an\u00e1lisis de sentimientos) para trabajar con los LLM alojados en Hugging Face.<\/p>\n<h2 class=\"wp-block-heading\">Comprender los resultados de los analizadores de sentimientos<\/h2>\n<p>Ahora que hemos cubierto todas las formas en las que puede realizar an\u00e1lisis de sentimientos en Python, puede que se pregunte: \u00ab\u00bfC\u00f3mo aplico todo esto a mis datos?\u00bb.<\/p>\n<p>Para entenderlo, utilicemos PyCharm para comparar dos paquetes: VADER y TextBlob. Sus distintas puntuaciones de sentimientos nos ofrecen varias perspectivas diferentes sobre nuestros datos. Utilizaremos estos paquetes para analizar el conjunto de datos de rese\u00f1as de Amazon.<\/p>\n<p>PyCharm Professional es un potente IDE de Python para <a href=\"https:\/\/www.jetbrains.com\/pycharm\/data-science\/\" target=\"_blank\" rel=\"noopener\">ciencia de datos<\/a> compatible con la <a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/auto-completing-code.html\" target=\"_blank\" rel=\"noopener\">finalizaci\u00f3n de c\u00f3digo<\/a> avanzada de Python, inspecciones y <a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/debugging-code.html\" target=\"_blank\" rel=\"noopener\">depuraci\u00f3n<\/a>, <a href=\"https:\/\/www.jetbrains.com\/pycharm\/integrations\/#databases\" target=\"_blank\" rel=\"noopener\">bases de datos<\/a> enriquecidas, <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> y mucho m\u00e1s, todo ello sin necesidad de configuraciones adicionales. Adem\u00e1s de estas, tambi\u00e9n obtendr\u00e1 funcionalidades incre\u00edblemente \u00fatiles como nuestro DataFrame <em>Column Statistics<\/em> y <em>Chart View<\/em>, as\u00ed como <a href=\"https:\/\/www.jetbrains.com\/pycharm\/integrations\/\" target=\"_blank\" rel=\"noopener\">integraciones<\/a> que hacen que trabajar con LLM sea mucho m\u00e1s r\u00e1pido y sencillo. En este art\u00edculo del blog, exploraremos las funcionalidades avanzadas de PyCharm para trabajar con DataFrames, lo que nos permitir\u00e1 obtener una visi\u00f3n r\u00e1pida de c\u00f3mo se distribuyen nuestras puntuaciones de sentimientos entre los dos paquetes.<\/p>\n<p>Si ya est\u00e1 listo para iniciar su propio proyecto de an\u00e1lisis de sentimientos, puede activar su suscripci\u00f3n gratuita de tres meses a PyCharm. Haga clic en el siguiente enlace e introduzca este c\u00f3digo promocional: <strong>PCSA24<\/strong>. A continuaci\u00f3n, recibir\u00e1 un c\u00f3digo de activaci\u00f3n por correo electr\u00f3nico.<\/p>\n<div class=\"buttons\">\n<div class=\"buttons__row\"><a class=\"btn\" href=\"https:\/\/www.jetbrains.com\/store\/redeem\/\" target=\"\" rel=\"noopener\">Active su suscripci\u00f3n de 3 meses<\/a><\/div>\n<\/div>\n<p>Lo primero que tenemos que hacer es cargar los datos. Podemos utilizar el m\u00e9todo <code>load_dataset()<\/code> del paquete Datasets para descargar estos <a href=\"https:\/\/huggingface.co\/datasets\/fancyzhx\/amazon_polarity\" target=\"_blank\" rel=\"noopener\">datos del Hugging Face Hub<\/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>Puede pasar el rat\u00f3n por encima del nombre del conjunto de datos para ver la ficha del conjunto de datos de Hugging Face directamente dentro de PyCharm, lo que le ofrece una forma c\u00f3moda de obtener informaci\u00f3n sobre los activos de Hugging Face sin salir del 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>Podemos ver el contenido de este conjunto de datos aqu\u00ed:<\/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>El conjunto de datos de entrenamiento tiene 3,6 millones de observaciones, y el conjunto de datos de prueba contiene 400 000. En este tutorial trabajaremos con el conjunto de datos de entrenamiento.<\/p>\n<p>Ahora cargaremos en el VADER <code>SentimentIntensityAnalyzer<\/code> y el m\u00e9todo 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>El conjunto de datos de entrenamiento tiene demasiadas observaciones para visualizarlas c\u00f3modamente, as\u00ed que tomaremos una muestra aleatoria de 1000 rese\u00f1as para representar el sentimiento general de todos los autores.<\/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>Obtengamos ahora las puntuaciones VADER y TextBlob de cada una de estas rese\u00f1as. Iteraremos sobre cada texto de rese\u00f1a, los pasaremos por los analizadores de sentimientos y, a continuaci\u00f3n, adjuntaremos las puntuaciones a una lista espec\u00edfica.<\/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>A continuaci\u00f3n, introduciremos cada una de estas listas en un DataFrame de <a href=\"https:\/\/pandas.pydata.org\/\" target=\"_blank\" rel=\"noopener\">pandas<\/a> como columna independiente:<\/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>Ahora, estamos listos para empezar a explorar nuestros resultados.<\/p>\n<p>Normalmente, este ser\u00eda el momento en el que empezar\u00edamos a crear c\u00f3digo para el an\u00e1lisis exploratorio de datos. Esto podr\u00eda hacerse utilizando el m\u00e9todo <code>describe<\/code> de pandas para obtener estad\u00edsticas resumidas sobre nuestras columnas, y escribiendo c\u00f3digo <a href=\"https:\/\/matplotlib.org\/\" target=\"_blank\" rel=\"noopener\">Matplotlib<\/a> o <a href=\"https:\/\/seaborn.pydata.org\/\" target=\"_blank\" rel=\"noopener\">seaborn<\/a> para visualizar nuestros resultados. Sin embargo, PyCharm tiene algunas funcionalidades capaces de acelerar este proceso.<\/p>\n<p>Sigamos adelante e imprimamos nuestro 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>Podemos ver un bot\u00f3n en la esquina superior derecha llamado <em>Show Column Statistics<\/em>. Al hacer clic en este nos ofrece dos opciones diferentes: <em>Compact<\/em> y <em>Detailed<\/em>. Seleccionemos <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>Ahora disponemos de estad\u00edsticas de resumen proporcionadas como parte de los encabezados de nuestras columnas. Al observarlas, podemos ver que la puntuaci\u00f3n compuesta de VADER tiene una media de 0,4 (mediana = 0,6), mientras que la puntuaci\u00f3n de polaridad de TextBlob proporciona una media de 0,2 (mediana = 0,2).<\/p>\n<p>Este resultado indica que, por t\u00e9rmino medio, VADER tiende a estimar m\u00e1s positivamente el mismo conjunto de rese\u00f1as que TextBlob. Tambi\u00e9n muestra que, para ambos analizadores de sentimientos, es probable que tengamos m\u00e1s rese\u00f1as positivas que negativas; podemos profundizar en esto comprobando algunas visualizaciones.<\/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>Otra funcionalidad de PyCharm que podemos utilizar es el DataFrame <em>Chart View<\/em>. El bot\u00f3n de esta funci\u00f3n se encuentra en la esquina superior izquierda.<\/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>Cuando hacemos clic en \u00e9l, pasamos al editor de gr\u00e1ficos. A partir de aqu\u00ed, podemos crear visualizaciones sin c\u00f3digo directamente desde nuestro DataFrame.<\/p>\n<p>Empecemos por la puntuaci\u00f3n compuesta de VADER. Para empezar a crear este gr\u00e1fico, vaya a <em>Show Series Settings<\/em> en la esquina superior derecha.<\/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>Elimine los valores predeterminados de <em>X Axis<\/em> y de <em>Y Axis<\/em>. Sustituya los valores de <em>X Axis <\/em> y de <em>Y Axis <\/em> por <code>vader_compound<\/code>. Haga clic en la flecha situada junto al nombre de la variable en el campo <em>Y Axis<\/em> y seleccione <code>count<\/code>.<\/p>\n<p>Por \u00faltimo, seleccione <em>Histogram<\/em> en los iconos del gr\u00e1fico, justo debajo de <em>Series Settings<\/em>. Probablemente tengamos una distribuci\u00f3n bimodal para la puntuaci\u00f3n compuesta de VADER, con un ligero pico en torno a -0,8 y otro mucho mayor en torno a 0,9. Estos picos seguramente representan la divisi\u00f3n de las rese\u00f1as negativas y positivas. Tambi\u00e9n hay muchas m\u00e1s cr\u00edticas 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>Repitamos el mismo ejercicio y creemos un histograma para ver la distribuci\u00f3n de las puntuaciones de polaridad de TextBlob.<\/p>\n<p>Por el contrario, TextBlob tiende a calificar la mayor\u00eda de las rese\u00f1as como neutras, con muy pocas rese\u00f1as extremadamente positivas o negativas. Para entender por qu\u00e9 tenemos una discrepancia en las puntuaciones que proporcionan estos dos analizadores de sentimientos, veamos una rese\u00f1a que VADER calific\u00f3 como muy positiva y otra que VADER calific\u00f3 como muy negativa, pero que TextBlob calific\u00f3 como neutra.<\/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>Obtendremos el \u00edndice de la primera revisi\u00f3n en la que VADER las calific\u00f3 como positivas pero TextBlob las calific\u00f3 como neutras:<\/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>A continuaci\u00f3n, obtenemos el \u00edndice de la primera rese\u00f1a en la que VADER las calific\u00f3 como negativas pero TextBlob como neutras:<\/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>Recuperemos primero la rese\u00f1a 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 rese\u00f1a parece mixta, pero en general tiene una tendencia positiva.<\/p>\n<p>Veamos ahora la rese\u00f1a 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 rese\u00f1a es inequ\u00edvocamente negativa. Al comparar ambas, VADER parece m\u00e1s preciso, pero tiende a dar excesiva prioridad a los t\u00e9rminos positivos en un texto.<\/p>\n<p>Lo \u00faltimo que podemos considerar es la subjetividad frente a la objetividad de cada rese\u00f1a. Lo haremos creando un histograma de la puntuaci\u00f3n de subjetividad de 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>Curiosamente, existe una buena distribuci\u00f3n de la subjetividad en las rese\u00f1as, siendo la mayor\u00eda de ellas una mezcla de opiniones subjetivas y objetivas. Unas pocas opiniones son tambi\u00e9n muy subjetivas (cercanas a 1) o muy objetivas (cercanas a 0).<\/p>\n<p>Estas puntuaciones entre ellas nos confieren una buena forma de segmentar los datos. Si necesita saber las cosas objetivas que gustaron y no gustaron a los usuarios sobre los productos, puede fijarse en las rese\u00f1as con una puntuaci\u00f3n de subjetividad baja y en las puntuaciones compuestas de VADER cercanas a 1 y -1, respectivamente.<\/p>\n<p>Por el contrario, si quiere saber cu\u00e1l es la reacci\u00f3n emocional de las personas ante los productos, podr\u00eda escoger aquellas con una puntuaci\u00f3n de subjetividad alta y puntuaciones compuestas de VADER altas y bajas.<\/p>\n<h2 class=\"wp-block-heading\">Debe tener en cuenta que<\/h2>\n<p>Como ocurre con cualquier problema en el procesamiento del lenguaje natural, hay una serie de cosas que tener en cuenta cuando se realiza un an\u00e1lisis de sentimientos.<\/p>\n<p>Una de las consideraciones m\u00e1s importantes es el idioma de los textos que intenta analizar. Muchos de los m\u00e9todos basados en l\u00e9xico solo funcionan para un n\u00famero limitado de idiomas, por lo que si trabaja con idiomas no admitidos por estos l\u00e9xicos, es posible que tenga que adoptar otro enfoque, como utilizar un LLM optimizado o entrenar sus propios modelos.<\/p>\n<p>A medida que los textos aumentan en complejidad, tambi\u00e9n puede resultar dif\u00edcil para los analizadores basados en l\u00e9xicos y los modelos basados en bolsas de palabras detectar correctamente el sentimiento. El sarcasmo o los indicadores de contexto m\u00e1s sutiles pueden ser dif\u00edciles de detectar para los modelos m\u00e1s sencillos, y es posible que estos modelos no sean capaces de clasificar con precisi\u00f3n el sentimiento de esos textos. Los LLM pueden manejar textos m\u00e1s complejos, pero tendr\u00eda que experimentar con diferentes modelos.<\/p>\n<p>Por \u00faltimo, al realizar an\u00e1lisis de sentimientos, tambi\u00e9n surgen las mismas cuestiones que al abordar cualquier problema de aprendizaje autom\u00e1tico. Sus modelos solo ser\u00e1n tan buenos como los datos de entrenamiento que utilice. Si no puede conseguir conjuntos de datos de entrenamiento y prueba de alta calidad, adecuados al \u00e1mbito de sus problemas, no podr\u00e1 predecir correctamente el sentimiento de su p\u00fablico objetivo.<\/p>\n<p>Tambi\u00e9n debe asegurarse de que sus objetivos son apropiados para el problema de su empresa. Quiz\u00e1 parezca interesante crear un modelo para saber si sus productos hacen que sus clientes est\u00e9n \u00abtristes\u00bb, \u00abenfadados\u00bb o \u00abindignados\u00bb, pero si este no le ayuda a tomar una decisi\u00f3n sobre c\u00f3mo mejorar sus productos, entonces no estar\u00e1 resolviendo su problema.<\/p>\n<h2 class=\"wp-block-heading\">Conclusi\u00f3n<\/h2>\n<p>En este art\u00edculo del blog, nos adentramos en la fascinante \u00e1rea del an\u00e1lisis de sentimientos en Python y mostramos c\u00f3mo este complejo campo se hace m\u00e1s accesible gracias a una serie de potentes paquetes.<\/p>\n<p>Tratamos las aplicaciones potenciales del an\u00e1lisis de sentimientos, las distintas formas de evaluar el sentimiento y los principales m\u00e9todos para extraer el sentimiento de un texto. Tambi\u00e9n hemos visto algunas funciones \u00fatiles en PyCharm que hacen que trabajar con modelos e interpretar sus resultados sea m\u00e1s sencillo y r\u00e1pido.<\/p>\n<p>Aunque el campo del procesamiento del lenguaje natural se centra actualmente de forma intensiva en los grandes modelos ling\u00fc\u00edsticos, las t\u00e9cnicas m\u00e1s antiguas de utilizar analizadores basados en l\u00e9xicos o modelos tradicionales de aprendizaje autom\u00e1tico, como los clasificadores Naive Bayes, siguen teniendo su lugar en el an\u00e1lisis de sentimientos. Estas t\u00e9cnicas destacan cuando se analizan textos m\u00e1s sencillos, o cuando la velocidad, las predicciones o la facilidad de implementaci\u00f3n son prioritarias. Los LLM son m\u00e1s adecuados para textos m\u00e1s complejos o matizados.<\/p>\n<p>Ahora que ya conoce los conceptos b\u00e1sicos, puede aprender a realizar <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\u00e1lisis de sentimientos con LLM<\/a> en nuestro tutorial. La gu\u00eda paso a paso le ayuda a descubrir c\u00f3mo seleccionar el modelo adecuado para su tarea, utilizarlo para el an\u00e1lisis de sentimientos e incluso ajustarlo usted mismo.<\/p>\n<p>Si desea seguir aprendiendo sobre el procesamiento del lenguaje natural o el aprendizaje autom\u00e1tico en un sentido m\u00e1s amplio despu\u00e9s de haber le\u00eddo este art\u00edculo, aqu\u00ed tiene algunos 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 a realizar an\u00e1lisis de sentimientos con modelos de lenguaje de gran tama\u00f1o<\/a><\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2022\/06\/start-studying-machine-learning-with-pycharm\/\">Comience a estudiar aprendizaje autom\u00e1tico con 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 los m\u00e9todos de aprendizaje autom\u00e1tico en ingenier\u00eda de software<\/a><\/li>\n<\/ul>\n<h2 class=\"wp-block-heading\">Empiece hoy mismo con el an\u00e1lisis de sentimientos en PyCharm<\/h2>\n<p>Si ya est\u00e1 listo para iniciar su propio proyecto de an\u00e1lisis de sentimientos, puede activar su suscripci\u00f3n gratuita de tres meses a PyCharm. Haga clic en el siguiente enlace e introduzca este c\u00f3digo promocional: <strong>PCSA24<\/strong>. A continuaci\u00f3n, recibir\u00e1 un c\u00f3digo de activaci\u00f3n por correo electr\u00f3nico.<\/p>\n<div class=\"buttons\">\n<div class=\"buttons__row\"><a class=\"btn\" href=\"https:\/\/www.jetbrains.com\/store\/redeem\/\" target=\"\" rel=\"noopener\">Active su suscripci\u00f3n de 3 meses<\/a><\/div>\n<\/div>\n\n\n<p>A<em>rt\u00edculo original en ingl\u00e9s de:<\/em><\/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":571595,"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\/es\/wp-json\/wp\/v2\/pycharm\/571579"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/pycharm"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/types\/pycharm"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/users\/1086"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/comments?post=571579"}],"version-history":[{"count":6,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/pycharm\/571579\/revisions"}],"predecessor-version":[{"id":571610,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/pycharm\/571579\/revisions\/571610"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/media\/571595"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/media?parent=571579"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/categories?post=571579"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/tags?post=571579"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/cross-post-tag?post=571579"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}