From 30ffe9bc12d9d0187128e1cefed0321defcc616b Mon Sep 17 00:00:00 2001 From: jmuquinche Date: Sun, 27 Jul 2025 03:21:15 -0500 Subject: [PATCH 1/4] Cambios realizados --- lessons/02_bag_of_words.ipynb | 1069 +++++++++++++++++++++++++-------- 1 file changed, 820 insertions(+), 249 deletions(-) diff --git a/lessons/02_bag_of_words.ipynb b/lessons/02_bag_of_words.ipynb index cbc9046..ab7d4ef 100644 --- a/lessons/02_bag_of_words.ipynb +++ b/lessons/02_bag_of_words.ipynb @@ -48,7 +48,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 152, "id": "9e4a3a0d-66f4-44e5-8dd6-5f441146014d", "metadata": { "scrolled": true, @@ -60,9 +60,17 @@ "# %pip install scikit-learn" ] }, + { + "cell_type": "markdown", + "id": "4d338823", + "metadata": {}, + "source": [ + "Se sugiere instalar el paquete scikit-learn" + ] + }, { "cell_type": "code", - "execution_count": null, + "execution_count": 153, "id": "21ed437f-9767-43b7-abc5-159aa4339a31", "metadata": {}, "outputs": [], @@ -73,9 +81,17 @@ "# !python -m spacy download en_core_web_sm" ] }, + { + "cell_type": "markdown", + "id": "aa02d204", + "metadata": {}, + "source": [ + "Se sugiere instalar las bibliotecas necesarias para procesamiento" + ] + }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 154, "id": "f3862ffd-918f-4184-8c90-8a39a8a2a069", "metadata": {}, "outputs": [], @@ -87,9 +103,18 @@ "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "from string import punctuation\n", + "from sklearn.feature_extraction.text import TfidfVectorizer\n", "%matplotlib inline" ] }, + { + "cell_type": "markdown", + "id": "2798d7be", + "metadata": {}, + "source": [ + "Aqui se añadió la linea from sklearn.feature_extraction.text import TfidfVectorizer" + ] + }, { "cell_type": "markdown", "id": "852ea4a5-7c28-4557-acdd-afe8a97b7235", @@ -104,7 +129,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 155, "id": "4190e351-97b7-4c5b-866e-07aa6cbd42c2", "metadata": {}, "outputs": [], @@ -114,9 +139,17 @@ "tweets = pd.read_csv(tweets_path, sep=',')" ] }, + { + "cell_type": "markdown", + "id": "e5c28444", + "metadata": {}, + "source": [ + "Este bloque de código carga un archivo CSV que contiene datos de tweets sobre aerolíneas y lo guarda en una tabla llamada tweets. Usa la librería pandas para leer el archivo desde una carpeta cercana y deja los datos listos para analizarlos o procesarlos dentro del programa." + ] + }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 156, "id": "79acbaf2-6625-4abb-b50f-97ea54ba0d11", "metadata": {}, "outputs": [ @@ -290,7 +323,7 @@ "4 2015-02-24 11:14:45 -0800 NaN Pacific Time (US & Canada) " ] }, - "execution_count": 3, + "execution_count": 156, "metadata": {}, "output_type": "execute_result" } @@ -299,6 +332,14 @@ "tweets.head()" ] }, + { + "cell_type": "markdown", + "id": "ca589092", + "metadata": {}, + "source": [ + "tweets.head() muestra las primeras cinco filas del DataFrame tweets, lo que te permite ver una vista rápida de los datos para entender su contenido y estructura inicial." + ] + }, { "cell_type": "markdown", "id": "80232c78-ac41-4d74-a581-76c9dac3b8f6", @@ -316,7 +357,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 157, "id": "a1faaf90-8c01-4d25-9468-90c01823f0d5", "metadata": {}, "outputs": [], @@ -324,6 +365,14 @@ "tweets = tweets[tweets['airline_sentiment'] != 'neutral'].reset_index(drop=True)" ] }, + { + "cell_type": "markdown", + "id": "33d67fe0", + "metadata": {}, + "source": [ + "La línea filtra los tweets para quitar los neutrales y actualiza el índice para que sea consecutivo.\n" + ] + }, { "cell_type": "markdown", "id": "7cb6b039-53e7-4afe-a9e0-b3522c12b2d7", @@ -334,7 +383,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 158, "id": "438830e6-1064-47fe-b578-a1ca693a0ed0", "metadata": {}, "outputs": [ @@ -357,6 +406,14 @@ " print(tweets['text'].iloc[idx])" ] }, + { + "cell_type": "markdown", + "id": "de0bd4b3", + "metadata": {}, + "source": [ + "Ese código imprime los textos de los primeros cinco tweets del DataFrame tweets, mostrando uno por uno en la consola." + ] + }, { "cell_type": "markdown", "id": "0d6746f8-b29c-40d4-bef6-b4afd4cd6cc1", @@ -369,13 +426,13 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 159, "id": "01955158-6954-447a-acb6-2989d02a49c3", "metadata": {}, "outputs": [ { "data": { - "image/png": "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s2aSpJycHC1ZssRtrrGxsaqoqFBeXt5VvRZqFzdVwwiWZdkB9cwzzyg2Nlaffvqp1qxZo7S0NM2aNUtJSUlV3n9CQoJiYmJUWFiorKwsNWrUSPfff78kqaKiQpL06aef6oYbbnB7Hn86APhVw4YN3ZYdDocqKipUUVGhli1bat26dZWe07RpU7fxv2Vd8AXqp59+WseOHdPcuXPVqlUr+fr6Kjo6WuXl5Vc1zzvvvFPt2rXTihUr9OyzzyojI8O+V1D69fM+evRoJScnV3ruTTfddFWvhdpFEKFe2rJlS6XlyMhI3XrrrTp79qy2bt2qXr16SZJ+/vlnfffdd4qKirLHR0REaMyYMRozZoymTp2qRYsWXTSIfHx8dO7cud+dT69evRQREaEPP/xQn332mYYMGSIfHx9J0q233ipfX18dOXLE7cZLAL+va9euKigokLe3t32j84U6dOigbdu2KTEx0V731VdfuY1Zv3693nzzTQ0aNEiSdPToUf30009uYxo2bHhFn/f4+HgtX75cN954oxo0aKAHHnjAbb579uzRzTfffKWHiDqCS2aol44ePaqJEydq//79+uCDD/TGG2/oueeeU2RkpB566CGNHDlSGzZs0Ndff60nnnhCN9xwgx566CFJUkpKilavXq28vDzt2LFDX3zxhVss/Vbr1q1VUlKitWvX6qefftLp06cvOs7hcCg+Pl5vvfWWsrKy9MQTT9jbAgICNGnSJE2YMEFLly7VwYMHtXPnTv3nf/6nli5dWv1vDnAd6d+/v6Kjo/Xwww9r9erVOnTokDZt2qSXXnrJjp6kpCS9/fbbWrp0qQ4cOKBXX31Vu3btcjtrdPPNN2vZsmXat2+ftm7dqoSEBPn5+bm9VuvWrbV27VoVFBSoqKjoknNKSEjQjh079Nprr+mf//mf1ahRI3vblClTtHnzZo0bN065ubk6cOCAVq5ceU1noFE7CCLUS08++aRKS0t15513aty4cUpKStKoUaMk/fotkW7duikuLk7R0dGyLEurVq2yT8mfO3dO48aNU1RUlO677z516NBBb7755kVfp1evXhozZowee+wxtWjRQunp6ZecU0JCgvbu3asbbrhBd999t9u2f/3Xf9Wf/vQnpaWlKSoqSrGxsfrkk0/Upk2banpHgOuTw+HQqlWr1Lt3bw0fPlzt27fX448/rkOHDik0NFTSr5+9qVOnatKkSeratavy8vL09NNPu4XKO++8o6KiInXp0kWJiYlKTk5WSEiI22vNmjVLWVlZioiIUJcuXS45p8jISPXo0UO7du2y7xU87/bbb1d2drYOHDige++9V126dNG0adPUsmXLanxXUBP4pWrUO3369FHnzp350xkALmnAgAEKCwvTsmXLPD0V1BPcQwQAqNdOnz6tt956S7GxsfLy8tIHH3ygzz//XFlZWZ6eGuoRgggAUK+dv6z26quvqqysTB06dNBHH32k/v37e3pqqEe4ZAYAAIzHTdUAAMB4BBEAADAeQQQAAIxHEAEAAOMRRAAAwHgEEYAqO3TokBwOh3Jzcy87bsaMGercubO9/PTTT+vhhx+u0bnVBaYcJ3A94HeIAFRZRESE8vPzFRwcfFXP+4//+I9Kf428Pjt06JDatGmjnTt3uoVfXTpOh8OhjIwMAg24BIIIQJV5eXkpLCzsktsty7roXw93Op01Oa06w5TjBK4HXDIDcFmZmZm655571LRpUwUFBSkuLk4HDx6UVPmS2bp16+RwOLR69Wp1795dvr6+Wr9+faV9XngpqU+fPkpOTtbkyZPVvHlzhYWFacaMGW7PcblcGjVqlEJCQhQYGKi+ffvq66+/vqJj+Prrr/VP//RPCggIUGBgoLp162b/pXRJ2rRpk3r37i0/Pz9FREQoOTlZp06dsre3bt1aqampGj58uAICAnTTTTdp4cKF9vbzf6S3S5cucjgc6tOnzyWPMykpSSkpKWrWrJlCQ0O1cOFCnTp1Sn/84x8VEBCgdu3a6bPPPnOb/969ezVo0CA1adJEoaGhSkxM1E8//XTF71/r1q0lSY888ogcDoe9DOD/I4gAXNapU6c0ceJEbd++XWvXrlWDBg30yCOPqKKi4pLPmTx5stLS0rRv3z7dfvvtV/Q6S5culb+/v7Zu3ar09HS98sor9t+isixLDzzwgAoKCrRq1Srl5OSoa9eu6tevn44fP/67+05ISNCNN96o7du3KycnRy+88IIaNmwoSdq9e7diY2P16KOPateuXfrwww+1YcMGjR8/3m0fs2bNUvfu3bVz506NHTtWzz77rL799ltJ0rZt2yRJn3/+ufLz8/X3v//9sscZHBysbdu2KSkpSc8++6yGDBmiXr16aceOHYqNjVViYqJOnz4tScrPz1dMTIw6d+6sr776SpmZmfrxxx81dOjQK37/tm/fLklavHix8vPz7WUAv2EBwFUoLCy0JFm7d++28vLyLEnWzp07LcuyrC+//NKSZP3Xf/2X23OmT59u3XHHHfbyU089ZT300EP2ckxMjHXPPfe4PadHjx7WlClTLMuyrLVr11qBgYHWL7/84jamXbt21oIFC353zgEBAdaSJUsuui0xMdEaNWqU27r169dbDRo0sEpLSy3LsqxWrVpZTzzxhL29oqLCCgkJsebPn29ZllXpfbjS4zx79qzl7+9vJSYm2uvy8/MtSdbmzZsty7KsadOmWQMHDnTb79GjRy1J1v79+y+6X8tyf/8sy7IkWRkZGRd9DwBYFmeIAFzWwYMHFR8fr7Zt2yowMNC+PHTkyJFLPqd79+5X/ToXnklq2bKlCgsLJUk5OTkqKSlRUFCQmjRpYj/y8vLsy3eXM3HiRD3zzDPq37+//u3f/s3tOTk5OVqyZInbfmNjY1VRUaG8vLyLzs/hcCgsLMyeX1WP08vLS0FBQerUqZO9LjQ0VJLcjv3LL790m98tt9wiSW7Hcbn3D8Dv46ZqAJf14IMPKiIiQosWLVJ4eLgqKirUsWNHlZeXX/I5/v7+V/065y9hnedwOOzLchUVFWrZsqXWrVtX6XlNmzb93X3PmDFD8fHx+vTTT/XZZ59p+vTpWrFihX3pb/To0UpOTq70vJtuuumK5nc1Lraf365zOByS5HbsDz74oGbOnFlpXy1btqz2+QGmIogAXNLPP/+sffv2acGCBbr33nslSRs2bKj1eXTt2lUFBQXy9vau8g3B7du3V/v27TVhwgQNGzZMixcv1iOPPKKuXbtqz549uvnmm6s8Px8fH0m66DfqrlXXrl310UcfqXXr1vL2rvp/shs2bFgj8wOuF1wyA3BJzZo1U1BQkBYuXKj//d//1RdffKGJEyfW+jz69++v6OhoPfzww1q9erUOHTqkTZs26aWXXnL7ttjFlJaWavz48Vq3bp0OHz6sjRs3avv27YqKipIkTZkyRZs3b9a4ceOUm5urAwcOaOXKlUpKSrri+YWEhMjPz8++4dnlcl3T8f7WuHHjdPz4cQ0bNkzbtm3TP/7xD61Zs0bDhw+/qsBp3bq11q5dq4KCAhUVFVXb/IDrBUEE4JIaNGigFStWKCcnRx07dtSECRP05z//udbn4XA4tGrVKvXu3VvDhw9X+/bt9fjjj+vQoUP2PTeX4uXlpZ9//llPPvmk2rdvr6FDh+r+++/Xyy+/LOnXe2+ys7N14MAB3XvvverSpYumTZvmdjnq93h7e+v111/XggULFB4eroceeuiajve3wsPDtXHjRp07d06xsbHq2LGjnnvuOTmdTjVocOX/CZ81a5aysrIUERGhLl26VNv8gOuFw7LqyM+oAgAAeAhniAAAgPEIIgD13m233eb2tfTfPpYvX+7p6QGoB7hkBqDeO3z4sM6cOXPRbaGhoQoICKjlGQGobwgiAABgPC6ZAQAA4xFEAADAeAQRAAAwHkEEAACMRxABAADjEUQAAMB4BBEAADAeQQQAAIz3/wBpBRjTM7nsQgAAAABJRU5ErkJggg==", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkQAAAGxCAYAAACDV6ltAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAKQ1JREFUeJzt3QuUjfUe//HvjMG4zbiOS5hEMWpSLkciFY5btVJScj3HrUTFVIPlGNeS6SC6uFXopIMuEnI745LcQ8hlyJkyHcYQQzTDMPu/vr///9n/vWcGQ8PeM7/3a6299jzP89vP/u2xnvHZv9sT4HK5XAIAAGCxQF9XAAAAwNcIRAAAwHoEIgAAYD0CEQAAsB6BCAAAWI9ABAAArEcgAgAA1iMQAQAA6wX5ugJ5QUZGhhw5ckRKlCghAQEBvq4OAADIAV17+vfff5dKlSpJYOCV24AIRDmgYahKlSq+rgYAALgOiYmJUrly5SuWIRDlgLYMOb/QkJAQX1cHAADkwJkzZ0yDhvP/+JUQiHLA6SbTMEQgAgAgb8nJcBcGVQMAAOsRiAAAgPUIRAAAwHoEIgAAYD0CEQAAsB6BCAAAWI9ABAAArEcgAgAA1iMQAQAA6xGIAACA9QhEAADAegQiAABgPQIRAACwHoEIAABYj0AEAACsF+TrCgCADaJnHPJ1FQC/FNu7uvgDWogAAID1CEQAAMB6BCIAAGA9AhEAALAegQgAAFiPQAQAAKxHIAIAANYjEAEAAOsRiAAAgPUIRAAAwHoEIgAAYD0CEQAAsB6BCAAAWI9ABAAArEcgAgAA1iMQAQAA6xGIAACA9QhEAADAegQiAABgPQIRAACwHoEIAABYj0AEAACsRyACAADWIxABAADrEYgAAID1CEQAAMB6BCIAAGA9AhEAALAegQgAAFiPQAQAAKxHIAIAANYjEAEAAOsRiAAAgPUIRAAAwHoEIgAAYD0CEQAAsB6BCAAAWI9ABAAArEcgAgAA1vNpILp06ZIMGzZMqlWrJkWKFJHq1avL6NGjxeVyucvozzExMVKxYkVTpkWLFnLw4EGv85w8eVI6d+4sISEhUrJkSenZs6ecPXvWq8yuXbvkgQcekODgYKlSpYrExsbetM8JAAD8m08D0bhx42TKlCny7rvvyr59+8y2BpV33nnHXUa3J0+eLFOnTpXNmzdLsWLFpFWrVpKWluYuo2Foz549snLlSlm8eLF8++230qdPH/fxM2fOSMuWLSU8PFy2bdsmb731lowYMUKmT59+0z8zAADwPwEuz+aYm+zRRx+V8uXLy4cffuje1759e9MS9Mknn5jWoUqVKskrr7wir776qjl++vRp85pZs2ZJx44dTZCqXbu2bN26VerXr2/KLFu2TNq2bSu//vqreb2GrqFDh0pSUpIUKlTIlBk8eLB89dVXsn///qvWUwNVaGioeW9thQKAaxU945CvqwD4pdje1W/Yua/l/2+fthDdf//9EhcXJwcOHDDbO3fulO+++07atGljthMSEkyI0W4yh36whg0bysaNG822Pms3mROGlJYPDAw0LUpOmaZNm7rDkNJWpvj4eDl16tRN+7wAAMA/BfnyzbWVRtNbrVq1pECBAmZM0euvv266wJSGIaUtQp502zmmz2FhYV7Hg4KCpHTp0l5ldJxS5nM4x0qVKuV17Pz58+bh0DoCAID8y6ctRPPnz5c5c+bIp59+Ktu3b5fZs2fLP//5T/PsS2PHjjUtUc5DB2EDAID8y6eB6LXXXjOtRDoWKDIyUrp27SoDBw40gURVqFDBPB87dszrdbrtHNPn5ORkr+MXL140M888y2R3Ds/38DRkyBDT3+g8EhMTc/VzAwAA/+LTQPTHH3+YsT6etOssIyPD/KzdXBpYdJyRZ/eVjg1q1KiR2dbnlJQUM3vMsWrVKnMOHWvklNGZZ+np6e4yOiOtZs2aWbrLVOHChc3gK88HAADIv3waiB577DEzZmjJkiXy888/y4IFC2TChAnyxBNPmOMBAQEyYMAAGTNmjHz99deye/du6datm5k51q5dO1MmIiJCWrduLb1795YtW7bI+vXrpX///qbVScupTp06mQHVuj6RTs+fN2+eTJo0SaKionz58QEAgJ/w6aBqXW9IF2Z84YUXTLeXBpjnnnvOLMToiI6OlnPnzpl1hbQlqEmTJmZavS6w6NBxSBqCmjdvblqcdOq+rl3k0HFAK1askH79+km9evWkbNmy5j081yoCAAD28uk6RHkF6xAB+LNYhwjIHusQAQAA+AkCEQAAsB6BCAAAWI9ABAAArEcgAgAA1iMQAQAA6xGIAACA9QhEAADAegQiAABgPQIRAACwHoEIAABYj0AEAACsRyACAADWIxABAADrEYgAAID1CEQAAMB6BCIAAGA9AhEAALAegQgAAFiPQAQAAKxHIAIAANYjEAEAAOsRiAAAgPUIRAAAwHoEIgAAYD0CEQAAsB6BCAAAWI9ABAAArEcgAgAA1iMQAQAA6xGIAACA9QhEAADAegQiAABgPQIRAACwHoEIAABYj0AEAACsRyACAADWIxABAADrEYgAAID1CEQAAMB6BCIAAGA9AhEAALAegQgAAFiPQAQAAKxHIAIAANYjEAEAAOsRiAAAgPUIRAAAwHoEIgAAYD0CEQAAsB6BCAAAWI9ABAAArEcgAgAA1iMQAQAA6xGIAACA9QhEAADAegQiAABgPQIRAACwHoEIAABYj0AEAACsRyACAADWIxABAADrEYgAAID1CEQAAMB6BCIAAGA9AhEAALCezwPR//73P+nSpYuUKVNGihQpIpGRkfL999+7j7tcLomJiZGKFSua4y1atJCDBw96nePkyZPSuXNnCQkJkZIlS0rPnj3l7NmzXmV27dolDzzwgAQHB0uVKlUkNjb2pn1GAADg33waiE6dOiWNGzeWggULytKlS2Xv3r0yfvx4KVWqlLuMBpfJkyfL1KlTZfPmzVKsWDFp1aqVpKWluctoGNqzZ4+sXLlSFi9eLN9++6306dPHffzMmTPSsmVLCQ8Pl23btslbb70lI0aMkOnTp9/0zwwAAPxPgEubYHxk8ODBsn79elm3bl22x7VqlSpVkldeeUVeffVVs+/06dNSvnx5mTVrlnTs2FH27dsntWvXlq1bt0r9+vVNmWXLlknbtm3l119/Na+fMmWKDB06VJKSkqRQoULu9/7qq69k//79V62nBqrQ0FDz3toKBQDXKnrGIV9XAfBLsb2r37BzX8v/3z5tIfr6669NiOnQoYOEhYXJvffeKzNmzHAfT0hIMCFGu8kc+sEaNmwoGzduNNv6rN1kThhSWj4wMNC0KDllmjZt6g5DSluZ4uPjTStVZufPnze/RM8HAADIv3waiP773/+a1pvbb79dli9fLn379pWXXnpJZs+ebY5rGFLaIuRJt51j+qxhylNQUJCULl3aq0x25/B8D09jx441wct56JgjAACQf/k0EGVkZEjdunXljTfeMK1DOu6nd+/eZryQLw0ZMsQ0rzmPxMREn9YHAADk40CkM8d0/I+niIgIOXz4sPm5QoUK5vnYsWNeZXTbOabPycnJXscv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AwZkCUg6W7FYsWLm5sAA8ge95hcsWOBeq06dPXvW3MZJF+VF/mfVLDPgagt4ZrdyeWblypW7KfUB4FvFixc3D9iBLjPkKQ899JB7+QRdfVRvyzJs2DD3jftOnTol3bp1k1KlSpkWnDZt2sjBgwfdr//ll1/kscceM8e1lefOO++Ub775JkuXmf6si3bqjX11nz60+Txzl1mnTp3MGlee0tPTTb0+/vhj96roen+8atWqSZEiRaROnTry+eef37TfGeDv1/RLL70k0dHRUrp0afOlxLnWlF6PvXr1Ml9EdGXpZs2ayc6dO73OMWbMGAkLC5MSJUqYsoMHD/bq6tq6dav89a9/Ndel/t148MEHZfv27e7jek2rJ554wlzrzrZnl9mKFSskODg4S4vxyy+/bOrk+O677+SBBx4w17reIkQ/my4CDP9HIEKeM3v2bAkKCpItW7bIpEmTZMKECfLBBx+YY3/729/k+++/l6+//lo2btxoglLbtm1NSFH9+vUzTeDffvut7N69W8aNG5ftN8D777/fhB79A3z06FHzePXVV7OU69y5syxatMg0rTuWL18uf/zxh/njqjQMaTiaOnWq7NmzRwYOHChdunSRtWvX3sDfEpC3rmn9grJ582aJjY2VUaNGycqVK82xDh06SHJysixdulS2bdsmdevWlebNm5vubTVnzhx5/fXXzbWsx6tWrSpTpkzxOr/ey0rvVKBhZdOmTXL77bebvwu63wlMaubMmeZad7Y96XvqLZy++OIL975Lly7JvHnzzN8BdejQIWndurW0b99edu3aZY7pe7L+XR6hY4iAvOLBBx90RUREuDIyMtz7Bg0aZPYdOHBAm4lc69evdx87ceKEq0iRIq758+eb7cjISNeIESOyPffq1avN60+dOmW2Z86c6QoNDc1SLjw83DVx4kTzc3p6uqts2bKujz/+2H382WefdT3zzDPm57S0NFfRokVdGzZs8DpHz549TTnAdnpNN2nSxGtfgwYNzHW9bt06V0hIiLmOPFWvXt01bdo083PDhg1d/fr18zreuHFjV506dS77npcuXXKVKFHCtWjRIvc+vfYXLFjgVW748OFe53n55ZddzZo1c28vX77cVbhwYfffDL2u+/Tp43UO/QyBgYGu1NTUHP0+4Du0ECHPue+++0yztqNRo0amW2zv3r2m5ahhw4bu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", "text/plain": [ "
" ] @@ -392,6 +449,14 @@ " order=['positive', 'negative']);" ] }, + { + "cell_type": "markdown", + "id": "5d76a9a7", + "metadata": {}, + "source": [ + "Este fragmento de código crea un gráfico de barras que muestra la cantidad de tweets con sentimientos positivos y negativos en el DataFrame tweets. Usa la librería seaborn para contar cuántos tweets hay en cada categoría (positive y negative), pinta las barras de color azul (cornflowerblue) y las ordena primero los positivos y luego los negativos." + ] + }, { "cell_type": "markdown", "id": "eab45abf-adf4-4f5e-ae09-75f6c4fd50d1", @@ -404,7 +469,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 160, "id": "428ddde7-af73-4eb6-92c9-041a1791ca59", "metadata": {}, "outputs": [ @@ -417,7 +482,7 @@ "Name: retweet_count, dtype: float64" ] }, - "execution_count": 7, + "execution_count": 160, "metadata": {}, "output_type": "execute_result" } @@ -427,6 +492,14 @@ "tweets.groupby('airline_sentiment')['retweet_count'].mean()" ] }, + { + "cell_type": "markdown", + "id": "c5a26928", + "metadata": {}, + "source": [ + "Calcula el promedio de retweets para cada sentimiento en los tweets." + ] + }, { "cell_type": "markdown", "id": "0d31f3bc-257c-48a8-86a0-fd0d7c3e8cb3", @@ -439,7 +512,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 161, "id": "12aa9f2d-d655-494a-bb72-08ad973518f3", "metadata": {}, "outputs": [ @@ -519,7 +592,7 @@ "Virgin America 0.543544 0.456456" ] }, - "execution_count": 8, + "execution_count": 161, "metadata": {}, "output_type": "execute_result" } @@ -530,6 +603,14 @@ "proportions.unstack().sort_values('negative', ascending=False)" ] }, + { + "cell_type": "markdown", + "id": "22574bfb", + "metadata": {}, + "source": [ + "Este código calcula qué proporción de tweets de cada aerolínea son negativos y luego ordena las aerolíneas de mayor a menor según ese porcentaje, para ver cuál tiene más quejas." + ] + }, { "cell_type": "markdown", "id": "7042419e-9c41-40e7-8dbf-47bd1e2ad45a", @@ -581,7 +662,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 162, "id": "21738b02-9ab9-4a61-b41f-ff75888aa747", "metadata": { "tags": [] @@ -591,9 +672,17 @@ "from utils import placeholder" ] }, + { + "cell_type": "markdown", + "id": "a1375a7a", + "metadata": {}, + "source": [ + "Importa la función o variable placeholder desde el archivo utils para usarla en el código." + ] + }, { "cell_type": "code", - "execution_count": null, + "execution_count": 163, "id": "03569f0d-34ba-492d-aa1d-1dce9d34f792", "metadata": {}, "outputs": [], @@ -605,20 +694,28 @@ " '''Create a preprocess pipeline that cleans the tweet data.'''\n", " \n", " # Step 1: Lowercase\n", - " text = ...\n", + " text = text.lower()\n", "\n", " # Step 2: Replace patterns with placeholders\n", - " text = ...\n", + " text = placeholder(text)\n", "\n", " # Step 3: Remove extra whitespace characters\n", - " text = ...\n", + " text = text.strip()\n", "\n", " return text" ] }, + { + "cell_type": "markdown", + "id": "b3b44007", + "metadata": {}, + "source": [ + "Este fragmento de código define una función llamada preprocess que limpia un texto de tweet haciendo tres cosas: convierte todo a minúsculas, reemplaza ciertos patrones usando una función llamada placeholder, y elimina espacios extras al principio y final del texto. //En este fragmento de código se modifico" + ] + }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 164, "id": "8990cefd-5d04-46ba-ada2-29978c28cfe8", "metadata": {}, "outputs": [ @@ -628,7 +725,7 @@ "text": [ "lol @justinbeiber and @BillGates are like soo 2000 #yesterday #amiright saw it on https://twitter.com #yolo\n", "==================================================\n", - "lol USER and USER are like soo DIGIT HASHTAG HASHTAG saw it on URL HASHTAG\n" + "lol USER and USER are like soo DIGIT HASHTAG HASHTAG saw it on URL HASHTAG\n" ] } ], @@ -643,9 +740,17 @@ "print(preprocess(example_tweet))" ] }, + { + "cell_type": "markdown", + "id": "26fa36ba", + "metadata": {}, + "source": [ + "Este fragmento de código crea un ejemplo de tweet, lo imprime tal cual, imprime una línea separadora de “=”, y luego imprime ese mismo tweet después de pasar por la función preprocess para mostrar cómo queda limpio y procesado." + ] + }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 165, "id": "a5f7bb6a-f064-48cc-b650-12c4ef2fbb88", "metadata": { "scrolled": true @@ -654,15 +759,15 @@ { "data": { "text/plain": [ - "0 USER plus you've added commercials to the expe...\n", - "1 USER it's really aggressive to blast obnoxious...\n", - "2 USER and it's a really big bad thing about it\n", - "3 USER seriously would pay $ DIGIT a flight for ...\n", - "4 USER yes, nearly every time i fly vx this “ear...\n", + "0 USER plus you've added commercials to the exp...\n", + "1 USER it's really aggressive to blast obnoxiou...\n", + "2 USER and it's a really big bad thing about it\n", + "3 USER seriously would pay $ DIGIT a flight fo...\n", + "4 USER yes, nearly every time i fly vx this “ea...\n", "Name: text_processed, dtype: object" ] }, - "execution_count": 12, + "execution_count": 165, "metadata": {}, "output_type": "execute_result" } @@ -673,6 +778,14 @@ "tweets['text_processed'].head()" ] }, + { + "cell_type": "markdown", + "id": "1c179fa5", + "metadata": {}, + "source": [ + "Este código aplica la función preprocess a cada texto de la columna 'text' del DataFrame tweets, guarda el resultado en una nueva columna llamada 'text_processed', y luego muestra las primeras cinco filas de esa nueva columna." + ] + }, { "cell_type": "markdown", "id": "1576acc6-b305-492a-8fde-65b343cb779c", @@ -730,7 +843,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 166, "id": "cd2adf56-ba93-459d-8cfa-16ce8dc9284b", "metadata": {}, "outputs": [], @@ -738,6 +851,14 @@ "from sklearn.feature_extraction.text import CountVectorizer" ] }, + { + "cell_type": "markdown", + "id": "5d87d7fc", + "metadata": {}, + "source": [ + "Ese fragmento importa la clase CountVectorizer de la biblioteca scikit-learn, que se usa para convertir texto en una matriz de conteos de palabras, facilitando el análisis de texto." + ] + }, { "cell_type": "markdown", "id": "4989781d-6b40-417a-be70-eeba05cd8a50", @@ -760,7 +881,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 167, "id": "4da2bd3d-0460-4b5f-9b9e-02940db0d7ca", "metadata": {}, "outputs": [], @@ -772,6 +893,14 @@ " 'coffee time']" ] }, + { + "cell_type": "markdown", + "id": "4492aaa6", + "metadata": {}, + "source": [ + "Este código crea una lista llamada test que contiene cuatro textos cortos (documentos), que luego se pueden usar como ejemplo para procesar o analizar texto." + ] + }, { "cell_type": "markdown", "id": "dff7c1d3-fcee-4e20-b9a7-17306ebd5fc2", @@ -784,7 +913,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 168, "id": "9de3fe6a-9abf-4e11-aad1-e54c891567bb", "metadata": {}, "outputs": [], @@ -793,6 +922,14 @@ "vectorizer = CountVectorizer()" ] }, + { + "cell_type": "markdown", + "id": "99ee6cf8", + "metadata": {}, + "source": [ + "Este código crea un objeto CountVectorizer, que se usa para transformar texto en una matriz que cuenta cuántas veces aparece cada palabra en un conjunto de documentos." + ] + }, { "cell_type": "markdown", "id": "1b5a7d0d-0bfc-4fb9-8e5f-e91e39797fb5", @@ -805,7 +942,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 169, "id": "da1bbad4-bb1a-4b92-9096-6e17558b4a42", "metadata": {}, "outputs": [], @@ -814,6 +951,14 @@ "test_count = vectorizer.fit_transform(test)" ] }, + { + "cell_type": "markdown", + "id": "e0af3678", + "metadata": {}, + "source": [ + "Este código toma la lista de textos test, ajusta el CountVectorizer a esos datos y los transforma en una matriz donde se cuentan las palabras de cada texto, creando así una matriz de términos (DTM)." + ] + }, { "cell_type": "markdown", "id": "324d3b65-4e98-48bf-87d2-399457f4939c", @@ -826,18 +971,18 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 170, "id": "cb044001-8eb2-4489-b025-2d8e2d4bfee2", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "<4x8 sparse matrix of type ''\n", - "\twith 9 stored elements in Compressed Sparse Row format>" + "" ] }, - "execution_count": 17, + "execution_count": 170, "metadata": {}, "output_type": "execute_result" } @@ -846,6 +991,14 @@ "test_count" ] }, + { + "cell_type": "markdown", + "id": "85c8890a", + "metadata": {}, + "source": [ + "test_count es una matriz que contiene el conteo de palabras para cada texto de la lista test. Cada fila representa un texto y cada columna una palabra, mostrando cuántas veces aparece cada palabra en cada texto." + ] + }, { "cell_type": "markdown", "id": "f9817b09-a806-42c4-9436-822cc27a38b9", @@ -858,7 +1011,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 171, "id": "bb03a238-87d8-40c9-b20e-66e7c9b6576b", "metadata": {}, "outputs": [ @@ -871,7 +1024,7 @@ " [0, 1, 0, 0, 0, 0, 0, 1]])" ] }, - "execution_count": 18, + "execution_count": 171, "metadata": {}, "output_type": "execute_result" } @@ -881,6 +1034,14 @@ "test_count.todense()" ] }, + { + "cell_type": "markdown", + "id": "738cae5a", + "metadata": {}, + "source": [ + "Ese código convierte la matriz dispersa test_count (que almacena los conteos de palabras de forma eficiente) en una matriz densa completa, mostrando todos los valores explícitamente, incluidos los ceros." + ] + }, { "cell_type": "markdown", "id": "28b58a63-d7f6-4b9f-aadf-4d4fc7341336", @@ -891,7 +1052,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 172, "id": "714de5d3-e37d-4a19-9ade-3c6629e38d4e", "metadata": {}, "outputs": [ @@ -902,7 +1063,7 @@ " 'time'], dtype=object)" ] }, - "execution_count": 19, + "execution_count": 172, "metadata": {}, "output_type": "execute_result" } @@ -912,9 +1073,17 @@ "vectorizer.get_feature_names_out()" ] }, + { + "cell_type": "markdown", + "id": "ccf72d76", + "metadata": {}, + "source": [ + "Este código obtiene una lista con todas las palabras (términos) que el CountVectorizer encontró y usó para crear la matriz de conteos." + ] + }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 173, "id": "6a7729a2-ca2e-4de7-8795-74dfedb7a4d5", "metadata": {}, "outputs": [], @@ -924,6 +1093,14 @@ " columns=vectorizer.get_feature_names_out())" ] }, + { + "cell_type": "markdown", + "id": "a03a4e9b", + "metadata": {}, + "source": [ + "Este código convierte la matriz de conteos de palabras (test_count) en una tabla (DataFrame) de pandas, usando las palabras como nombres de columnas, para facilitar la visualización y análisis de los datos." + ] + }, { "cell_type": "markdown", "id": "781da407-f394-40f2-9d45-1fac39f02047", @@ -934,7 +1111,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 174, "id": "e41dd243-cd2e-43c3-80f8-5eaab6e64210", "metadata": {}, "outputs": [ @@ -1026,7 +1203,7 @@ "3 0 1 0 0 0 0 0 1" ] }, - "execution_count": 21, + "execution_count": 174, "metadata": {}, "output_type": "execute_result" } @@ -1035,6 +1212,14 @@ "test_dtm" ] }, + { + "cell_type": "markdown", + "id": "8dc28b51", + "metadata": {}, + "source": [ + "test_dtm guarda y muestra la tabla con los conteos de palabras para cada texto." + ] + }, { "cell_type": "markdown", "id": "d59a03b4-94fa-4fe7-8f5d-7280e31b9bc4", @@ -1053,7 +1238,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 175, "id": "783e44a4-4a22-4290-b222-282b02c080dc", "metadata": {}, "outputs": [], @@ -1066,9 +1251,17 @@ " max_features=None)" ] }, + { + "cell_type": "markdown", + "id": "2ad12bc9", + "metadata": {}, + "source": [ + "Este código crea un objeto CountVectorizer que convierte texto a minúsculas y cuenta todas las palabras sin eliminar ninguna, incluyendo todas las que aparecen al menos en un documento y sin límite en la cantidad de palabras." + ] + }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 176, "id": "f85e76ea-bc54-4775-bcda-432a03d2c96f", "metadata": { "scrolled": true @@ -1077,24 +1270,33 @@ { "data": { "text/plain": [ - "<11541x8751 sparse matrix of type ''\n", - "\twith 191139 stored elements in Compressed Sparse Row format>" + "" ] }, - "execution_count": 23, + "execution_count": 176, "metadata": {}, "output_type": "execute_result" } ], "source": [ + "\n", "# Fit and transform to create DTM\n", "counts = vectorizer.fit_transform(tweets['text_processed'])\n", "counts" ] }, + { + "cell_type": "markdown", + "id": "1085cde8", + "metadata": {}, + "source": [ + "Este código ajusta el CountVectorizer al texto procesado de los tweets y lo transforma en una matriz que cuenta cuántas veces aparece cada palabra en cada tweet, creando así una matriz de términos (DTM). Luego muestra esa matriz." + ] + }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 177, "id": "87119057-c78c-4eb2-a9d6-3e9f44e4c22b", "metadata": {}, "outputs": [ @@ -1107,10 +1309,10 @@ " ...,\n", " [0, 0, 0, ..., 0, 0, 0],\n", " [0, 0, 0, ..., 0, 0, 0],\n", - " [0, 0, 0, ..., 0, 0, 0]])" + " [0, 0, 0, ..., 0, 0, 0]], shape=(11541, 8751))" ] }, - "execution_count": 24, + "execution_count": 177, "metadata": {}, "output_type": "execute_result" } @@ -1120,9 +1322,17 @@ "np.array(counts.todense())" ] }, + { + "cell_type": "markdown", + "id": "8b7d4161", + "metadata": {}, + "source": [ + "Ese código convierte la matriz dispersa counts (que guarda los conteos de palabras de forma eficiente) en una matriz densa de NumPy, donde todos los valores, incluidos los ceros, se almacenan explícitamente en memoria. Se advierte no usarlo si la memoria es limitada porque puede consumir mucho espacio." + ] + }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 178, "id": "99322b85-1a15-46a5-bb80-bb5eaa6eeb7b", "metadata": {}, "outputs": [], @@ -1131,9 +1341,17 @@ "tokens = vectorizer.get_feature_names_out()" ] }, + { + "cell_type": "markdown", + "id": "52c97206", + "metadata": {}, + "source": [ + "Este código extrae y guarda en tokens la lista de palabras (términos) que el CountVectorizer identificó y usó para crear la matriz de conteos." + ] + }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 179, "id": "43620587-3795-4434-8f1f-145c81b93706", "metadata": {}, "outputs": [ @@ -1155,6 +1373,14 @@ "print(first_dtm.shape)" ] }, + { + "cell_type": "markdown", + "id": "b7822b96", + "metadata": {}, + "source": [ + "Este código crea un DataFrame llamado first_dtm que contiene la matriz de términos con los conteos de palabras para cada tweet, usando los índices originales de los tweets y las palabras como columnas. Luego imprime las dimensiones de esa tabla (número de filas y columnas)." + ] + }, { "cell_type": "markdown", "id": "2dd257d5-4244-436c-afe7-5688232caf8f", @@ -1165,7 +1391,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 180, "id": "bb3604ec-d909-4238-9a3f-67e7d4ae2ac5", "metadata": {}, "outputs": [ @@ -1357,7 +1583,7 @@ "[5 rows x 8751 columns]" ] }, - "execution_count": 27, + "execution_count": 180, "metadata": {}, "output_type": "execute_result" } @@ -1366,6 +1592,14 @@ "first_dtm.head()" ] }, + { + "cell_type": "markdown", + "id": "cc954b57", + "metadata": {}, + "source": [ + "first_dtm.head() muestra las primeras cinco filas del DataFrame first_dtm, para que puedas ver un resumen inicial de la matriz de conteos de palabras." + ] + }, { "cell_type": "markdown", "id": "095d34e2-52f8-4419-b4c7-ed20dbd5df89", @@ -1378,7 +1612,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 181, "id": "f432154a-eae0-4723-a797-55f3cfdd71c4", "metadata": {}, "outputs": [ @@ -1398,7 +1632,7 @@ "dtype: int64" ] }, - "execution_count": 28, + "execution_count": 181, "metadata": {}, "output_type": "execute_result" } @@ -1408,29 +1642,37 @@ "first_dtm.sum().sort_values(ascending=False).head(10)" ] }, + { + "cell_type": "markdown", + "id": "28e85a62", + "metadata": {}, + "source": [ + "Este código suma la cantidad total de cada palabra en todos los tweets, ordena esas sumas de mayor a menor, y muestra las 10 palabras más frecuentes." + ] + }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 182, "id": "26c7f1c9-dd66-49f2-b337-01253da551d2", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "_exact_ 1\n", - "mightmismybrosgraduation 1\n", - "midterm 1\n", - "midnite 1\n", - "midland 1\n", - "michelle 1\n", - "michele 1\n", - "michael 1\n", - "mhtt 1\n", - "mgmt 1\n", + "abilities 1\n", + "aboout 1\n", + "abounds 1\n", + "abroad 1\n", + "absorb 1\n", + "absorber 1\n", + "absurdity 1\n", + "abundance 1\n", + "invitational 1\n", + "invite 1\n", "dtype: int64" ] }, - "execution_count": 29, + "execution_count": 182, "metadata": {}, "output_type": "execute_result" } @@ -1440,6 +1682,14 @@ "first_dtm.sum().sort_values(ascending=True).head(10)" ] }, + { + "cell_type": "markdown", + "id": "5120937c", + "metadata": {}, + "source": [ + "Este código suma la cantidad total de cada palabra en todos los tweets, las ordena de menor a mayor, y muestra las 10 palabras menos frecuentes." + ] + }, { "cell_type": "markdown", "id": "5d230f79-e752-4e32-93db-4f013287f8e2", @@ -1452,7 +1702,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 183, "id": "efb8f4d8-4c88-4155-a6c5-c72a5b4e8bb8", "metadata": {}, "outputs": [ @@ -1493,12 +1743,12 @@ " 6\n", " \n", " \n", - " 10572\n", + " 557\n", " to\n", " 5\n", " \n", " \n", - " 8148\n", + " 10923\n", " the\n", " 5\n", " \n", @@ -1508,27 +1758,27 @@ " 5\n", " \n", " \n", - " 152\n", + " 11007\n", " to\n", " 5\n", " \n", " \n", - " 5005\n", + " 355\n", " to\n", " 5\n", " \n", " \n", - " 10923\n", - " the\n", + " 10572\n", + " to\n", " 5\n", " \n", " \n", - " 7750\n", - " to\n", + " 3126\n", + " lt\n", " 5\n", " \n", " \n", - " 355\n", + " 152\n", " to\n", " 5\n", " \n", @@ -1540,17 +1790,17 @@ " token number\n", "3127 lt 6\n", "918 worst 6\n", - "10572 to 5\n", - "8148 the 5\n", - "10742 to 5\n", - "152 to 5\n", - "5005 to 5\n", + "557 to 5\n", "10923 the 5\n", - "7750 to 5\n", - "355 to 5" + "10742 to 5\n", + "11007 to 5\n", + "355 to 5\n", + "10572 to 5\n", + "3126 lt 5\n", + "152 to 5" ] }, - "execution_count": 30, + "execution_count": 183, "metadata": {}, "output_type": "execute_result" } @@ -1570,6 +1820,14 @@ " & (counts['token']!='user')].sort_values('number', ascending=False).head(10)" ] }, + { + "cell_type": "markdown", + "id": "e18a3948", + "metadata": {}, + "source": [ + "Este código crea un DataFrame counts donde, para cada tweet, guarda la palabra que aparece más veces (token) y cuántas veces aparece esa palabra (number). Luego, filtra para eliminar palabras genéricas como \"digit\", \"hashtag\" y \"user\", y finalmente muestra los 10 tweets donde la palabra más frecuente aparece con mayor cantidad." + ] + }, { "cell_type": "markdown", "id": "7cdac4ef-6b9d-4aad-9b24-c70f6c2eb8f0", @@ -1582,7 +1840,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 184, "id": "5e7cacd8-1fb3-4f0d-a744-4ee0994a089f", "metadata": {}, "outputs": [ @@ -1592,7 +1850,7 @@ "\"@united is the worst. Worst reservation policies. Worst costumer service. Worst worst worst. Congrats, @Delta you're not that bad!\"" ] }, - "execution_count": 31, + "execution_count": 184, "metadata": {}, "output_type": "execute_result" } @@ -1602,6 +1860,14 @@ "tweets.iloc[918]['text']" ] }, + { + "cell_type": "markdown", + "id": "b041dd04", + "metadata": {}, + "source": [ + "Este código accede al tweet número 918 (según el índice del DataFrame tweets) y muestra el contenido de su columna 'text', es decir, el texto original de ese tweet." + ] + }, { "cell_type": "markdown", "id": "3dba8e37-4880-4565-b6fc-7e7c96958f0f", @@ -1622,7 +1888,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 185, "id": "37a0a93e-9dd8-43dc-a82c-06a24bf02bc9", "metadata": {}, "outputs": [], @@ -1635,9 +1901,17 @@ " max_features=None)" ] }, + { + "cell_type": "markdown", + "id": "4b0f87a7", + "metadata": {}, + "source": [ + "Este código crea un CountVectorizer con ajustes que limpian y filtran el texto: convierte todo a minúsculas, elimina palabras comunes en inglés, descarta las que aparecen en muy pocos o en casi todos los tweets, y se enfoca solo en las palabras más útiles para el análisis." + ] + }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 186, "id": "b53e5ecf-7be3-4915-9d11-fd3edb913400", "metadata": {}, "outputs": [], @@ -1652,6 +1926,14 @@ " columns=tokens)" ] }, + { + "cell_type": "markdown", + "id": "46fe75b4", + "metadata": {}, + "source": [ + "Este código transforma los tweets ya procesados en una nueva matriz de conteos de palabras (DTM) usando el CountVectorizer con configuraciones personalizadas. Luego, crea un DataFrame llamado second_dtm que contiene esa matriz, con los tweets como filas y las palabras como columnas." + ] + }, { "cell_type": "markdown", "id": "6d2e66bc-2eaa-4642-8848-74459948084b", @@ -1662,7 +1944,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 187, "id": "570fb598-fa81-4111-9e36-7172d8034713", "metadata": {}, "outputs": [ @@ -1680,9 +1962,17 @@ "print(second_dtm.shape)" ] }, + { + "cell_type": "markdown", + "id": "faa97d69", + "metadata": {}, + "source": [ + "Este código imprime las dimensiones (número de filas y columnas) de las dos matrices de términos (first_dtm y second_dtm), permitiendo comparar cuántos tweets y palabras contiene cada una." + ] + }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 188, "id": "d8deabb2-20eb-4047-b592-48cb1564fd2a", "metadata": {}, "outputs": [ @@ -1874,7 +2164,7 @@ "[5 rows x 4471 columns]" ] }, - "execution_count": 35, + "execution_count": 188, "metadata": {}, "output_type": "execute_result" } @@ -1883,6 +2173,14 @@ "second_dtm.head()" ] }, + { + "cell_type": "markdown", + "id": "bf0490ad", + "metadata": {}, + "source": [ + "El código second_dtm.head() muestra las primeras cinco filas del DataFrame second_dtm, para visualizar un resumen inicial de los conteos de palabras por tweet después del procesamiento del texto." + ] + }, { "cell_type": "markdown", "id": "998fe2c3-ec90-4027-8c7f-417327a33a27", @@ -1893,7 +2191,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 189, "id": "ffa7bf4e-640b-49bc-b64b-721140f67f76", "metadata": {}, "outputs": [ @@ -1913,7 +2211,7 @@ "dtype: int64" ] }, - "execution_count": 36, + "execution_count": 189, "metadata": {}, "output_type": "execute_result" } @@ -1922,6 +2220,14 @@ "second_dtm.sum().sort_values(ascending=False).head(10)" ] }, + { + "cell_type": "markdown", + "id": "b7dd1f24", + "metadata": {}, + "source": [ + "Este código suma cuántas veces aparece cada palabra en todos los tweets, ordena esas palabras de mayor a menor frecuencia y muestra las 10 más usadas en el DataFrame second_" + ] + }, { "cell_type": "markdown", "id": "3e8b5145-d505-4e36-9a39-a40d25d8ec6f", @@ -1945,7 +2251,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 190, "id": "da610560-62c3-48ab-a1b2-25e0b589bc61", "metadata": {}, "outputs": [], @@ -1955,9 +2261,17 @@ "nlp = spacy.load('en_core_web_sm')" ] }, + { + "cell_type": "markdown", + "id": "4aed19fd", + "metadata": {}, + "source": [ + "Ese fragmento prepara spaCy para procesar texto en inglés, cargando un modelo pequeño que permite analizar y entender las palabras de forma más profunda, como encontrar la raíz de cada palabra, reconocer partes del habla, entre otras tareas de procesamiento de lenguaje natural.// se instala paquete " + ] + }, { "cell_type": "code", - "execution_count": null, + "execution_count": 191, "id": "98ead266-30f3-48ad-bc51-c1685487f000", "metadata": { "scrolled": true @@ -1969,14 +2283,14 @@ " '''Lemmatize the text input with spaCy annotations.'''\n", "\n", " # Step 1: Initialize an empty list to hold lemmas\n", - " lemma = ...\n", + " lemma = []\n", "\n", " # Step 2: Apply the nlp pipeline to input text\n", - " doc = ...\n", + " doc = nlp(text)\n", "\n", " # Step 3: Iterate over tokens in the text to get the token lemma\n", " for token in doc:\n", - " lemma.append(...)\n", + " lemma.append(token.lemma_)\n", "\n", " # Step 4: Join lemmas together into a single string\n", " text_lemma = ' '.join(lemma)\n", @@ -1984,6 +2298,14 @@ " return text_lemma" ] }, + { + "cell_type": "markdown", + "id": "434025a5", + "metadata": {}, + "source": [ + "Este código define una función llamada lemmatize_text que usa spaCy para transformar un texto dado en su forma base o raíz (lematización). La función procesa el texto, extrae la raíz de cada palabra y luego junta esas raíces en un nuevo texto, facilitando el análisis más preciso del lenguaje." + ] + }, { "cell_type": "markdown", "id": "cf36aab6-35dd-42a2-9b38-b7c432f021c6", @@ -1994,7 +2316,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 192, "id": "742e82bb-5c42-4fa8-9101-5a0ea908db25", "metadata": {}, "outputs": [ @@ -2002,9 +2324,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "USER wow this just blew my mind\n", + "USER wow this just blew my mind\n", "==================================================\n", - "USER wow this just blow my mind\n" + "USER wow this just blow my mind\n" ] } ], @@ -2015,6 +2337,14 @@ "print(lemmatize_text(tweets.iloc[33]['text_processed']))" ] }, + { + "cell_type": "markdown", + "id": "3a0f2285", + "metadata": {}, + "source": [ + "Este código toma el texto procesado del tweet número 33, lo imprime, luego imprime una línea de separación, y después muestra el mismo tweet pero con las palabras convertidas a su forma base usando la función de lematización lemmatize_text. Así puedes comparar el texto original procesado con su versión lematizada." + ] + }, { "cell_type": "markdown", "id": "bbeda987-dc32-4979-b158-c24be7d1a420", @@ -2025,7 +2355,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 193, "id": "1ac128d2-1be5-4ef5-bb50-5b8d44ef8ee9", "metadata": {}, "outputs": [], @@ -2034,6 +2364,14 @@ "tweets['text_lemmatized'] = tweets['text_processed'].apply(lambda x: lemmatize_text(x))" ] }, + { + "cell_type": "markdown", + "id": "094fbff7", + "metadata": {}, + "source": [ + "Este código crea una nueva columna llamada 'text_lemmatized' en el DataFrame tweets, donde cada tweet ya procesado (text_processed) se transforma aplicando la función lemmatize_text para convertir las palabras a su forma base o raíz." + ] + }, { "cell_type": "markdown", "id": "2c02aad6-4e71-4afc-80cf-31d4f39498b2", @@ -2044,7 +2382,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 194, "id": "5f49d790-3c9d-4dc1-a5c9-72c306630412", "metadata": {}, "outputs": [ @@ -2215,7 +2553,7 @@ " \n", " \n", "\n", - "

5 rows × 3553 columns

\n", + "

5 rows × 3570 columns

\n", "" ], "text/plain": [ @@ -2233,10 +2571,10 @@ "3 0 0 0 0 0 0 0 0 0 0 \n", "4 0 0 0 0 0 0 0 0 0 0 \n", "\n", - "[5 rows x 3553 columns]" + "[5 rows x 3570 columns]" ] }, - "execution_count": 41, + "execution_count": 194, "metadata": {}, "output_type": "execute_result" } @@ -2260,9 +2598,17 @@ "third_dtm.head()" ] }, + { + "cell_type": "markdown", + "id": "1537bfb3", + "metadata": {}, + "source": [ + "Este código crea un nuevo CountVectorizer configurado para procesar texto en minúsculas, eliminar palabras comunes en inglés y filtrar palabras poco frecuentes o demasiado comunes. Luego, aplica este vectorizador al texto lematizado de los tweets para generar una matriz de conteos de palabras (DTM). Finalmente, convierte esta matriz en un DataFrame llamado third_dtm con los tweets como filas y las palabras como columnas, y muestra las primeras cinco filas." + ] + }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 195, "id": "9859eb04-dbd2-4fa0-9798-65ed7496c297", "metadata": {}, "outputs": [ @@ -2272,7 +2618,7 @@ "text": [ "(11541, 8751)\n", "(11541, 4471)\n", - "(11541, 3553)\n" + "(11541, 3570)\n" ] } ], @@ -2283,6 +2629,14 @@ "print(third_dtm.shape)" ] }, + { + "cell_type": "markdown", + "id": "c3ae5a40", + "metadata": {}, + "source": [ + "Este código imprime las dimensiones (número de filas y columnas) de las tres matrices de términos (first_dtm, second_dtm y third_dtm), para comparar cuántos tweets y palabras contiene cada una tras diferentes etapas de procesamiento." + ] + }, { "cell_type": "markdown", "id": "fa94c8ac-e4f4-4b76-afdb-1d4af54a3eee", @@ -2293,7 +2647,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 196, "id": "5745ca29-97ed-4fe1-81db-7e402c8da674", "metadata": {}, "outputs": [ @@ -2301,19 +2655,19 @@ "data": { "text/plain": [ "digit 6927\n", - "flight 4043\n", + "flight 3952\n", "hashtag 2633\n", "thank 1455\n", "hour 1134\n", - "cancel 948\n", - "delay 937\n", - "service 937\n", + "cancel 954\n", + "service 939\n", + "delay 933\n", "customer 902\n", - "time 856\n", + "time 858\n", "dtype: int64" ] }, - "execution_count": 43, + "execution_count": 196, "metadata": {}, "output_type": "execute_result" } @@ -2323,9 +2677,17 @@ "third_dtm.sum().sort_values(ascending=False).head(10)" ] }, + { + "cell_type": "markdown", + "id": "d7cce274", + "metadata": {}, + "source": [ + "Este fragmento de código suma la cantidad total de apariciones de cada palabra en la matriz third_dtm, ordena las palabras de mayor a menor frecuencia y muestra las 10 palabras más comunes en el texto lematizado." + ] + }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 197, "id": "16c63e6a-50c3-448a-9a56-a1d193cd6680", "metadata": {}, "outputs": [ @@ -2345,7 +2707,7 @@ "dtype: int64" ] }, - "execution_count": 44, + "execution_count": 197, "metadata": {}, "output_type": "execute_result" } @@ -2355,6 +2717,14 @@ "second_dtm.sum().sort_values(ascending=False).head(10)" ] }, + { + "cell_type": "markdown", + "id": "0ff2d3a5", + "metadata": {}, + "source": [ + "Este código suma cuántas veces aparece cada palabra en la matriz second_dtm, ordena esas palabras de mayor a menor frecuencia y muestra las 10 más frecuentes, para comparar con las palabras más comunes en la versión lematizada (third_dtm)." + ] + }, { "cell_type": "markdown", "id": "38363398-fdf5-456b-ae3d-cae9d5294140", @@ -2377,7 +2747,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 198, "id": "f5e32d8a-c42d-475f-aab4-21eca8b1aee8", "metadata": {}, "outputs": [], @@ -2385,9 +2755,17 @@ "from sklearn.feature_extraction.text import TfidfVectorizer" ] }, + { + "cell_type": "markdown", + "id": "f5304756", + "metadata": {}, + "source": [ + "Este código importa la clase TfidfVectorizer de la biblioteca scikit-learn, que se utiliza para convertir texto en una matriz numérica basada en la frecuencia y relevancia de las palabras, destacando términos importantes en lugar de solo contar apariciones." + ] + }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 199, "id": "d23916c1-5693-456c-b71d-6d9d78d1e2e4", "metadata": {}, "outputs": [], @@ -2400,20 +2778,28 @@ " max_features=None)" ] }, + { + "cell_type": "markdown", + "id": "f79825c8", + "metadata": {}, + "source": [ + "Este código crea un objeto TfidfVectorizer que transformará textos en vectores numéricos usando la técnica TF-IDF, que resalta palabras importantes ignorando las muy comunes o muy raras. Además, convierte todo a minúsculas, elimina palabras comunes en inglés y solo considera palabras que aparecen en al menos 2 documentos pero no en más del 95%." + ] + }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 200, "id": "7af5b342-ab18-4766-9561-e38e50cd1e9b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "<11541x3553 sparse matrix of type ''\n", - "\twith 88287 stored elements in Compressed Sparse Row format>" + "" ] }, - "execution_count": 47, + "execution_count": 200, "metadata": {}, "output_type": "execute_result" } @@ -2426,7 +2812,7 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 201, "id": "55e509c8-5402-4be0-9143-0e448fff7066", "metadata": {}, "outputs": [ @@ -2597,7 +2983,7 @@ " \n", " \n", "\n", - "

5 rows × 3553 columns

\n", + "

5 rows × 3570 columns

\n", "" ], "text/plain": [ @@ -2615,10 +3001,10 @@ "3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", "4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", "\n", - "[5 rows x 3553 columns]" + "[5 rows x 3570 columns]" ] }, - "execution_count": 48, + "execution_count": 201, "metadata": {}, "output_type": "execute_result" } @@ -2631,6 +3017,14 @@ "tfidf.head()" ] }, + { + "cell_type": "markdown", + "id": "78165e7d", + "metadata": {}, + "source": [ + "Este código convierte la matriz TF-IDF dispersa (tf_dtm) en un DataFrame de pandas con filas que representan tweets y columnas que representan palabras, usando las palabras extraídas por el vectorizador como nombres de columnas. Luego muestra las primeras cinco filas del DataFrame para visualizarlo." + ] + }, { "cell_type": "markdown", "id": "45ba13ea-c429-4ff1-a9a2-abf27c4d0888", @@ -2657,7 +3051,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 202, "id": "995b511a-d448-4cfb-a6a0-22a465efd8a8", "metadata": {}, "outputs": [ @@ -2675,10 +3069,10 @@ "zone 3177\n", "zoom 3920\n", "zurich 10622\n", - "Length: 3553, dtype: int64" + "Length: 3570, dtype: int64" ] }, - "execution_count": 49, + "execution_count": 202, "metadata": {}, "output_type": "execute_result" } @@ -2688,6 +3082,14 @@ "tfidf.idxmax()" ] }, + { + "cell_type": "markdown", + "id": "d2988eb8", + "metadata": {}, + "source": [ + "Este código obtiene, para cada columna (es decir, para cada palabra), el índice del documento (por ejemplo, el tweet) donde esa palabra tiene el valor TF-IDF más alto, es decir, donde la palabra es más relevante o destacada según esa métrica." + ] + }, { "cell_type": "markdown", "id": "fccc0249-7c68-42ee-8290-ff41715e346b", @@ -2698,17 +3100,17 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 203, "id": "09b222fb-ad8c-4767-a974-dd261370a06e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "918" + "np.int64(918)" ] }, - "execution_count": 50, + "execution_count": 203, "metadata": {}, "output_type": "execute_result" } @@ -2717,6 +3119,14 @@ "tfidf.idxmax()['worst']" ] }, + { + "cell_type": "markdown", + "id": "31d66d35", + "metadata": {}, + "source": [ + "Este código busca en el DataFrame tfidf la columna llamada 'worst' y devuelve el índice (por ejemplo, el número de tweet) del documento donde la palabra \"worst\" tiene el valor TF-IDF más alto, es decir, donde esta palabra es más relevante o destacada." + ] + }, { "cell_type": "markdown", "id": "955a48bc-dc93-481b-ba49-29876fc577fb", @@ -2727,17 +3137,17 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 204, "id": "079ee0e0-476f-4236-ba8a-615ba7a0efe8", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "\"USER is the worst. worst reservation policies. worst costumer service. worst worst worst. congrats, USER you're not that bad!\"" + "\"USER is the worst. worst reservation policies. worst costumer service. worst worst worst. congrats, USER you're not that bad!\"" ] }, - "execution_count": 51, + "execution_count": 204, "metadata": {}, "output_type": "execute_result" } @@ -2746,6 +3156,14 @@ "tweets['text_processed'].iloc[918]" ] }, + { + "cell_type": "markdown", + "id": "5d347c53", + "metadata": {}, + "source": [ + "Este código accede al tweet número 918 (usando la posición en la tabla) y muestra el texto que ha sido procesado o limpiado, que está guardado en la columna 'text_processed' del DataFrame tweets. Es decir, te muestra el contenido del tweet ya preparado para análisis." + ] + }, { "cell_type": "markdown", "id": "9dd06bbc-e2fc-49e4-9354-efdaca5cfbd3", @@ -2756,17 +3174,17 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 205, "id": "f809df1a-1178-4272-a415-42edb20173b2", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "5945" + "np.int64(5945)" ] }, - "execution_count": 52, + "execution_count": 205, "metadata": {}, "output_type": "execute_result" } @@ -2775,19 +3193,27 @@ "tfidf.idxmax()['cancel']" ] }, + { + "cell_type": "markdown", + "id": "a3276cd9", + "metadata": {}, + "source": [ + "Este código obtiene el índice del documento (por ejemplo, el número de tweet) donde la palabra \"cancel\" tiene el valor TF-IDF más alto en el DataFrame tfidf. En otras palabras, identifica el tweet donde \"cancel\" es más relevante según la puntuación TF-IDF." + ] + }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 206, "id": "8093b6a7-54ca-468a-9376-b3c0be0b6f9b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "'USER cancelled flighted 😢'" + "'USER cancelled flighted 😢'" ] }, - "execution_count": 53, + "execution_count": 206, "metadata": {}, "output_type": "execute_result" } @@ -2796,6 +3222,14 @@ "tweets['text_processed'].iloc[5945]" ] }, + { + "cell_type": "markdown", + "id": "c1bbfb6a", + "metadata": {}, + "source": [ + "Este código muestra el texto procesado (limpio y preparado para análisis) del tweet que está en la posición 5945 dentro del DataFrame tweets, es decir, te da el contenido del tweet número 5945 ya transformado y listo para trabajar con él." + ] + }, { "cell_type": "markdown", "id": "163dcecd-dc8c-43a9-952d-5bc84a307b07", @@ -2820,34 +3254,61 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 207, "id": "2bfbf838-9ff6-48b8-ad5d-5e75304fe060", "metadata": {}, "outputs": [], "source": [ "# Complete the boolean masks \n", - "positive_index = tweets[...].index\n", - "negative_index = tweets[...].index" + "positive_index = tweets[tweets['airline_sentiment'] == 'positive'].index\n", + "negative_index = tweets[tweets['airline_sentiment'] == 'negative'].index" + ] + }, + { + "cell_type": "markdown", + "id": "4c3871f3", + "metadata": {}, + "source": [ + "El código obtiene los índices de los tweets con sentimiento positivo y negativo para poder analizarlos por separado." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 208, "id": "8c67ea1f-de9e-49a9-94f2-a3351446e364", "metadata": {}, "outputs": [], "source": [ "# Complete the following two lines\n", - "pos = tfidf.loc[...].mean().sort_values(...).head(...)\n", - "neg = tfidf.loc[...].mean().sort_values(...).head(...)" + "pos = tfidf.loc[positive_index].mean().sort_values(ascending=False).head(10)\n", + "neg = tfidf.loc[negative_index].mean().sort_values(ascending=False).head(10)" + ] + }, + { + "cell_type": "markdown", + "id": "2bf0892c", + "metadata": {}, + "source": [ + "Este código calcula los 10 términos con mayor promedio de TF-IDF en los tweets positivos y negativos, respectivamente, para identificar las palabras más representativas de cada sentimiento." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 209, "id": "f1e29043-8c78-4e41-81d2-b4552030b457", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnEAAAGzCAYAAABARUEaAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAASbNJREFUeJzt3Qm8TfX+//HPMRzzdJB5iGQMGa8hVIpCNCKFBipFGoTbZEjqhkjz6d50S7dJVBopJEkkQ0IyRDelyTmkjOv/eH/vb+3/3ts5xzk49ln7vJ6Px+bstdde67um7/qs77QTPM/zDAAAAIGSJ9YJAAAAQNYRxAEAAAQQQRwAAEAAEcQBAAAEEEEcAABAABHEAQAABBBBHAAAQAARxAEAAAQQQRwAAEAAEcQhrowaNcoSEhKyNO8vv/xyXNMwf/58t9zXXnvtuC73WNbTv39/q169+lGtR98tWrToUX0X2WPp0qXWunVrK1KkiDsHVqxYcczXg+bT/Eeznuw6t/V/TnTgwAG74447rEqVKpYnTx7r0aOHxZtp06a5Y7Bly5bAH694FndBnE6kzLxOxMn2xBNP2KWXXmpVq1Z169TNMD07d+60gQMHWtmyZV2GeeaZZ9ry5csztZ7HH3/cXXBI2/3332+zZs067st98cUXbfLkycd9uTDbs2ePCyhy800hvfN2//79Ll/57bff7OGHH7bnn3/eqlWrdtzXf6LWE0T/+te/7KGHHrJLLrnEnnvuObvlllssN8hp95qvv/7a5ROZCTRjJdvvE16cef755yNe55xzjn4b9rDpP/74Y7anpVq1al5SUpLXuXNnL1++fF6/fv3SnO/gwYNe69atvSJFinijRo3yHn30Ua9evXpesWLFvG+++eaI66lfv77Xvn37bNiC4Nm/f7/3559/RkzTfk1r3997773u3Pj555+Pal1dunRxxzjavHnz3HJfffVVLztlZT379u3z/vrrr6Naj/ad9uGJpGOibdMxyq3SO2/Xrl3r9k1ycvJRXQ/pid7fWVlPdp3b+j8n6tmzp1epUiUvnh04cMCdO4cOHTrivUb3MM2r/0+kV199NUefJxndJ46XfBZnrrjiioj3n332mc2ZM+ew6SfCggULQqVwGVVHqTrs008/tVdffdU92clll11mp556qt17770uko9FdcGhQ4csMTHRgiRfvnzuhUj58+ePdRJwnOzYscP9X7JkyWy9HrKyntxG++Z47hfltfv27bOCBQtaTpE3b173ygxVKeektOcqXpy78cYbXaQebvfu3d6tt97qVa5c2UtMTPROPfVU76GHHop44hB9T99/4YUX3DwFChTwmjRp4i1YsOC4PVXLpZde6pUrV+6wp5iBAwd6hQsXzrAERRG+0hn+Cn9S+v33372bb745tK01a9b0HnjggYh1bd682X1P++Dhhx/2atSo4eXJk8f78ssvQ6VV69ev9/r06eMVL17cK1OmjHfXXXe5/bV161bvggsucKWG2oYJEyYclsZHHnnElSwWKlTIK1mypNe0aVNv+vTp6W6Tllu6dGnvlltuCU1TekuUKOHSpW3yaVvy5s3r7dq1y7330+uL3jd6+cfBn3fDhg1umpav7evfv7/3xx9/eBnRPo5erv+05ZcivPzyy959993nnth17px11lluXdE+++wzr1OnTm7d2kft2rXzPvnkkwzXn9X1aPuinwZ/+eUX74orrnDHTtvet29fb8WKFW6Zzz77bMR3df5+//33Xvfu3d3fOgduu+0297QeTsdJ55COt9Jy0kknufP4t99+i5hv6dKl3rnnnuuOc8GCBb3q1at7V111VcT5GP3KqFRO6dU8Cxcu9AYPHuzSp23Suvfu3evOmSuvvNKdf3oNGzbssOs9s2mfNWuWd/7553sVKlRw15SulzFjxhy2L3SOqORizZo1XocOHdyxrVixovfggw8e4cimf97qldH1Hi36ehDlJ0OHDnX7qGjRol63bt28bdu2RezjrKxHx1KfT5s27bDP3nvvPffZW2+95d5v2bLFu+GGG1x+quOumopLLrnEHfMjlcTp/E0rD1W6otOmbbznnntcfqdjpPxPxzw6L/3ggw+8Nm3auHNF57XSNXLkyHT3Z3rnpp/Oo7m36HxTTc3MmTPTXa+2XSU677//vteoUSN3ftatW9ebMWPGYfNu3LjR7dNSpUq5c65ly5be7Nmzs5wv+9eUf2wyutdEHy9tm/ZnWvlor1693L0i/Hp55513vLZt27r7nc5JXV9fffVVuvsjPH2WxrHQvUPnVvh+v+mmm9znU6ZMCU1TjZymPf7441k+d0S1eooJdC5rf6uEVvfEzNwnMnMMMiPXBXE6qLrJJSQkeNdee62rulQmpnmUsYXTtAYNGrjM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sKFDh8Y6GQAAACdU4IM4AACA3IggDgAAIIDiKoj7/fffrW/fvlaqVCkrXLiwnXfeebZhwwb3WWpqqhUqVMjefffdiO/MnDnTihUrZnv27HHvt23bZpdddpmVLFnSkpKSrHv37rZly5aYbA8AAECuCOL69+9vy5YtszfffNMWL15snufZ+eefb/v377fixYtb165d7cUXX4z4zvTp061Hjx4u6NN8nTp1ckHdwoULbdGiRVa0aFHr3Lmz7du3L9317t271wWJ4S8AAIDsFDdBnErcFLw988wzdsYZZ1ijRo1cgPbf//7XZs2a5ebp06eP+9svdVOw9fbbb7vp8vLLL9uhQ4fcMk477TSrW7euPfvss7Z161abP39+uuseP368lShRIvSqUqXKCdpqAACQW8VNELd27VrLly+ftWzZMjStdOnSVrt2bfeZqFQuf/78LtiTGTNmuBK6jh07uvcrV660b7/91pXEqQROL1Wp/vXXX7Zx48Z01z1y5EhLSUkJvVQlCwAAkJ1y1c9uJSYm2iWXXOKqVHv16uX+79mzpwv+ZPfu3da0aVNXghetbNmy6S63QIEC7gUAAHCixE0Qp6rPAwcO2JIlS6x169Zu2q+//mrr16+3evXqheZT1ek555xja9assY8++sjuu+++0GdNmjRxVaonnXSSK6EDAADIqeKmOrVWrVquJ+mAAQPsk08+cVWjV1xxhVWqVMlN97Vr187Kly/vgrmTTz45ovpV08qUKePmV8eGzZs3u7ZwQ4YMse+//z5GWwYAABDHQZyoE4KqQ9ULtVWrVq536jvvvOPawfkSEhKsd+/eLsjzOzT41EP1448/tqpVq9pFF13kSveuueYa1yaOkjkAAJCTJHiKdHBcqdereqn2nbDZEgvlruAveVBSrJMAAMBR8e/f6qQYhMKbuCqJAwAAyC0I4gAAAAIobnqn5kRTByQFojgWAAAEDyVxAAAAAUQQBwAAEEAEcQAAAAFEEAcAABBABHEAAAABRBAHAAAQQARxAAAAAUQQBwAAEEAEcQAAAAFEEAcAABBABHEAAAABRBAHAAAQQARxAAAAAUQQBwAAEEAEcQAAAAFEEAcAABBABHEAAAABRBAHAAAQQPlinYB4Njj5N0ssdCDWyQiE5EFJsU4CAACBQkkcAABAABHEAQAABBBBHAAAQAAFJojzPM8GDhxoSUlJlpCQYCVLlrShQ4eGPq9evbpNnjw508vbsmWLW86KFSuyKcUAAADZJzBB3HvvvWfTpk2z2bNn2/bt261BgwYRny9dutQFeceT1qdgEQAAIKcJTO/UjRs3WoUKFax169bufb58kUkvW7ZsjFIGAABw4gWiJK5///42ePBg27p1q6sCVdVptOjq1HXr1lnbtm2tYMGCVq9ePZs7d6777qxZsyK+t2nTJjvzzDOtcOHC1qhRI1u8eLGbPn/+fLvqqqssJSXFfU+vUaNGnYCtBQAAiJMgbsqUKTZmzBirXLmyq0pV1WlGDh48aD169HCB2ZIlS+zpp5+2O++8M815Nf322293beNOPfVU6927tx04cMCV+CkoLF68uFunXpovLXv37rXU1NSIFwAAgOX26tQSJUpYsWLFLG/evFa+fPkjzj9nzhxX/arSNH/+cePG2TnnnHPYvArMunTp4v4ePXq01a9f37799lurU6eOW69K4I60zvHjx7vvAgAAnCiBKInLqvXr11uVKlUigq8WLVqkOW/Dhg1Df6vNnezYsSNL6xs5cqSrdvVf27ZtO+q0AwAAxE1JXHbKnz9/6G+VusmhQ4eytIwCBQq4FwAAwIkSlyVxtWvXdqVhP/30U2jakdrRpSUxMdG1rwMAAMhp4jKIU9u3mjVrWr9+/WzVqlW2aNEiu+uuuyJK2zJDPV53795tH374of3yyy+2Z8+ebEw1AABALg/i1AFCQ4koAGvevLlde+21od6pGnIks9RD9frrr7eePXu6cej+8Y9/ZGOqAQAAMi/B0+9Z5QIqjdO4cep5qlK67KQhRtSzte+EzZZYqHi2riteJA9KinUSAAC5XOr/3b/VSVFDjOV0cduxYebMmVa0aFGrVauWC9xuvvlma9OmTbYHcAAAACdC3AZxu3btsuHDh7tfeShTpox17NjRJk6cGOtkAQAAHBe5pjr1RApacSwAALDA3b/jsmMDAABAvCOIAwAACCCCOAAAgAAiiAMAAAgggjgAAIAAIogDAAAIIII4AACAACKIAwAACCCCOAAAgAAiiAMAAAgggjgAAIAAIogDAAAIIII4AACAACKIAwAACCCCOAAAgAAiiAMAAAgggjgAAIAAIogDAAAIoHyxTkA8G5z8myUWOhDrZARG8qCkWCcBAIDAoCQOAAAggAjiAAAAAoggDgAAIIAI4o5g/vz5lpCQYDt37ox1UgAAAEII4gAAAAKIIC4D+/fvj3USAAAA0pSrgrjq1avb5MmTI6Y1btzYRo0a5f5WtekTTzxhF1xwgRUpUsTGjRsXo5QCAABkLFcFcZmhgO7CCy+01atX29VXX52p7+zdu9dSU1MjXgAAANmJIC7K5ZdfbldddZXVqFHDqlatmqnvjB8/3kqUKBF6ValSJdvTCQAAcjeCuCjNmjXL8ndGjhxpKSkpode2bduyJW0AAAC58me38uTJY57nZdh5QW3hsqpAgQLuBQAAcKLkqpK4smXL2vbt20Pv1XZt8+bNMU0TAADA0chVQdxZZ51lzz//vC1cuNB1XOjXr5/lzZs31skCAADIslxVnaq2ayp569q1q+uAMHbsWEriAABAICV40Y3EcMxUTasgse+EzZZYqHiskxMYyYOSYp0EAEAulvp/9291UixePOffv3NVdSoAAEC8IIgDAAAIoFzVJu5EmzogKRDFsQAAIHgoiQMAAAgggjgAAIAAIogDAAAIIII4AACAACKIAwAACCCCOAAAgAAiiAMAAAgggjgAAIAAIogDAAAIIII4AACAACKIAwAACCCCOAAAgAAiiAMAAAgggjgAAIAAIogDAAAIIII4AACAACKIAwAACCCCOAAAgADKF+sExLPByb9ZYqEDsU5G3EkelBTrJAAAEHOUxAEAAAQQQRwAAEAAEcQBAAAEEEFcJlSvXt0mT54c62QAAACEEMQBAAAEEEEcAABAAAUqiNu1a5f16dPHihQpYhUqVLCHH37YOnToYEOHDnWf//7779a3b18rVaqUFS5c2M477zzbsGFDxDJmzJhh9evXtwIFCrhq0okTJ0Z8vmPHDuvWrZsVKlTITj75ZJs+ffoJ3UYAAIC4C+JuvfVWW7Rokb355ps2Z84cW7hwoS1fvjz0ef/+/W3ZsmXu88WLF5vneXb++efb/v373edffPGFXXbZZdarVy9bvXq1jRo1yu6++26bNm1axDK2bdtm8+bNs9dee80ef/xxF9hlZO/evZaamhrxAgAAyE75glQK99xzz9mLL75oZ599tpv27LPPWsWKFd3fKnFT8KYgr3Xr1m6aStGqVKlis2bNsksvvdQmTZrkvqvATU499VT7+uuv7aGHHnLB2zfffGPvvvuuff7559a8eXM3zz//+U+rW7duhmkbP368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8803bc6cObZw4UJbvnx5xDwTJkywRo0a2Zdffml33323bdy40Tp37mwXX3yxrVq1yl5++WUX1N10002h7+zfv98FfytXrrRZs2a5wM0P1BT0zZgxw/29fv162759u02ZMiXN9O3du9dSU1MjXgAAANkpwfM8z3J4KVzp0qXtxRdftEsuucRNS0lJsYoVK9qAAQNs8uTJriTu9NNPt5kzZ4a+d+2111revHntqaeeCk1TENe+fXtXGlewYMHD1rVs2TJr3ry5W2fRokVdmziVxv3+++9WsmTJdNM4atQoGz169GHT+07YbImFih+HvYCjxWC/AIDMUiFMiRIlXJyhmr2cLseXxG3atMmVmLVo0SI0TTu4du3aEfOpWjScStemTZvmgjH/1alTJzt06JBt3rzZzfPFF19Yt27drGrVqq5KVQGebN26NUtpHDlypDvg/mvbtm3HsMUAAAC56Ge31F4u3O7du+26665z7eCiKWhTaZyCOr2mT59uZcuWdcGb3me1Y0SBAgXcCwAA4ETJ8UFcjRo1LH/+/LZ06VIXfIlKu7755htr165dut9r0qSJff3113bKKaek+fnq1avt119/tQceeMC1f/OrU8MlJia6/w8ePHgctwgAACAXVKeqmrNfv342bNgwmzdvnq1Zs8auueYay5Mnj+sxmp7hw4fbp59+6joyrFixwjZs2GBvvPFGqGODAkIFaVOnTnVVtuo0oU4O4apVq+bWMXv2bPv5559d6R4AAEBOkOODOJk0aZK1atXKunbtah07drQ2bdpY3bp10+yc4GvYsKEtWLDAldhpmBF1fLjnnntchwhR9anazL366qtWr149VyKnHq7hKlWq5DosjBgxwsqVKxfRsxUAACCWcnzv1LSoPZsCrIkTJ7pSuZzau4XeqbFH71QAQLz2Ts3xbeJEY7+tW7fO9VDVjh0zZoyb3r1791gnDQAAICYCEcSJqjo16K7asTVt2tQN+FumTJlYJwsAACAmAlmdmtMFrTgWAABY4O7fgejYAAAAgEgEcQAAAAFEEAcAABBABHEAAAABRBAHAAAQQARxAAAAAUQQBwAAEEAEcQAAAAFEEAcAABBABHEAAAABRBAHAAAQQARxAAAAAUQQBwAAEEAEcQAAAAFEEAcAABBABHEAAAABRBAHAAAQQARxAAAAAZQv1gmIZ4OTf7PEQgdinQzEieRBSbFOAgAgB6EkDgAAIIAI4gAAAAKIIA4AACCAsiWI69Chgw0dOjQ7Fm3z58+3hIQE27lzZ7YsHwAAIAjisiRu1KhR1rhx41gnAwAAINvEZRAHAAAQ77ItiDt06JDdcccdlpSUZOXLl3elY75JkybZaaedZkWKFLEqVarYoEGDbPfu3aHPv/vuO+vWrZuVKlXKzVO/fn175513Ipb/xRdfWLNmzaxw4cLWunVrW79+vZs+bdo0Gz16tK1cudJVu+qlaZlZryQnJ7vPtNwLL7zQfadkyZLZtZsAAAByVhD33HPPuWBpyZIl9o9//MPGjBljc+bM+d9K8+SxRx55xNasWePm++ijj1zA57vxxhtt79699vHHH9vq1avtwQcftKJFi0Ys/84777SJEyfasmXLLF++fHb11Ve76T179rTbbrvNBX7bt293L03LzHoXLVpk119/vd188822YsUKO+ecc2zcuHFH3FalNTU1NeIFAACQnRI8z/Oyo2PDwYMHbeHChaFpLVq0sLPOOsseeOCBw+Z/7bXXXPD0yy+/uPcNGza0iy++2O699940OzaceeaZNnfuXDv77LPdNJXSdenSxf78808rWLCgK/WbNWuWC8QyEr3eXr16uZK52bNnh+a54oor3PuMOlJofSr9i9Z3wmZLLFQ8wzQAmcVgvwCQvVJTU61EiRKWkpJixYsXz70lcQrEwlWoUMF27Njh/vYDsEqVKlmxYsXsyiuvtF9//dX27NnjPh8yZIjdd9991qZNGxfIrVq1KsPla9niLz89R1qvqmQVbIaLfp+WkSNHugPuv7Zt23bE7wAAAOTIIC5//vwR79U2Te3ktmzZYl27dnVB2IwZM1zbtscee8zNs2/fPvf/tddea5s2bXJBlqpT1fZt6tSp6S5fyxYtPz2ZWe/RKlCggIvYw18AAABx1TtVwZOCLbVn+9vf/mannnqq/fDDD4fNp84Fqup8/fXXXRs3dTjIrMTERFedm9X11q5d25YuXRoxLfo9AABATpDvRK/wlFNOsf3797uSNfVAVWeCJ598MmIeDRR83nnnuUDr999/t3nz5lndunUzvY7q1avb5s2bXZu4ypUru6rTzKx38ODB1q5dO9cjVfOo48O7774bKukDAADItSVxjRo1ckGSepw2aNDApk+fbuPHj4+YR6Vo6qGqwK1z584umHv88cczvQ51itD31AGibNmy9p///CdT61UbPAV2mk/zv/fee3bLLbe4zhIAAABx3zs1ngwYMMDWrVsX0dM2s71b6J2K44neqQCQvVID1jv1hFen5nQTJkxw48NpjDtVpWo8uayUAgIAAJwIBHFRPv/8czc48a5du6xGjRpucGD1lgUAAMhJqE7NBkErjgUAABa4+/cJ79gAAACAY0cQBwAAEEAEcQAAAAFEEAcAABBABHEAAAABRBAHAAAQQARxAAAAAUQQBwAAEEAEcQAAAAFEEAcAABBABHEAAAABRBAHAAAQQARxAAAAAUQQBwAAEEAEcQAAAAFEEAcAABBABHEAAAABRBAHAAAQQPlinYB4Njj5N0ssdCDWyQAAIGaSByXFOglxi5I4AACAACKIAwAACCCCOAAAgAAKTBA3f/58S0hIsJ07d2brerZs2eLWs2LFimxdDwAAQFwGcR06dLChQ4fGOhkAAAA5Uo4N4gAAABCwIK5///62YMECmzJliqva1EvVnPLFF19Ys2bNrHDhwta6dWtbv3596HsbN2607t27W7ly5axo0aLWvHlzmzt3bsSyq1evbvfff79dffXVVqxYMatatao9/fTT6abl4MGDbt46derY1q1bs3GrAQAAAh7EKXhr1aqVDRgwwLZv3+5eVapUcZ/deeedNnHiRFu2bJnly5fPBVi+3bt32/nnn28ffvihffnll9a5c2fr1q3bYcGXvq9AUPMMGjTIbrjhhohg0Ld371679NJLXfu4hQsXuoAvLZovNTU14gUAAJDrgrgSJUpYYmKiK20rX768e+XNm9d9Nm7cOGvfvr3Vq1fPRowYYZ9++qn99ddf7rNGjRrZddddZw0aNLBatWrZ2LFjrWbNmvbmm29GLF+BnoK3U045xYYPH25lypSxefPmRcyjgLBLly72888/u8/Kli2bbnrHjx/v0uy//IATAAAgVwVxGWnYsGHo7woVKrj/d+zYEQq8br/9dqtbt66VLFnSVamuXbv2sJK48GWoqlZBor8MX+/eve2PP/6wDz74wAVmGRk5cqSlpKSEXtu2bTsu2woAABA3QVz+/PkjAjA5dOiQ+18B3MyZM12bN1V/qhr0tNNOs3379qW7DH85/jLCS+tWrVplixcvPmKaChQoYMWLF494AQAA5MrfTlV1qjoVZMWiRYtcp4gLL7wwVDLnd4jIKrWTU7XsBRdcYG+//barwgUAAMgpcmwQp16kS5YscUGYqkWjS8rSonZwr7/+uuvMoNK1u+++O1PfS8/gwYNdINm1a1d79913rW3btke9LAAAgFxRnaqqUXVmUAcGdSrIzPAekyZNslKlSrmhRxTIderUyZo0aXJM6dCAw6NHj3bVq+pEAQAAkBMkeJ7nxToR8UZDjKgzRN8Jmy2xEO3jAAC5V/KgJAva/TslJSUQ7dtzbEkcAAAA0kcQBwAAEEA5tmNDPJg6ICkQxbEAACB4KIkDAAAIIII4AACAACKIAwAACCCCOAAAgAAiiAMAAAgggjgAAIAAIogDAAAIIMaJywb+L5np5zsAAEAwpP7ffTsov0hKEJcNfv31V/d/lSpVYp0UAABwFPdx/YZqTkcQlw2Skv73Y79bt24NxEmQ1acUBafbtm2Lu1+jYNuCiW0LrnjePrYtmFJSUqxq1aqh+3hORxCXDfLk+V9TQwVw8XaC+7RdbFvwsG3BFM/bFu/bx7YF+z6e0wUjlQAAAIhAEAcAABBABHHZoECBAnbvvfe6/+MN2xZMbFswxfO2xfv2sW3BVCBg25bgBaUfLQAAAEIoiQMAAAgggjgAAIAAIogDAAAIIII4AACAACKIAwAACCCCuEx47LHHrHr16lawYEFr2bKlff755xnO/+qrr1qdOnXc/Keddpq98847EZ+rQ/A999xjFSpUsEKFClnHjh1tw4YNFg/bt3//fhs+fLibXqRIEatYsaL17dvXfvjhB4uHYxfu+uuvt4SEBJs8ebLFy7atXbvWLrjgAvdrIzp+zZs3dz8fF/Rt2717t910001WuXJld83Vq1fPnnzySYuFrGzbmjVr7OKLL3bzZ3SuZXV/BWXbxo8f787BYsWK2UknnWQ9evSw9evXW7wcN98DDzzg5hs6dKjFy7b997//tSuuuMJKly7trjldl8uWLbOgb9vBgwft7rvvtpNPPtltV82aNW3s2LHuvh4TGmIE6XvppZe8xMRE71//+pe3Zs0ab8CAAV7JkiW9n376Kc35Fy1a5OXNm9f7xz/+4X399dfeXXfd5eXPn99bvXp1aJ4HHnjAK1GihDdr1ixv5cqV3gUXXOCdfPLJ3p9//ukFfft27tzpdezY0Xv55Ze9devWeYsXL/ZatGjhNW3aNC6One/111/3GjVq5FWsWNF7+OGHvXjYtm+//dZLSkryhg0b5i1fvty9f+ONN9JdZpC2TcuoWbOmN2/ePG/z5s3eU0895b6j7cvJ2/b55597t99+u/ef//zHK1++fJrnWlaXGaRt69Spk/fss896X331lbdixQrv/PPP96pWrert3r3bC/q2hc9bvXp1r2HDht7NN9/snWjZsW2//fabV61aNa9///7ekiVLvE2bNnnvv/++y1OCvm3jxo3zSpcu7c2ePdvlJa+++qpXtGhRb8qUKV4sEMQdgQKQG2+8MfT+4MGD7sY9fvz4NOe/7LLLvC5dukRMa9mypXfddde5vw8dOuROjoceeij0uQKfAgUKuBMn6NuX3oWh54XvvvvOi4dt+/77771KlSq5G4syqlgEcdmxbT179vSuuOIKL9ayY9vq16/vjRkzJmKeJk2aeHfeeaeXk7ctXHrn2rEsM6dvW7QdO3a4vGTBggVePGzbrl27vFq1anlz5szx2rdvH5MgLju2bfjw4V7btm29WGuRDdumvObqq6+OmHbRRRd5ffr08WKB6tQM7Nu3z7744gtX3Rn+o7h6v3jx4jS/o+nh80unTp1C82/evNl+/PHHiHlUdaVi3vSWGaTtS0tKSoormi5ZsqQFfdsOHTpkV155pQ0bNszq169vsZAd26btevvtt+3UU09101V1pXNy1qxZdiJl13Fr3bq1vfnmm66KRw+v8+bNs2+++cbOPfdcy8nbFotl5uR0KC+RpKQki4dtu/HGG61Lly6Hnb9B3zZda82aNbNLL73U5SWnn366JScnWzxsW+vWre3DDz90+YesXLnSPvnkEzvvvPMsFgjiMvDLL7+4+u9y5cpFTNd7BWJp0fSM5vf/z8oyg7R90f766y/XRq53795WvHhxC/q2Pfjgg5YvXz4bMmSIxUp2bNuOHTtcuzG1zencubN98MEHduGFF9pFF11kCxYssKAft6lTp7p2cGoTl5iY6LZRbWXatWtnOXnbYrHMnJoOPWiozVibNm2sQYMGFvRte+mll2z58uWu3V+sZNe2bdq0yZ544gmrVauWvf/++3bDDTe4PPO5556zoG/biBEjrFevXq4Nbv78+V2AqvOyT58+Fgv5YrJW5Arq5HDZZZe5kg9d0EGnp7opU6a4jFcli/FEN0jp3r273XLLLe7vxo0b26effuo6ALRv396CTEHcZ5995koIqlWrZh9//LErBVHHm1iVgiBrdLy++uorV+oRdNu2bbObb77Z5syZ4xrcxxvlJyqJu//++917BTo6dspL+vXrZ0H2yiuv2PTp0+3FF190tTErVqxwQZzyklhsGyVxGShTpozlzZvXfvrpp4jpel++fPk0v6PpGc3v/5+VZQZp+6IDuO+++85lVCeyFC67tm3hwoWuxKpq1aquNE4vbd9tt93mejMFedu0TG2PSqvC1a1b94T2Ts2Obfvzzz/t73//u02aNMm6detmDRs2dD1Ve/bsaRMmTLCcvG2xWGZOTIeO1+zZs101uEpTT6Ts2DY9ECovadKkSSgvUYn3I4884v5WCVKQj5tGXghiXpIZakrjl8apx62a1+jBN1YlqgRxGVC1S9OmTV39d/gTht63atUqze9oevj8oiDGn1/dknUChc+TmppqS5YsSXeZQdq+8ABOw6bMnTvXdTE/0bJj23Sxrlq1yj15+S89femiVpVBkLdNy9RQDtHDN6jdh0qugrxtOh/1UnuYcMrg/RLInLptsVhmTkqHSvEVwM2cOdM++ugjl3+eaNmxbWeffbatXr06Ii9RyZWq5PS3zs0gHzdVeQcxL8mMPXv2xDwviRCT7hQBoi7K6jk6bdo0N3zBwIEDXRflH3/80X1+5ZVXeiNGjIgY7iBfvnzehAkTvLVr13r33ntvmkOMaBka3mDVqlVe9+7dYzrEyPHcvn379rkhUypXruyGBNi+fXvotXfv3kBvW1pi1Ts1O7ZNw6Zo2tNPP+1t2LDBmzp1qhuGY+HChYHfNvX8Uw9VDTGi4Q40bEXBggW9xx9/PEdvm66ZL7/80r0qVKjghj/Q3zo+mV1mkLfthhtucMMxzZ8/PyIv2bNnT+C3LVqseqdmx7ZpRAJdkxqOQ9OnT5/uFS5c2HvhhRcCv239+vVzoxP4Q4wo3yxTpox3xx13eLFAEJcJuplpbCKNN6Muy5999lnEhaeDGu6VV17xTj31VDe/bhxvv/12xOcaZuTuu+/2ypUr506ws88+21u/fr0XD9unk1rPBmm9dAMN+rHLKUFcdm3bP//5T++UU05xAY7GwdNYhvGwbbrxa8wqDS+gbatdu7Y3ceJEdy3m5G1L73rSfJldZpC3Lb28REF40LctpwRx2bVtb731ltegQQN3j6tTp457OIyHbUtNTXXHSctUXlKjRg03VNGJLqTwJeif2JQBAgAA4GjRJg4AACCACOIAAAACiCAOAAAggAjiAAAAAoggDgAAIIAI4gAAAAKIIA4AACCACOIAAAACiCAOAAAggAjiAAAAAoggDgAAwILn/wH85gjd4WPYdQAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "pos.plot(kind='barh', \n", " xlim=(0, 0.18),\n", @@ -2855,12 +3316,31 @@ " title='Top 10 terms with the highest mean tf-idf values for positive tweets');" ] }, + { + "cell_type": "markdown", + "id": "6a71a593", + "metadata": {}, + "source": [ + "Este código crea un gráfico de barras horizontales que muestra las 10 palabras con los valores promedio más altos de TF-IDF en los tweets positivos, con color azul y un título descriptivo." + ] + }, { "cell_type": "code", - "execution_count": null, + "execution_count": 210, "id": "e8b25940-2372-4755-818e-f75e4d23daf9", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnQAAAGzCAYAAACmbIpeAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAASkVJREFUeJzt3QmclXP///HPaJn2fdWqVFptLRSKoggtKO60IEtEkUqijZQUsq+3sua2FMqWKIRkSWmjTSGVGzMl7df/8f7evzP/M9OZmTPTzJz5nl7Px+PUzHWuc13faz2f6/NdJiEIgsAAAADgrSNiXQAAAAAcGgI6AAAAzxHQAQAAeI6ADgAAwHMEdAAAAJ4joAMAAPAcAR0AAIDnCOgAAAA8R0AHAADgOQI6eG3MmDGWkJCQpXl///33HC3D/Pnz3XJfffXVHF3uoaynX79+Vrt27WytR58tUaJEtj6L3LF48WJr3bq1FS9e3J0DS5YsOeTrQfNp/uysJ7fObf2fH+3bt8+GDRtmNWrUsCOOOMK6du0a6yLla7r36D6CvOV9QKebQDSvvLhRPProo3bRRRdZzZo13TozOqH/+usvu+qqq6xixYru5nn66afbN998E9V6HnnkEZs2bVoOljy+3HXXXTZr1qwcX+6LL75o999/f44vF2Y7d+50wUV+/UKP5Xm7d+9ed1/5448/7L777rPnnnvOatWqlePrz6v1+Ojf//633XPPPXbhhRfa9OnT7cYbb7TD3WeffeauWX2Xxfu9P6esWLHC7bMNGzZYrgg899xzz6V6nXnmmfrbtAdN/+2333K9LLVq1QrKlSsXdOrUKShYsGDQt2/fiPPt378/aN26dVC8ePFgzJgxwUMPPRQ0atQoKFmyZPDDDz9kup7GjRsHbdu2zYUt8M/evXuDf/75J9U07ddI+3706NHu3Ni2bVu21tW5c2d3jNP66KOP3HJfeeWVIDdlZT179uwJdu3ala31aN9pH+YlHRNtm47R4Sq983blypVu3zz55JPZuh7Sk3Z/Z2U9uXVu6//8qGfPnkG1atViXYx85Z577nHHbP369Qe9p3uP7kH55RrKL3Tvzs3zvKB57tJLL031+xdffGFz5849aHpeWLBgQUp2LqMqK1WZ6enmlVdecU980qNHD6tfv76NHj3aZYJiUaVw4MABK1y4sPmkYMGC7oXUChUqFOsiIIds3brV/V+mTJlcvR6ysp7DjfZNTu4X3Wv37NljRYoUsXiUmJgY6yIcnoI4c91117kIONyOHTuCm266KahevXpQuHDhoH79+u7p4sCBA6nm0+f0+eeff97Nk5iYGJxwwgnBggULcvRJ4aKLLgoqV67sMnXhrrrqqqBYsWIZZlaUIVI5w1/h2bo///wzGDRoUMq21q1bN5g4cWKqdemJSp/TPrjvvvuCOnXqBEcccUTw7bffpmSxVq9eHfTq1SsoVapUUKFCheC2225z+2vjxo3B+eef77KJ2obJkycfVMYHHnjAZRyLFi0alClTJjjxxBODF154Id1t0nLLly8f3HjjjSnTVN7SpUu7cmmbQrQtBQoUCLZv3+5+D5U3JO2+0St0HELz/vjjj26alq/t69evX/D3338HGdE+TrvcULYulF14+eWXgzvvvNM9yevcOeOMM9y60vriiy+Cjh07unVrH5122mnBp59+muH6s7oebV/abOLvv/8eXHrppe7Yadv79OkTLFmyxC3zmWeeSfVZnb8///xz0KVLF/ezzoEhQ4YE+/btS7VMHSedQzreKkulSpXcefzHH3+kmm/x4sXBWWed5Y5zkSJFgtq1aweXXXZZqvMx7SujbJ3Kq3k++eST4Prrr3fl0zZp3bt373bnTO/evd35p9fQoUMPut6jLfusWbOCc845J6hataq7pnS9jBs37qB9oXNE2fPly5cH7dq1c8f2yCOPDO6+++5Mjmz6561eGV3vaaW9HkT3k8GDB7t9VKJEieC8884LNm3alGofZ2U9OpZ6f9q0aQe99+6777r33nrrLff7hg0bggEDBrj7qY67ajAuvPDCg7I6kTJ0On8j3UNVrrRl0zaOGjXK3e90jHT/0zFPey99//33gzZt2rhzRee1yjVixIh092d652aonNn5btH5phqcmTNnprtebbtqBHR+t2jRwp2fRx11VDB9+vSD5o3mnp+V6/+7775z+13r03p1n9e1qs+nPc/SvkLHNfzYZeV8Ed13tD5dj9oe7a+nn3463X2V2TX03XffuZ/feOONlHm/+uorN+34449PtQzVrrVs2TLVtLfffjs45ZRT3Hezrh/dC77//vuD1q8M9wUXXBCULVvW7Td974WvM3TPSu9cyugeGa24T23oOJ9//vn20Ucf2RVXXGHHHXecvffeezZ06FD75ZdfXFuRtFm2l19+2W644Qb3lKH2ap06dbIvv/zSmjRpkiNl+vbbb+2EE05wjWvDtWzZ0p544gn74YcfrGnTphE/qzZc119/vcsAjhw50k2rXLlySjuktm3buu26+uqrXbZQmcARI0bY5s2bD2r/9cwzz9iuXbtcWz5ta7ly5VLe69mzpzVs2NAmTpxoc+bMsTvvvNO9//jjj9sZZ5xhd999t73wwgt28803W4sWLey0005zn3vyySfdvlPmcdCgQW75S5cutUWLFtm//vWviNukjGabNm3s448/TpmmzyQlJbl9tHDhQuvcubOb/sknn9jxxx+fbgZU7X769+/v9qW2S+rWrZtqHmVDjzrqKJswYYJrt/jUU09ZpUqV3DalR/ta5fn5559Tzpm0ZdC+Unm1TzTvpEmTrFevXm7bQz788EM7++yz7cQTT3TZWM2v46B9qm1TuTMTzXoiZQTOO+88dx4PGDDAjjnmGHvjjTesb9++Eeffv3+/dezY0Vq1amWTJ0+2Dz74wKZMmeL2pT4fovNM7Tkvu+wyd9zXr19vDz30kDvHddyUKVR246yzznLtRW+55RaX6VAbktdff90tQ9PV/lTL7datm3Xv3t1Nb9asWab7QtdClSpVbOzYsS47r+tHy9d5r/NfbWrefvtt1/5J12+fPn2yVHbRPDrWN910k/tfx3DUqFGWnJzslhvuzz//dPcLbYPOM2Xjhw8f7q5nHff0ZHTeVqtWzW2HyqhrLXS9R0vLff755931pw4PKn/oegrfF9Gup3nz5lanTh37z3/+c9D5o3tn2bJl3bkT6mShY3HxxRdb9erV3XHXsW7Xrp1rT1SsWDE7VDq3dY//9NNP3b7TfWvZsmXuOtW9NNSmavny5Xbuuee682rcuHHunrdmzRp3rNOjc1PHZvz48bZjxw53zxCtI6vfLdrv2mcDBw60ChUqZNppSWXTfVTL1n5WOz61y9a9o3Hjxlm652fl+lcN17p169x1oWtL+03Xlf7XNab7tc5v7duXXnrJbae2J7S/DuV82bJli5100kluHdpPWt4777zj9oGut8GDB2f5GmrSpIm7J+j7RcdLdK/VPfS7775zyy1VqpTbR9p3oc+Glqkyq3z6ftD+1vl7yimnuPtE6Bhq3+g7TNeQ7nFqF6/tVeeZ1157zd3X9B2pa+uBBx6wW2+91Z1DoXMps3tk1II4z9Dp6Vq/K6MRTk+JCQkJwZo1a1KmhSJmRe8hP/30k4uWu3XrlmMZOr13+eWXHzR9zpw5bv16aslOG7o77rjDLTttO7xbbrnFZbWUXQt/6lSGaOvWranmDT15KVMRokyEnv60v/TkF/5kqCxE+HYqo6PyZZWealXG5OTklCyfnvL0tDR8+HA3TU+cyraEZ/IiZSQya0OXdt/r2Oqp6FDb0DVs2NBlh0KmTp3qpi9btsz9rqf2evXquexc+BP8zp073dOw2n9mJNr1RMrQvfbaa26e+++/P2Wa9qeye5EydJqmLFQ4Pc3qqTNE2QPNlzb7GnrqDk1XJkK/6wk0p9rQhZ520+7Lk08+2Z2n11xzzUHnb/g1E23ZQ8cnrauvvvqgbHooi/vss8+mTNNxqlKlintyz0x6521W2k6mvR5CGZhrr7021Xz/+te/DtrfWVmPslqFChVKlc3Utur6DL++Iu27zz///KD9dCgZOrWRViZfxzTcY4895pa5cOFC97uysdltQxvKvobL6neLyqjsbTRCNTEff/xxyjTdq5X5UaY8q/f8rFz/kY7ZSy+9dFB5MmpDl/bYRXu+XHHFFS4THp4NlIsvvthlFSOVLZprqHPnzqkyb927d3cv7aN33nnHTfvmm29SZfJUC6TyXXnllamWpfb4Kkv49Pbt2wdNmzZNdT/QfUlt5XXPz6wNXTT3yGh438s1M3o6L1CggIuMww0ZMsQ9YSn6D3fyySe7J6AQPfF06dLFPXkpa5ET/vnnn4htDELtKfR+dqhN3qmnnuqeeDQ0R+jVoUMHV/bwDJhccMEFEZ+oRE86Idp/esrS/tKTUoieIho0aOCe5sKnKYulJ/OsULlVRj0hhZ6gNE0v/Szff/+961GlaYfimmuuOWjd//3vf92T2qHQE214G8RQOUP7R0NA/Pjjjy5TovWFjs/ff/9t7du3d8dHT4mHup5I3n33XZdxuvLKK1Om6Qn1uuuuy9J+Cl+HzrfSpUvbmWeemep80/WjTJYyFxJqezR79mzXkzIn6XwMH6ZDGcW052no/M1O2aVo0aIpP2/fvt3Np32hp/VVq1alKo8+G95+V8dJGYOMjk1u3/8k7f0vo0xHNJTB17EMzyC8//777vrUe5H2nebXeX/00Ue7cyLaXv2Z0bFUlkNZp/Bjqay3pD0PlZmK5jrL6e8WZdIaNWoU9fI1b/i9TvfqtPfbaO/5Wbn+w4+Zali0PGXNJLvHLJrzRftM2SxlEvVz+PYoQ6baiOyu/9RTT3Wf1b1WlM0955xzXFY19P2i/3UvUfYtlKlU+S655JJUZdEx130mdF6pV7iyr8rIh+4PeulcV7l1z1cGNSM5dY+M+yrXn376yY488kgrWbJkqumhdKfeD1evXr2DlqHOCrp5b9u2zaWgD5UumN27dx80XRdP6P3s0Imjqsr0grRQo+cQVTumR4FsOH35KeAMpdbDp+vEDVH1kqrn9CWmG7fSyApglI7OiKqgVf2ii0oXgf5XNZr294MPPuj2TejCC11w2ZV223QzDFWXKfWeG8sNHR9Jr5pTdNMKfS6764lE53nVqlUPquLSMYpExzrteaT1hK9D26Pyqro6o/NNX2R6eNDxVPWMqttUFaHz4lAbT0c6T0XjhaWdnp2yh6pTbrvtNnfTThv0axnhVK2Ydhw47TddlzlFjen1JRJOx0pfNJGOu7640zY7UGBwKI499lgXQKnKLBQ862fdH0KBVOjhVNWUalagL7X/Jasi77vs0rFcuXJlpvc9BQ5qXqGHVVVr6SFKVYeq1kzb/CU3vlsyut9Gc26ndw1Gc8/PyvWvc0vX6owZMw76zsjuMYvmfNH3qwIoVe/qldH2ZCeg27dvn33++efu3qDlaJqu7fCATkF0qOlR6H4dfj6HC31XqGpc5/Xtt9/uXumVW9Wx6cmpe2TcB3T5kS4stW9IKzRNN4ns0FOnMg4aADMSBabhMgocI305RJom4Tdp3cxWr17tnjT0VKgnLrVDVJsjnazp0dOjnnr0RKkL5LfffnMXnNrx6IlF7cN0wemmkN7NK1rRbEduLDeUFVC7Kz0ZRhLNgL65Vf5o1hFO26OASG0pIwkdp9BgyGp/89Zbb7ls9+WXX+7a5GnaoQxinF45I00P3z/Rll1fMLrZ6uatdlcKjBTs6mlfDy9pMz15cWyUxda4leHU/i+7A0lnlwIktS1TNkJBzZtvvumyGeG9bNXGUcGcMoKq/VBgrfNBbeoyy5KlN0CyMk/h+1nLURvFe++9N+L8oeBe9zvdX5RZUbtg3Z8UVOgLW9miaM75Q5HVB/VozqWs3vOjoUyTzjG1BdR9Sten1qO2oYeS2czsfAktWxnu9B56o2lXG4ky9LpudfwVKOva177Rd4y+n5Rg0feL2rqFhMqjdnSREjlpy602zaG2gGml9+AcklP3yLgP6DQwpjJGSoWGP0mFqkrSDpwZisrDqfGnnmwONZAICaV5dSKEPxkqaNF6MrsI07vR6ctGDXeVbo8lNQjVxauXsgl6CtaFrIa6GXXT18Wlhqc6XnpyU/CmbVUDYO0vvdSoOTPRjpSfVYe63FCWRMFBXh8jnef6IlOmOfwpXcHzoWyPjpWyr9F8WanaRi+dCxqaRx05lAVQxiS3jtmhll0DHSsDraqiUMefUACV06LdB8p2qDooXHo1Bzruus+sXbs2VVZOD12HSte3HtL00KYHL2UvFaiF05eUvpz1xRSibHs0g9EqGxVpPmWb1Mg+/FiqcbsybpntQ91vNZ9eCgDVCUQdnnRtZPWazOp3S26I9p4f7fWv7N+8efPccdVDeEbfi1m9ZjM7X/T9qv2ogD2798eEdMoUavqg7xAFdKGqbP2vYE4PduqQEX6Nh+7XCv4yKk/oXFRSIrNyZ7bPMrpHRiPu29CpnlwniHqvhVNaUzs3bc8zpWTD6+k3bdrk2lyo6jCnnuCU4tfJE96eQE8tag+h9gOZpVgVMEW60enJSuVXdJ+W5lfKObeFV7+GLiSlsfVUmVnbgNDFpZ5ZqlYNnfyarqekX3/9Nar2c+ntn0Ol5R5KNZHaZ+kmoV6jugmnpSqH3KInR+1/9UIO0Rf9ww8/nO1l6nzTtXXHHXcc9J7OtdAx0JdE2gxVKEMZanoQ+pLJq1Hnoy176JoPL78eUvRUn9OiPW8V6OiLI/yV3oNS6P6mnnXhcuIvnigbr8yYslx6qeYh/AsxtP/SHns1oYimPbKuFWUntL9DlPnXPTntsVR1bvi5HV7lG2o3lbaaOtJ5mJvfLbkh2nt+tNd/pPM9vfNF52toPTlxvmjdqnZUwKf20tm5PxbP4BrSd4eSJgpsQ98jShyoXKERDsK/X7TP9PCtoD/Sd1eoPAr4VEWqESAi1byFlzu9fRbNPTIacZ+hU4Ck6gk9hakbsJ5ulV5XkKZqgLRtS9TFWQcyfNgSyai6MESpUj0pik4AtW3QcB+i7tKhdLECOkXhatyurvs6qbQe3RyiWY8CA3Wd1rKVytUJpWoDpciVxlYWK9S9XTczdeHXk7K2P20buJymwFfZAmU+9BSmti264WmYhLRtTdJSlYzS2MoehHcd10Wv7ZVoAjptt56c9QSu6mu1XVF17qHScnUj0vAVGtZBaXCdX9FSdkBteHSjV9ZRx1/tKvRlpJuMbh46h3KD2mPoCVUNtvVUruynzpXQl1x2MmSqitRQCWojpQ4fOvZ6StXTvB5Opk6dmvKnknR+qzpD15syGvpi0fbqS1GUJVPgr/2rDLXasehazKmhgrJbdg3zoQBKWSbdE7Sf9HCRk1WouXne6ktB1Vra/3oY0fYoA3Momdm0WRdlchRQqm1U2rZouhdpf6mqVcdXwYe2sXz58pkuW1kJ3bdU1afARVlGDb+S9p7du3dvN0SEOvHoOtK9R/dSZco0XcGOqtxUZa4qN92LlLFSuybtF7V7zE673Kx+t+SGaO/50V7/uiZ1v9VQSPoO0/1J2xQpIx3qPKjtV6ZN14/2SShoyc75oiGZdAx13qsDh84ZlVFJFp03kYLyaK+hU0891WW+9EAQ/j2i7VUwpiYLOhdCtC/0vaPzS228tY3KIm7cuNFV2es8CwXzCox1DilgVbmVtVPSRue7OgmG4gJdjwpcFUDqelSMoe9uZeMyu0dGJTgMBhZW92MNdaFBPtV1Wt2IMxv8UfOoi7iGaoj2z3REGpwz9ArvFi7qvq0u2houQ8MfqFt8tF2W1W1a3bA1QGTaAUC1reoifvTRR7tBGTWYqLpOawDg0J9iCR9YONo/j5Xen4NK253/8ccfdwPlaru0/zTIpQb4TEpKimrbNIim1r9o0aJUA01qWo0aNdItb7hVq1a5MmhIldDgkhltW2gIjEjd78NpEFEN96Cu7JEGFk473ENoP6c99hrAWV3mQ/tIy+nRo0cwb968DNeflfVEGlhY263yhwYW1YDKGtJBn50xY0amxzrSvpYnnnjCDWei/a1lq/v+sGHDgl9//TVlOIBLLrkkqFmzZsoAvueee26q4YHks88+c8vReRvtwMJpr5msnr+ZlV20j0466aSUgYL1/nvvvXfQ8AORhrYIrTvScDdppXfeHsqwJaI/BXbDDTe48037INLAwlldT4gGtA7d4yINjq2hjTQ4amhQYw0zo+1MO6xFen/6a8qUKSkDaGtAYJ0zkQYW1r1NAzhr/2teDe6q4zp27NiUe4+uLw2rpGOoc0z/67yM5s8tpndss/rdEq3QwMKRypF226O552fl+tf9VkM56T6n+TQQvq6HSNekhk3R8dGQLOkNLJyV80W2bNni9pXu99qnGvZHw4LoWs3uNSQaEkvDlGj7wwcF1/e95tVA5JHonNR5q32hIcz0naZ9l/b+tXbtWjdYs8qrcmu/6D736quvpppPf1pPg5OrLKFzPtp7ZGYS9E/04V9801OKunGnTaED8UqDruqpUN34M+uJDCC+cP3Hl7hvQwfAIo5vqGoptWdSWl9VCgDiF9d//Iv7NnQA/v8QErqpq62iGtqqU46GJ1Cj3+yOfQjAD1z/8Y+ADjhMqPGtho9QT0ENHaEONXpC199MBBDfuP7jH23oAAAAPEcbOgAAAM8R0AEAAHiONnQ5TKNv6y8aaBDdvP5zRgAAIHvUAk2D+mpQ4rSDHvuAgC6HKZgL/TFoAADgl02bNqX6qxG+IKDLYaE/b6UTQuP7AACA/C85OdklZDL7M5X5FQFdDgv/m3gEdAAA+CXB0+ZS/lUSAwAAIBUCOgAAAM8R0AEAAHiOgA4AAMBzBHQAAACeI6ADAADwHMOW5JJtT42zXUUTLR5UGjA+1kUAAAAZIEMHAADgOQI6AAAAzxHQAQAAeC4uArr58+e7P9Xx119/xbooAAAAec7LgK5du3Y2ePDglN9bt25tmzdvttKlS8e0XAAAALEQF71cCxcubFWqVIl1MQAAAGLCuwxdv379bMGCBTZ16lRXzarXtGnTUlW56vcyZcrY7NmzrUGDBlasWDG78MILbefOnTZ9+nSrXbu2lS1b1m644Qbbv39/yrJ3795tN998s1WrVs2KFy9urVq1ctW5AAAA+Zl3GToFcj/88IM1adLExo0b56YtX778oPkUvD3wwAM2Y8YM2759u3Xv3t26devmAr23337b1q1bZxdccIG1adPGevbs6T4zcOBAW7FihfvMkUceaTNnzrROnTrZsmXLrF69ehHLoyBQr5Dk5ORc23YAAIC4COjUTk5VrMq6hapZV61addB8e/futUcffdTq1q3rfleG7rnnnrMtW7ZYiRIlrFGjRnb66afbRx995AK6jRs32jPPPOP+VzAnyta9++67bvpdd90VsTwTJkywsWPH5uo2AwAAxFVAFy0FfKFgTipXruyqWhXMhU/bunWr+1lZOFW/1q9fP9VylH0rX758uusZMWKE3XTTTakydDVq1MjhrQEAADgMA7pChQql+l1t7CJNO3DggPt5x44dVqBAAfv666/d/+HCg8C0EhMT3QsAACBWvAzoVOUa3pkhJxx//PFumcrYnXrqqTm6bAAAgNzkXS9XUdXpokWLbMOGDfb777+nZNkOhapae/XqZX369LHXX3/d1q9fb19++aVrIzdnzpwcKTcAAEBu8DKgU2cFVYuqY0PFihVdR4acoM4PCuiGDBnihjvp2rWrLV682GrWrJkjywcAAMgNCUEQBLmy5MOUOkWoJ+6aKUOsZNH4aFtXacD4WBcBAIA8+f5OSkqyUqVKmW+8zNABAADg/yOgAwAA8JyXvVx9ULH/KC9TtgAAwD9k6AAAADxHQAcAAOA5AjoAAADPEdABAAB4joAOAADAcwR0AAAAniOgAwAA8BwBHQAAgOcI6AAAADxHQAcAAOA5AjoAAADPEdABAAB4joAOAADAcwR0AAAAniOgAwAA8BwBHQAAgOcI6AAAADxHQAcAAOC5grEuQLza9tQ421U00eJFpQHjY10EAACQDjJ0AAAAniOgAwAA8BwBHQAAgOfiOqDbsGGDJSQk2JIlS2JdFAAAgFwT150iatSoYZs3b7YKFSrEuigAAAC5xtsM3d69ezOdp0CBAlalShUrWDCu41YAAHCYy9OA7tVXX7WmTZta0aJFrXz58tahQwf7+++/3XtPPfWUNWzY0IoUKWLHHHOMPfLIIwdVnb788svWtm1bN8+jjz7qlvPOO++kWsfMmTOtZMmStnPnzohVrsuXL7dzzz3XSpUq5eY79dRTbe3atSnvZ1QOAACA/CjPUleq+rzkkkts0qRJ1q1bN9u+fbt98sknFgSBvfDCCzZq1Ch76KGH7Pjjj7dvv/3WrrzySitevLj17ds3ZRm33HKLTZkyxc2jgEuff/HFF+3ss89OmUfL6tq1qxUrVuygMvzyyy922mmnWbt27ezDDz90Qd3ChQtt3759KZ+Nphzhdu/e7V4hycnJObznAAAA8lFAp8Cpe/fuVqtWLTdN2ToZPXq0C9T0nhx11FG2YsUKe/zxx1MFUoMHD06ZR3r16mW9e/d22TgFcAqm5syZ47J0kTz88MNWunRpmzFjhhUqVMhNq1+/fsr70ZYj3IQJE2zs2LE5sIcAAADyeZXrsccea+3bt3dB3EUXXWRPPvmk/fnnn67KVVWeV1xxhZUoUSLldeedd6aqCpXmzZun+v2cc85xgdmbb77pfn/ttddc1k1VuZGo6lVVrKFgLlxWyhFuxIgRlpSUlPLatGlTNvcQAABAPs/QqYPC3Llz7bPPPrP333/fHnzwQRs5cqS99dZb7n0FeK1atTroM+FU9RmucOHCduGFF7pq14svvtj937Nnz3Q7QajNXXp27NgRdTnCJSYmuhcAAECs5Gn3T3VQaNOmjXuprZqqXtWG7cgjj7R169a5KtSs0mfOPPNM19lB7eKUUUtPs2bNbPr06a6HbNosXeXKlQ+pHAAAAHEf0C1atMjmzZtnZ511llWqVMn9vm3bNtejVG3QbrjhBte+rVOnTq6TwVdffeWqZG+66aYMl6tODhqaREGY2rylza6FGzhwoMsMKpunqlKt74svvrCWLVtagwYNDqkcAAAAcR/QqW3bxx9/bPfff7/rvKDsnDoghHqoqlPDPffcY0OHDnVVq2prp04Q0WT9Qr1nlfXLiIZKURZP69DwJ6pKPe6441zGUPr375/tcgAAAMRKQqBxQ5BjFKwqw7dmyhArWTR+2tZVGjA+1kUAACDXv7+TkpJcEso33v6lCAAAAPwPAR0AAIDn+COnuaRi/1FepmwBAIB/yNABAAB4joAOAADAcwR0AAAAniOgAwAA8BwBHQAAgOcI6AAAADxHQAcAAOA5AjoAAADPEdABAAB4joAOAADAcwR0AAAAniOgAwAA8BwBHQAAgOcI6AAAADxHQAcAAOA5AjoAAADPEdABAAB4joAOAADAcwVjXYB4te2pcbaraKLFk0oDxse6CAAAIAIydAAAAJ4joAMAAPAcAR0AAIDnCOgAAAA8l28Cuvnz51tCQoL99ddfsS4KAACAV/JNQJffBUFg+/bti3UxAAAADj2gO3DggE2aNMmOPvpoS0xMtJo1a9r48eMjZtiWLFnipm3YsMH9/tNPP9l5551nZcuWteLFi1vjxo3t7bffdu+ffvrpbh69p8/069fP/b5792674YYbrFKlSlakSBE75ZRTbPHixSnrCK33vffes+OPP96KFi1qZ5xxhm3dutXeeecda9iwoZUqVcr+9a9/2c6dO1Ntx4QJE+yoo45ynzn22GPt1VdfPWi5WsaJJ57otvXTTz/N6u4CAADIf+PQjRgxwp588km77777XHC1efNmW7VqVVSfve6662zPnj328ccfu4BuxYoVVqJECatRo4a99tprdsEFF9jq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AOAwl/x/39/q4KgxbH0Tdxk6AACAww0BHQAAgOe8HbYkv6vYf5SXKVsAAOAfMnQAAACeI6ADAADwHAEdAACA5wjoAAAAPEdABwAA4DkCOgAAAM8R0AEAAHiOgA4AAMBzBHQAAACeI6ADAADwHAEdAACA5wjoAAAAPEdABwAA4DkCOgAAAM8R0AEAAHiOgA4AAMBzBHQAAACeI6ADAADwXMFYFyBebXtqnO0qmhjrYiBKlQaMj3URAADINjJ0AAAAniOgAwAA8BwBHQAAgOdyPKBr166dDR482HLD/PnzLSEhwf76669cWT4AAICP4i5DN2bMGDvuuONiXQwAAIA8E3cBHQAAwOEmVwK6AwcO2LBhw6xcuXJWpUoVlzULuffee61p06ZWvHhxq1Gjhl177bW2Y8eOlPd/+uknO++886xs2bJunsaNG9vbb7+davlff/21NW/e3IoVK2atW7e21atXu+nTpk2zsWPH2nfffeeqZvXStGjWK08++aR7T8vt1q2b+0yZMmVyYxcBAADk74Bu+vTpLnBatGiRTZo0ycaNG2dz58793wqPOMIeeOABW758uZvvww8/dMFfyHXXXWe7d++2jz/+2JYtW2Z33323lShRItXyR44caVOmTLGvvvrKChYsaJdffrmb3rNnTxsyZIgLAjdv3uxemhbNehcuXGjXXHONDRo0yJYsWWJnnnmmjR+f+dhkKmtycnKqFwAAQF5KCIIgyOlOEfv377dPPvkkZVrLli3tjDPOsIkTJx40/6uvvuoCqd9//9393qxZM7vgggts9OjRETtFnH766fbBBx9Y+/bt3TRl7zp37mz//POPFSlSxGUDZ82a5YKyjKRd78UXX+wydrNnz06Z59JLL3W/Z9QJQ+tTVjCtNVOGWEkGFvYGAwsDwOEtOTnZSpcubUlJSVaqVCnzTa5k6BSUhatatapt3brV/RwKxqpVq2YlS5a03r1723//+1/buXOne/+GG26wO++809q0aeOCuqVLl2a4fC1bQstPT2brVbWtAs9waX+PZMSIEe7gh16bNm3K9DMAAAD5PqArVKhQqt/Vlk3t6jZs2GDnnnuuC8hee+011xbu4YcfdvPs2bPH/d+/f39bt26dC7hU5aq2cg8++GC6y9eyRctPTzTrza7ExEQXyYe/AAAA4raXqwIpBV5q/3bSSSdZ/fr17ddf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GrYE6ZsxY0ZQuHDh4N///newfPny4MorrwzKlCkTbNmyJeL8CxcuDAoUKBBMmjQpWLFiRXDbbbcFhQoVCpYtW5Yyz8SJE4PSpUsHs2bNCr777rvg/PPPD4466qjgn3/+8Xrb/vrrr6BDhw7Byy+/HKxatSr4/PPPg5YtWwYnnnhiEA/HLeT1118Pjj322ODII48M7rvvviAetm3NmjVBuXLlgqFDhwbffPON+/2NN95Id5k+bZuWUbdu3eCjjz4K1q9fHzz++OPuM9q+/LxtX375ZXDzzTcHL730UlClSpWI51pWl+nTtnXs2DF45plngu+//z5YsmRJcM455wQ1a9YMduzYEfi+beHz1q5dO2jWrFkwaNCgIK/lxrb98ccfQa1atYJ+/foFixYtCtatWxe899577p7i+7aNHz8+KF++fDB79mx3L3nllVeCEiVKBFOnTg3yAwK6TCggue6661J+379/v/sinzBhQsT5e/ToEXTu3DnVtFatWgVXX321+/nAgQPuZLnnnntS3lcglJiY6E4kn7ctvYtEzw0//fRTEA/b9vPPPwfVqlVzXzK6acUioMuNbevZs2dw6aWXBrGWG9vWuHHjYNy4canmOeGEE4KRI0cG+XnbwqV3rh3KMvP7tqW1detWdy9ZsGBBEA/btn379qBevXrB3Llzg7Zt28YkoMuNbRs+fHhwyimnBLHWMhe2Tfeayy+/PNW07t27B7169QryA6pcM7Bnzx77+uuvXZVo+B/t1e+ff/55xM9oevj80rFjx5T5169fb7/99luqeVTFpXRwesv0ZdsiSUpKcunrMmXKmO/bduDAAevdu7cNHTrUGjdubLGQG9um7ZozZ47Vr1/fTVf1ls7HWbNmWV7KrePWunVre/PNN101kB5iP/roI/vhhx/srLPOsvy8bbFYZn4uh+4lUq5cOYuHbbvuuuusc+fOB52/vm+brrXmzZvbRRdd5O4lxx9/vD355JMWD9vWunVrmzdvnrt/yHfffWeffvqpnX322ZYfENBl4Pfff3d15pUrV041Xb8rKItE0zOaP/R/Vpbpy7altWvXLtem7pJLLrFSpUqZ79t29913W8GCBe2GG26wWMmNbdu6datrZ6a2PJ06dbL333/funXrZt27d7cFCxaY78ftwQcfdO3m1IaucOHCbhvVtua0006z/LxtsVhmfi2HHjrUxqxNmzbWpEkT833bZsyYYd98841rJxgrubVt69ats0cffdTq1atn7733ng0YMMDdM6dPn26+b9stt9xiF198sWuzW6hQIRes6rzs1auX5QcFY10AxCd1kOjRo4fLiOji9p2e9qZOnepuwso4xhN9WUqXLl3sxhtvdD8fd9xx9tlnn7nOA23btjWfKaD74osvXOagVq1a9vHHH7vsiDrtxCo7gqzR8fr+++9dNsR3mzZtskGDBtncuXNdY/14o/uJMnR33XWX+11Bj46d7iV9+/Y1n/3nP/+xF154wV588UVXS7NkyRIX0Olekh+2jQxdBipUqGAFChSwLVu2pJqu36tUqRLxM5qe0fyh/7OyTF+2LW0w99NPP7mbVl5m53Jr2z755BOXyapZs6bL0uml7RsyZIjrFeXztmmZ2h5lscI1bNgwT3u55sa2/fPPP3brrbfavffea+edd541a9bM9Xjt2bOnTZ482fLztsVimfmxHDpes2fPdlXlyrLmpdzYNj0c6l5ywgknpNxLlAl/4IEH3M/KLPl83DR6g4/3kmiouU0oS6eeu2qCo4fgWGZawxHQZUDVMyeeeKKrMw9/+tDvJ598csTPaHr4/KKgJjS/ujvrhAqfJzk52RYtWpTuMn3ZtvBgTsOwfPDBB67bel7LjW3Thbt06VL3RBZ66alMF7iqFXzeNi1Tw0OkHRJC7USU0fJ523Q+6qX2M+F0sw9lJvPrtsVimfmpHMruK5ibOXOmffjhh+7emddyY9vat29vy5YtS3UvUUZL1Xb6Weemz8dN1eI+3kuisXPnzpjfSzIU614Z+Z26PqsH6rRp09ywCFdddZXr+vzbb7+593v37h3ccsstqYZRKFiwYDB58uRg5cqVwejRoyMOW6JlaNiEpUuXBl26dInZsCU5uW179uxxQ7BUr17dDTOwefPmlNfu3bu93rZIYtXLNTe2TUOxaNoTTzwR/Pjjj8GDDz7ohvb45JNPvN829SBUT1cNW6IhFDQURpEiRYJHHnkkX2+brplvv/3WvapWreqGVNDPOj7RLtPnbRswYIAb3mn+/Pmp7iU7d+70ftvSilUv19zYNo1soGtSQ3xo+gsvvBAUK1YseP75573ftr59+7pRDkLDlui+WaFChWDYsGFBfkBAFwV9uWn8I41po67QX3zxRaoLUQc53H/+85+gfv36bn59kcyZMyfV+xq65Pbbbw8qV67sTrj27dsHq1evDnzfNp3gekaI9NKXqe/HLb8EdLm1bU8//XRw9NFHu2BH4+xpnMR42DYFARoTS0MWaNsaNGgQTJkyxV2H+Xnb0rueNF+0y/R529K7lygg933b8ktAl1vb9tZbbwVNmjRx32/HHHOMe1CMh21LTk52x0nL1L2kTp06bvijvE5YpCdB/8Q6SwgAAIDsow0dAACA5wjoAAAAPEdABwAA4DkCOgAAAM8R0AEAAHiOgA4AAMBzBHQAAACeI6ADAADwHAEdAACA5wjoAAAAPEdABwAAYH77f8+vkJZKF8mMAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "neg.plot(kind='barh', \n", " xlim=(0, 0.18),\n", @@ -2868,6 +3348,14 @@ " title='Top 10 terms with the highest mean tf-idf values for negative tweets');" ] }, + { + "cell_type": "markdown", + "id": "8416b750", + "metadata": {}, + "source": [ + "Este código genera un gráfico de barras horizontales que muestra las 10 palabras con los valores promedio más altos de TF-IDF en los tweets negativos, usando color salmón oscuro y con un título que explica qué representa el gráfico." + ] + }, { "cell_type": "markdown", "id": "77bca876-9649-46f3-bd4f-f9f68fea649a", @@ -2904,7 +3392,7 @@ }, { "cell_type": "code", - "execution_count": 55, + "execution_count": 211, "id": "33413d63-87eb-489f-b374-3cfeaa51cf3c", "metadata": {}, "outputs": [], @@ -2913,6 +3401,14 @@ "from sklearn.model_selection import train_test_split" ] }, + { + "cell_type": "markdown", + "id": "148212bb", + "metadata": {}, + "source": [ + "Este código importa dos funciones de scikit-learn: una para crear un modelo de regresión logística con validación cruzada y otra para dividir los datos en conjuntos de entrenamiento y prueba." + ] + }, { "cell_type": "markdown", "id": "ee87ff74-3fbb-472a-b795-6f4d18fab215", @@ -2923,7 +3419,7 @@ }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 212, "id": "64cec8b9-14d9-4897-9c02-cc89fcf7b3c6", "metadata": {}, "outputs": [], @@ -2934,6 +3430,17 @@ "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.15)" ] }, + { + "cell_type": "markdown", + "id": "a397527a", + "metadata": {}, + "source": [ + "Este fragmento divide los datos en dos partes:\n", + "las características (X), que son las representaciones tf-idf de los textos,\n", + "y las etiquetas (y), que son los sentimientos de los tweets.\n", + "Luego separa esos datos en conjuntos de entrenamiento (85%) y prueba (15%) para poder entrenar y evaluar un modelo." + ] + }, { "cell_type": "markdown", "id": "066771d8-2f31-4646-9a1b-6d2b1b9b208c", @@ -2944,7 +3451,7 @@ }, { "cell_type": "code", - "execution_count": 57, + "execution_count": 213, "id": "d46de0b2-af00-4a1d-b4cd-31b96ce545d1", "metadata": {}, "outputs": [], @@ -2961,6 +3468,14 @@ " return model" ] }, + { + "cell_type": "markdown", + "id": "82bfdf3d", + "metadata": {}, + "source": [ + "Esta función crea y entrena un modelo de regresión logística usando validación cruzada (5 pliegues) para encontrar la mejor regularización (penalización L1). También ajusta pesos para balancear clases desiguales y fija una semilla para reproducibilidad. Finalmente, devuelve el modelo entrenado listo para hacer predicciones." + ] + }, { "cell_type": "markdown", "id": "124aa7ea-1bc1-43e2-beeb-0ba2da9b2df9", @@ -2971,7 +3486,7 @@ }, { "cell_type": "code", - "execution_count": 58, + "execution_count": 214, "id": "773963bd-6603-4fad-884b-09ce60afab18", "metadata": {}, "outputs": [], @@ -2980,9 +3495,17 @@ "model = fit_logistic_regression(X_train, y_train)" ] }, + { + "cell_type": "markdown", + "id": "56afb93e", + "metadata": {}, + "source": [ + "Este código usa la función fit_logistic_regression para entrenar un modelo de regresión logística con los datos de entrenamiento X_train (características) y y_train (etiquetas). El resultado es un modelo ajustado listo para hacer predicciones." + ] + }, { "cell_type": "code", - "execution_count": 59, + "execution_count": 215, "id": "e10d06c1-d884-45d4-a03d-dd5d40bf70aa", "metadata": {}, "outputs": [ @@ -2990,8 +3513,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "Training accuracy: 0.9455601998164951\n", - "Test accuracy: 0.894919168591224\n" + "Training accuracy: 0.9453563054337853\n", + "Test accuracy: 0.9001154734411085\n" ] } ], @@ -3001,6 +3524,14 @@ "print(f\"Test accuracy: {model.score(X_test, y_test)}\")" ] }, + { + "cell_type": "markdown", + "id": "cecb6bba", + "metadata": {}, + "source": [ + "Este código calcula y muestra qué tan bien funciona el modelo de regresión logística que entrenaste, tanto con los datos usados para entrenarlo (precisión de entrenamiento) como con datos nuevos que no vio antes (precisión de prueba). Básicamente, mide qué porcentaje de predicciones fueron correctas en ambos casos." + ] + }, { "cell_type": "markdown", "id": "d4e186c5-1719-4deb-bdb4-614a9980f058", @@ -3021,7 +3552,7 @@ }, { "cell_type": "code", - "execution_count": 60, + "execution_count": 216, "id": "6dcb6ef1-13b3-437e-813c-7118911847a4", "metadata": {}, "outputs": [], @@ -3038,9 +3569,17 @@ "importance['coefs'] = coefs" ] }, + { + "cell_type": "markdown", + "id": "4cfa1dbd", + "metadata": {}, + "source": [ + "Este código extrae los coeficientes (pesos) que el modelo de regresión logística asignó a cada palabra (token) para medir su importancia en la predicción, y luego crea un DataFrame que relaciona cada palabra con su coeficiente correspondiente. Esto ayuda a entender qué palabras influyen más en el modelo para clasificar los tweets." + ] + }, { "cell_type": "code", - "execution_count": 61, + "execution_count": 217, "id": "3e63814e-9c0d-4f7a-a5e0-72cca2758d71", "metadata": {}, "outputs": [ @@ -3071,74 +3610,74 @@ " \n", " \n", " \n", - " 2724\n", + " 2735\n", " rude\n", - " -11.138668\n", + " -12.334903\n", " \n", " \n", - " 2784\n", - " screw\n", - " -9.962456\n", - " \n", - " \n", - " 2727\n", + " 2738\n", " ruin\n", - " -9.849836\n", + " -10.453660\n", " \n", " \n", - " 1505\n", - " hour\n", - " -9.282416\n", + " 2798\n", + " screw\n", + " -9.371486\n", " \n", " \n", - " 389\n", - " break\n", - " -7.949487\n", + " 1881\n", + " luggage\n", + " -9.292221\n", " \n", " \n", - " 2280\n", - " pay\n", - " -7.823908\n", + " 1521\n", + " hrs\n", + " -9.009768\n", " \n", " \n", - " 458\n", + " 460\n", " cancel\n", - " -7.534084\n", + " -8.624062\n", " \n", " \n", - " 264\n", - " bad\n", - " -7.357206\n", + " 1477\n", + " hold\n", + " -8.388975\n", " \n", " \n", - " 1872\n", - " luggage\n", - " -7.093317\n", + " 2288\n", + " pay\n", + " -7.929667\n", + " \n", + " \n", + " 2957\n", + " solution\n", + " -7.130466\n", " \n", " \n", - " 3034\n", - " strand\n", - " -7.046890\n", + " 1513\n", + " hour\n", + " -7.046743\n", " \n", " \n", "\n", "" ], "text/plain": [ - " token coefs\n", - "2724 rude -11.138668\n", - "2784 screw -9.962456\n", - "2727 ruin -9.849836\n", - "1505 hour -9.282416\n", - "389 break -7.949487\n", - "2280 pay -7.823908\n", - "458 cancel -7.534084\n", - "264 bad -7.357206\n", - "1872 luggage -7.093317\n", - "3034 strand -7.046890" + " token coefs\n", + "2735 rude -12.334903\n", + "2738 ruin -10.453660\n", + "2798 screw -9.371486\n", + "1881 luggage -9.292221\n", + "1521 hrs -9.009768\n", + "460 cancel -8.624062\n", + "1477 hold -8.388975\n", + "2288 pay -7.929667\n", + "2957 solution -7.130466\n", + "1513 hour -7.046743" ] }, - "execution_count": 61, + "execution_count": 217, "metadata": {}, "output_type": "execute_result" } @@ -3149,9 +3688,17 @@ "neg_coef" ] }, + { + "cell_type": "markdown", + "id": "107f0687", + "metadata": {}, + "source": [ + "Este código ordena las palabras (tokens) según sus coeficientes de menor a mayor, es decir, identifica las 10 palabras con los coeficientes más negativos, que son las que más están asociadas con la clase negativa (por ejemplo, tweets negativos). Luego muestra esas 10 palabras junto con sus coeficientes." + ] + }, { "cell_type": "code", - "execution_count": 62, + "execution_count": 218, "id": "0d596bf7-753c-40cd-ac52-4a37163650ae", "metadata": {}, "outputs": [ @@ -3182,54 +3729,54 @@ " \n", " \n", " \n", - " 3165\n", - " thankful\n", - " 8.002975\n", - " \n", - " \n", - " 1091\n", - " exceptional\n", - " 8.136278\n", + " 1870\n", + " love\n", + " 8.631161\n", " \n", " \n", - " 1563\n", - " impressed\n", - " 8.501364\n", + " 3229\n", + " toiletry\n", + " 8.873157\n", " \n", " \n", - " 648\n", - " compliment\n", - " 8.981360\n", + " 3180\n", + " thankful\n", + " 9.097905\n", " \n", " \n", - " 1373\n", + " 1380\n", " great\n", - " 9.080558\n", + " 9.261755\n", " \n", " \n", - " 3498\n", - " wonderful\n", - " 9.401606\n", + " 617\n", + " comfortable\n", + " 9.401676\n", " \n", " \n", - " 1089\n", + " 1097\n", " excellent\n", - " 10.147230\n", + " 9.824084\n", " \n", " \n", " 250\n", " awesome\n", - " 10.315909\n", + " 10.116441\n", " \n", " \n", - " 1746\n", + " 3515\n", + " wonderful\n", + " 10.439532\n", + " \n", + " \n", + " 1753\n", " kudo\n", - " 11.623828\n", + " 10.536451\n", " \n", " \n", - " 3164\n", + " 3179\n", " thank\n", - " 16.027534\n", + " 16.807753\n", " \n", " \n", "\n", @@ -3237,19 +3784,19 @@ ], "text/plain": [ " token coefs\n", - "3165 thankful 8.002975\n", - "1091 exceptional 8.136278\n", - "1563 impressed 8.501364\n", - "648 compliment 8.981360\n", - "1373 great 9.080558\n", - "3498 wonderful 9.401606\n", - "1089 excellent 10.147230\n", - "250 awesome 10.315909\n", - "1746 kudo 11.623828\n", - "3164 thank 16.027534" + "1870 love 8.631161\n", + "3229 toiletry 8.873157\n", + "3180 thankful 9.097905\n", + "1380 great 9.261755\n", + "617 comfortable 9.401676\n", + "1097 excellent 9.824084\n", + "250 awesome 10.116441\n", + "3515 wonderful 10.439532\n", + "1753 kudo 10.536451\n", + "3179 thank 16.807753" ] }, - "execution_count": 62, + "execution_count": 218, "metadata": {}, "output_type": "execute_result" } @@ -3260,6 +3807,14 @@ "pos_coef " ] }, + { + "cell_type": "markdown", + "id": "886d7d94", + "metadata": {}, + "source": [ + "Este código obtiene las 10 palabras (tokens) con los coeficientes más altos (positivos) del modelo, es decir, las palabras que más están asociadas con la clase positiva (por ejemplo, tweets positivos). Primero ordena el DataFrame por coeficientes de menor a mayor y luego toma las últimas 10 filas para mostrar las palabras con coeficientes más grandes y su importancia." + ] + }, { "cell_type": "markdown", "id": "7b3b7893-caa0-4281-98f0-92c9e7b31953", @@ -3270,13 +3825,13 @@ }, { "cell_type": "code", - "execution_count": 63, + "execution_count": 219, "id": "17b1223b-e5c1-4992-bb7e-0a99651c3729", "metadata": {}, "outputs": [ { "data": { - "image/png": "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Tp48KbcdEhKCHj16YOTIkahcuTJatWqFkydPyiNoAGBsbIyxY8eiS5cuqFu3LlQqFdavXy8v/+KLL+Dv749GjRrB1tYW69aty9EHY2Nj7NmzB4mJiahVqxbatWuHJk2aYPHixfk+Dra2tggNDcWmTZvg4eGBWbNmYe7cuQU+nkREREQvk0T2A+5KqNDQUAwbNkzRX1WWkpICCwsL9JgbBwOVubbLISpxVgyw0nYJRFQMZX9+Jycnw9y8cJ/fH8QIHxERERG9Owx8RERERApX4k/plgRFOSRMRERE7wdP6RIRERFRvjHwERERESkcAx8RERGRwjHwERERESkcAx8RERGRwjHwERERESkcAx8RERGRwjHwERERESkcAx8RERGRwjHwERERESkcAx8RERGRwjHwERERESkcAx8RERGRwjHwERERESkcAx8RERGRwjHwERERESkcAx8RERGRwjHwERERESmcnrYLoPdn8IpEGKgytV0GEb3GigFW2i6BiBSKI3xERERECsfAR0RERKRwDHxEREREClcsAp+fnx+GDRum7TI+CDwWREREVFDF4qaNLVu2QF9fX9tlEBERERVLxSLwWVm9/zvXnj9/zpBJREREilDsTum6urpi2rRp6NGjB0xNTeHi4oI///wTDx48QOvWrWFqaorq1avjzJkz8vahoaGwtLTE1q1b4ebmBiMjIzRt2hS3b9+W1wkODoaXlxdWrlyJ8uXLw9DQEEIIJCcn46uvvoKdnR3Mzc3RuHFjnDt3Tt7u3LlzaNSoEczMzGBubo6PPvpI3vfNmzfRsmVLlCpVCiYmJqhatSp27twpbxsTE4OAgACYmprC3t4e3bt3x3///ScvT0tLk/vp6OiIefPmvatDTERERApWLALfqxYsWID69esjKioKgYGB6N69O3r06IFu3brh7NmzqFixInr06AEhhLzNkydPMH36dKxatQpHjx5FSkoKOnXqpNHuP//8g40bN2Lz5s2Ijo4GAAQGBuLevXvYuXMnIiMj4e3tjSZNmiAxMREA0LVrV5QpUwanT59GZGQkvvnmG3lkcODAgUhPT8ehQ4dw4cIFzJ49G6ampgCA+Ph4+Pr6wsvLC2fOnMHu3btx//59dOjQQa5n9OjRCAsLwx9//IG9e/ciPDwckZGRbzw+6enpSElJ0ZiIiIio5CoWp3RfFRAQgK+/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SUmBhYUFesyNg4FKe6fjiUj7Vgyw0nYJRJRP2Z/fycnJhb6crliO8BERERFR/jHwERERESlcvh/LQsXfor5WWr3DmoiIiLSDI3xERERECsfAR0RERKRwDHxERERECsfAR0RERKRwDHxERERECsfAR0RERKRwDHxERERECsfAR0RERKRwDHxERERECsfAR0RERKRwDHxERERECsfAR0RERKRwDHxERERECsfAR0RERKRwDHxERERECsfAR0RERKRwDHxERERECsfAR0RERKRwetougN6fwSsSYaDK1HYZRKQgKwZYabsEIsoHjvARERERKRwDHxEREZHCMfARERERKRwDXxEJDQ2FpaWl/Do4OBheXl5aq4eIiIgoGwNfMfJqqCQiIiLKDwY+IiIiIoVTVOATQmDOnDkoX748VCoVPD098fvvv0MIgU8//RT+/v4QQgAAkpKS4OzsjPHjx8vbb9u2DT4+PjAyMoKNjQ3atm0rL8vIyMCYMWNQunRpmJiYoE6dOggPDy9QfSEhIahSpQqMjIzg7u6OJUuWyMtu3LgBSZKwZcsWNGrUCMbGxvD09MTx48cBAOHh4ejVqxeSk5MhSRIkSUJwcPDbHywiIiIqMRQV+CZMmICQkBAsXboUFy9exPDhw9GtWzccOnQIq1atwqlTp/DDDz8AAPr16wd7e3s5NP31119o27YtAgMDERUVhQMHDsDHx0duu1evXjh69CjWr1+P8+fPo3379vD398e1a9fyVduKFSswfvx4TJ8+HZcuXcKMGTMwceJErFq1SmO98ePHY9SoUYiOjoabmxs6d+6MzMxM1KtXD99//z3Mzc0RHx+P+Ph4jBo1Ktd9paenIyUlRWMiIiKikksxD15OS0vD/PnzcfDgQdStWxcAUL58eRw5cgTLli3D2rVrsWzZMnTv3h3379/H9u3bERUVBX19fQDA9OnT0alTJ0yZMkVu09PTEwAQGxuLdevW4c6dO3BycgIAjBo1Crt370ZISAhmzJjxxvqmTp2KefPmyaOG5cqVQ0xMDJYtW4aePXvK640aNQqBgYEAgClTpqBq1ar4559/4O7uDgsLC0iSBAcHhzz3NXPmTI1+EBERUcmmmMAXExODZ8+eoWnTphrzMzIyULNmTQBA+/bt8ccff2DmzJlYunQp3Nzc5PWio6PRt2/fXNs+e/YshBAa6wMv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WhWGhoZwdXXFvHnz3n1HiIiISFEY+IrI+vXr0aFDB6xevRo9evR44/q3b99G27ZtERAQgOjoaHz55Zf45ptvNNaJjIxEhw4d0KlTJ1y4cAHBwcGYOHEiQkND82w7PT0dKSkpGhMRERGVXAx8RWDJkiXo168f/vzzT7Ru3Tpf2yxduhTly5fHggULULlyZXTt2hVBQUEa68yfPx9NmjTBxIkT4ebmhqCgIAwaNAjfffddnm3PnDkTFhYW8lS2bNm37RoREREpAANfIW3evBnDhg3D3r170ahRo3xvd+nSJXz88ceQJEmeV7du3Rzr1K9fX2Ne/fr1ce3aNWRlZb227XHjxiE5OVmebt++ne+6iIiISHkY+ArJy8sLtra2CAkJgRACAKCj8+KwZr8GgOfPn2ts9/Ky1xFCaATC/G5naGgIc3NzjYmIiIhKLga+QqpQoQLCwsLw559/YvDgwQAAW1tbAEB8fLy83ss3cACAh4cHTpw4oTHv1dceHh44cuSIxrxjx47Bzc0Nurq6RdUFIiIiUjgGviLg5uaGsLAw+fSuSqXCxx9/jFmzZiEmJgaHDh3ChAkTNLbp168fYmNjMWLECFy5cgVr167NcTPGyJEjceDAAUydOhVXr17FqlWrsHjxYowaNeo99o6IiIiKOwa+IlK5cmUcPHgQ69atw8iRI7Fy5Uo8f/4cPj4+GDp0KKZNm6axvrOzMzZv3ozt27fD09MTP/30E2bMmKGxjre3NzZu3Ij169ejWrVqmDRpEr799tscN3cQERER5UUS+bkojIq1lJQUWFhYoMfcOBioeD0fEZUsKwZYabsEoreS/fmdnJxc6OvxOcJHREREpHAMfEREREQKp6ftAuj9WdTXio9oISIiKoE4wkdERESkcAx8RERERArHwEdERESkcAx8RERERArHwEdERESkcAx8RERERArHwEdERESkcAx8RERERArHwEdERESkcAx8RERERArHwEdERESkcAx8RERERArHwEdERESkcAx8RERERArHwEdERESkcAx8RERERArHwEdERESkcAx8RERERAqnp+0C6P0ZvCIRBqpMbZdBRERUpFYMsNJ2CR88jvARERERKRwDHxEREZHCMfARERERKRwD31sKDw+HJElISkp6p/u5ceMGJElCdHT0O90PERERKRcDXz75+flh2LBh2i6DiIiIqMAY+IiIiIgUjoEvH4KCghAREYGFCxdCkiRIkoQbN24AACIjI+Hj4wNjY2PUq1cPV65ckbeLjY1F69atYW9vD1NTU9SqVQv79+/XaNvV1RUzZsxA7969YWZmBmdnZyxfvvy1tajVavTt2xdubm64efPmO+kvERERKQsDXz4sXLgQdevWRd++fREfH4/4+HiULVsWADB+/HjMmzcPZ86cgZ6eHnr37i1vl5qaioCAAOzfvx9RUVFo1qwZWrZsiVu3bmm0P2/ePPj4+CAqKgoDBgxA//79cfny5Rx1ZGRkoEOHDjhz5gyOHDkCFxeXXOtNT09HSkqKxkREREQlFwNfPlhYWMDAwADGxsZwcHCAg4MDdHV1AQDTp0+Hr68vPDw88M033+DYsWN49uwZAMDT0xNff/01qlevjkqVKmHatGkoX748tm3bptF+QEAABgwYgIoVK2Ls2LGwsbFBeHi4xjqpqakIDAzEvXv3EB4eDjs7u9fWO3PmTFhYWMhTdjglIiKikomBr5Bq1Kgh/9vR0REAkJCQAABIS0vDmDFj4OHhAUtLS5iamuLy5cs5RvhebkOSJDg4OMhtZOvcuTNSU1Oxd+9eWFhY5FnTuHHjkJycLE+3b98uVB+JiIioeGPgKyR9fX3535IkAXhxnR0AjB49Gps3b8b06dNx+PBhREdHo3r16sjIyHhtG9ntZLeRLSAgAOfPn8eJEyfeWJOhoSHMzc01JiIiIiq5+F26+WRgYICsrKwCbXP48GEEBQWhTZs2AF6cls2+2aOg+vfvj2rVqqFVq1b466+/4Ovr+1btEBERUcnDwJdPrq6uOHnyJG7cuAFTU9McI3C5qVixIrZs2YKWLVtCkiRMnDgxX9u9zuDBg5GVlYUWLVpg165daNCgwVu3RURERCUHT+nm06hRo6CrqwsPDw/Y2trmuA4vNwsWLECpUqVQr149tGzZEs2aNYO3t3eh6hg2bBimTJmCgIAAHDt2rFBtERERUckgCSGEtougdyslJQUWFhboMTcOBipez0dERMqyYoCVtkt4J7I/v5OTkwt9PT5H+IiIiIgUjoGPiIiISOF400YJsqivFR/RQkREVAJxhI+IiIhI4Rj4iIiIiBSOgY+IiIhI4Rj4iIiIiBSOgY+IiIhI4Rj4iIiIiBSOgY+IiIhI4fgcvhIg+9vzUlJStFwJERER5Vf253ZRfAsuA18J8PDhQwBA2bJltVwJERERFdTDhw9hYWFRqDYY+EoAK6sXXyp969atQr9hPjQpKSkoW7Ysbt++rbhvEWHfiif2rXhSct8AZfdPyX1LTk6Gs7Oz/DleGAx8JYCOzotLNS0sLBT3y5DN3NycfSuG2LfiiX0rvpTcPyX3LftzvFBtFEEdRERERPQBY+AjIiIiUjgGvhLA0NAQkydPhqGhobZLKXLsW/HEvhVP7FvxpeT+sW/5I4miuNeXiIiIiD5YHOEjIiIiUjgGPiIiIiKFY+AjIiIiUjgGPiIiIiKFY+AjIiIiUjgGPoVbsmQJypUrByMjI3z00Uc4fPiwtksqtJkzZ6JWrVowMzODnZ0dPv/8c1y5ckXbZb0TM2fOhCRJGDZsmLZLKTL//vsvunXrBmtraxgbG8PLywuRkZHaLqvQMjMzMWHCBJQrVw4qlQrly5fHt99+C7Vare3SCuzQoUNo2bIlnJycIEkStm7dqrFcCIHg4GA4OTlBpVLBz88PFy9e1E6xBZRX354/f46xY8eievXqMDExgZOTE3r06IG7d+9qr+ACeNPP7WVff/01JEnC999//97qK4z89O3SpUto1aoVLCwsYGZmho8//hi3bt16/8UW0Jv6lpqaikGDBqFMmTJQqVSoUqUKli5dWuD9MPAp2IYNGzBs2DCMHz8eUVFR+OSTT9C8efNi8QuQl4iICAwcOBAnTpzAvn37kJmZic8++wxpaWnaLq1InT59GsuXL0eNGjW0XUqRefToEerXrw99fX3s2rULMTExmDdvHiwtLbVdWqHNnj0bP/30ExYvXoxLly5hzpw5+O6777Bo0SJtl1ZgaWlp8PT0xOLFi3NdPmfOHMyfPx+LFy/G6dOn4eDggKZNm+Lx48fvudKCy6tvT548wdmzZzFx4kScPXsWW7ZswdWrV9GqVSstVFpwb/q5Zdu6dStOnjwJJyen91RZ4b2pb7GxsWjQoAHc3d0RHh6Oc+fOYeLEiTAyMnrPlRbcm/o2fPhw7N69G2vWrMGlS5cwfPhwDB48GH/++WfBdiRIsWrXri369eunMc/d3V188803Wqro3UhISBAAREREhLZLKTKPHz8WlSpVEvv27RO+vr5i6NCh2i6pSIwdO1Y0aNBA22W8E4GBgaJ3794a89q2bSu6deumpYqKBgDxxx9/yK/VarVwcHAQs2bNkuc9e/ZMWFhYiJ9++kkLFb69V/uWm1OnTgkA4ubNm++nqCLyur7duXNHlC5dWvz999/CxcVFLFiw4L3XVli59a1jx47F/ndNiNz7VrVqVfHtt99qzPP29hYTJkwoUNsc4VOojIwMREZG4rPPPtOY/9lnn+HYsWNaqurdSE5OBgBYWVlpuZKiM3DgQAQGBuLTTz/VdilFatu2bfDx8UH79u1hZ2eHmjVrYsWKFdouq0g0aNAABw4cwNWrVwEA586dw5EjRxAQEKDlyopWXFwc7t27p/G3xdDQEL6+vor72wK8+PsiSZIiRqHVajW6d++O0aNHo2rVqtoup8io1Wr89ddfcHNzQ7NmzWBnZ4c6derkeUq7OGnQoAG2bduGf//9F0IIhIWF4erVq2jWrFmB2mHgU6j//vsPWVlZsLe315hvb2+Pe/fuaamqoieEwIgRI9CgQQNUq1ZN2+UUifXr1+Ps2bOYOXOmtkspctevX8fSpUtRqVIl7NmzB/369cOQIUOwevVqbZdWaGPHjkXnzp3h7u4OfX191KxZE8OGDUPnzp21XVqRyv77ofS/LQDw7NkzfPPNN+jSpQvMzc21XU6hzZ49G3p6ehgyZIi2SylSCQkJSE1NxaxZs+Dv74+9e/eiTZs2aNu2LSIiIrRdXqH98MMP8PDwQJkyZWBgYAB/f38sWbIEDRo0KFA7eu+oPvpASJKk8VoIkWNecTZo0CCcP38eR44c0XYpReL27dsYOnQo9u7dWyyuPSkotVoNHx8fzJgxAwBQs2ZNXLx4EUuXLkWPHj20XF3hbNiwAWvWrMHatWtRtWpVREdHY9iwYXByckLPnj21XV6RU/rflufPn6NTp05Qq9VYsmSJtssptMjISCxcuBBnz55V1M8JgHxjVOvWrTF8+HAAgJeXF44dO4affvoJvr6+2iyv0H744QecOHEC27Ztg4uLCw4dOoQBAwbA0dGxQGeBGPgUysbGBrq6ujn+x52QkJDjf+bF1eDBg7Ft2zYcOnQIZcqU0XY5RSIyMhIJCQn46KOP5HlZWVk4dOgQFi9ejPT0dOjq6mqxwsJxdHSEh4eHxrwqVapg8+bNWqqo6IwePRrffPMNOnXqBACoXr06bt68iZkzZyoq8Dk4OAB4MdLn6Ogoz1fS35bnz5+jQ4cOiIuLw8GDBxUxunf48GEkJCTA2dlZnpeVlYWRI0fi+++/x40bN7RXXCHZ2NhAT08v178txX0w4OnTp/jf//6HP/74A4GBgQCAGjVqIDo6GnPnzi1Q4OMpXYUyMDDARx99hH379mnM37dvH+rVq6elqoqGEAKDBg3Cli1bcPDgQZQrV07bJRWZJk2a4MKFC4iOjpYnHx8fdO3aFdHR0cU67AFA/fr1czxC5+rVq3BxcdFSRUXnyZMn0NHR/JOqq6tbLB/Lkpdy5crBwcFB429LRkYGIiIiiv3fFuD/w961a9ewf/9+WFtba7ukItG9e3ecP39e42+Lk5MTRo8ejT179mi7vEIxMDBArVq1FPm35fnz53j+/HmR/G3hCJ+CjRgxAt27d4ePjw/q1q2L5cuX49atW+jXr5+2SyuUgQMHYu3atfjzzz9hZmYmj2JaWFhApVJpubrCMTMzy3EtoomJCaytrRVxjeLw4cNRr149zJgxAx06dMCpU6ewfPlyLF++XNulFVrLli0xffp0ODs7o2rVqoiKisL8+fPRu3dvbZdWYKmpqfjnn3/k13FxcYiOjoaVlRWcnZ0xbNgwzJgxA5UqVUKlSpUwY8YMGBsbo0uXLlqsOn/y6puTkxPatWuHs2fPYseOHcjKypL/vlhZWcHAwEBbZefLm35ur4ZXfX19ODg4oHLlyu+71AJ7U99Gjx6Njh07omHDhmjUqBF2796N7du3Izw8XHtF59Ob+ubr64vRo0dDpVLBxcUFERERWL16NebPn1+wHRXi7mEqBn788Ufh4uIiDAwMhLe3tyIeXQIg1ykkJETbpb0TSnosixBCbN++XVSrVk0YGhoKd3d3sXz5cm2XVCRSUlLE0KFDhbOzszAyMhLly5cX48ePF+np6dourcDCwsJy/R3r2bOnEOLFo1kmT54sHBwchKGhoWjYsKG4cOGCdovOp7z6FhcX99q/L2FhYdou/Y3e9HN7VXF6LEt++vbLL7+IihUrCiMjI+Hp6Sm2bt2qvYIL4E19i4+PF0FBQcLJyUkYGRmJypUri3nz5gm1Wl2g/UhCCFGwiEhERERExQmv4SMiIiJSOAY+IiIiIoVj4CMiIiJSOAY+IiIiIoVj4CMiIiJSOAY+IiIiIoVj4CMiIiJSOAY+IiIiIoVj4CMiIiJSOAY+IiIiIoVj4CMiIiJSuP8Ddv2Fcq62IhYAAAAASUVORK5CYII=", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAn4AAAGzCAYAAACxThqXAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAUC5JREFUeJzt3Qm8jHX///GP7XDsa5ayFLIvWSpRlIosKW2kUNEiCnHjln0tS4m7TYvc0U6bqMiubEVESLbuFGWLbvv8H+/v/bvmP3Occ5zjbGau1/PxGM5cM3NtM2fmfT7fZTIFAoGAAQAAIOplzugdAAAAQPog+AEAAPgEwQ8AAMAnCH4AAAA+QfADAADwCYIfAACATxD8AAAAfILgBwAA4BMEPwAAAJ8g+AFIlgULFlimTJns/ffft2jWsWNHK1OmTJLvmzt37nPelrbTokWLJJ97/Z9cfnneztXKlSvtqquusly5crnztGbNGrd8zpw5VrNmTcuRI4dbfuDAgWS9NiLV4MGD3fEi+hD84Gt6Y0vK5Vw+aJPrhRdesDvuuMNKlSrltqkPl4Tow+fBBx+0IkWKuA+qa6+91r799tskbef555+3KVOmpOKe+8Pff//tPgzT47UQTaZPn27PPvusnc9OnDjhfvf27dtnzzzzjP373/+20qVL259//ml33nmnxcbG2r/+9S+3XL9v6WHDhg3u9bZ9+/Z02R78I2tG7wCQkfRGHmrq1Kn25ZdfnrG8UqVKab4vTz31lP311192+eWX2+7duxO83+nTp6158+a2du1a6927txUuXNiFuUaNGtnq1autfPnyiW5H99VjEguWMJs8ebI716HBb8iQIe5nneuMcM0119h///tfi4mJsUgKfuvXr7fu3bvb+Wrr1q22Y8cO95x36tQpuFzVPv1ODhs2zK6//voEXxtpFfz0etNrLdqri0hfBD/42j333BN2/ZtvvnHBL+7y9LBw4cJgtS+xZkM11S1btszee+89u/32290yVSUuvfRSGzRokPugRcply5bNzjeZM2d2TY5IXXv27HH/58+fP0nLz8fXBpBUNPUCZ3HkyBF74oknrGTJkpY9e3arUKGCjR071gKBQNj9FNi6du1q06ZNc/fRB3Tt2rVt0aJFSdqOmpaS0qdGwa9o0aLWunXr4DI1+Sr8ffTRR3bs2LEEH6vKwQ8//OBCpteMHVq9+vnnn12TV8GCBS1nzpx25ZVX2qxZs866T9qm+qjly5fPhVJRRURNfFWqVHHnQvv80EMP2f79+8/YJz12yZIlrtqp+15yySWu+hq3OU4VEFU0dZ9ChQpZgwYNXFBPrEk8S5Ys9txzzwWX/fHHHy5A6fGhz+EjjzxixYoVC14P7cel5jadY9E+eOdOTXGh/vOf/9gtt9zigrvu36tXLzt16pQl1dnOQUJ9/NQMqfurSVKPX7x4sXte46tM6nkZMWKEXXTRRW47jRs3tp9++umM+y1fvtyaNm3qnlO9Fho2bGhLly4Nu4+qYark6Tzpd+OCCy6wG264IdjtQNvX60fVNO+cJaV69eabb7rj0HYLFCjgKp1ffPHFGZVrvba03RIlStijjz7qnu/kHoeeZy0Tvfa93wldOnTo4JbXrVs3rPtFfH38UvP1rq4Y2hdRN46zdTnR+5Fu13mOq1+/fq5C7O2HXhtelxKdO72v9ejRw1WSE6PfAW0jvm4iCf0u3H///e48aDs6L6+99toZj504caK7zXuu69Spwx+vaS0AIOjRRx9VEgheP336dOC6664LZMqUKdCpU6fApEmTAi1btnT36d69e9hjtaxq1aqBwoULB4YOHRp46qmnAqVLlw7ExsYG1q1bl6z9yJUrV6BDhw7x3lauXLnATTfddMbyV155xe3D999/n+B6Z86cGbjooosCFStWDPz73/92ly+++MLd9ttvvwWKFi0ayJMnT6B///6B8ePHB2rUqBHInDlzYMaMGcF1zJ8/323nvffec9f//vvvwA033BAoUKBAYMWKFcH76XxlzZo10Llz58CLL74Y6NOnjzuuunXrBo4fPx68n85RhQoV3Lb/+c9/unNcq1Ytd87Xr18fvJ9u0zKtb/LkyYFx48YF2rZtGxg9enSi57J69eqB2267Lewc6Jh0DKHrr1KlSuD2228PXtf5177J4cOHAy+88IJ7zK233ho8d2vXrg3eN0eOHG4d999/v7uvtqn7P//884nuX3LOgXfu9b9H69eyq6++OvDcc88FevbsGShYsGCgbNmygYYNG57x2MsuuyxQu3btwDPPPBMYPHhwIGfOnIHLL788bH/mzZsXiImJCdSrV8+dZ91X51HLli9fHrzf3Xff7ZZpm3r96TWv348333zT3a7XVs2aNd3vhHfOdP4To33Sfl511VWBMWPGBCZMmOC2o9ePZ9CgQe4+119/fWDixImBrl27BrJkyXLGayspx7Fs2TJ3zrW+xx57LPg7ocuDDz7oluv3Wct137ivjbR4vW/dutXti7at+3jnTr+j8dmxY4d7/NNPP33GbZdcckmgefPmwevdunULNGvWLDBy5MjASy+9FHjggQfcuQt97YeeY8+2bdvc9ddff/2MbWi57u/Rfup9pmTJku7c6ffh5ptvdvfTc+B5+eWX3TJtW/ui51r7o2NH2iH4AYkEvw8//NBdHz58eNj99EalN9qffvopuEz302XVqlVhb8gKBAoLqRX8dJvCRVyzZs1y258zZ06i61Y4CQ0EHgVZPX7x4sXBZX/99Vfg4osvDpQpUyZw6tSpM4Kfbte69MH+3XffBR+ndeg+06ZNC9uG9i3ucn0QatmiRYuCy/bs2RPInj174IknngguUwgN/QBLznOqD1mPQso111wTuOCCC9wHkvz555/u+dQHjyfuh/vevXvP+IALva8XEEJ5IetsknoO4ga/Y8eOBQoVKuTCxYkTJ4L3mzJlirtffMGvUqVK7nEeHbOWe3+c6I+d8uXLB5o0aeJ+9ijg67WgkO/Jly+fO7+J0XMWNyQlZMuWLS6U6/fFe715vH3ReVFwu/HGG8PuowCl43jttdeSfRxx/5jxKORo+cqVK8OWx31tpMXrXfsSN+QnRuE27mtNf4hpHVOnTg07/rhGjRrlXv96v0qN4KfwVrx48cAff/wRdr82bdq414y3D61atXLvR0hfNPUCifjss89cU+Fjjz0WtlxNv3q/mz17dtjyevXqueZdj5pTWrVqZZ9//nmymvwSoyYZNZ3E5fX9OluTTWLHqqYnNZ961GSp0cNq5lFn81AHDx60G2+80X788UfXBKUpLzzqf6imNTX7qWnVu+jcaJ3z588PW1flypXt6quvDl5XM6may9X07FE/KzVTb9myJVnHpfX+/vvvtmnTpmBTl5oOtVw/i5rd9HyG7sO5ePjhh8/YdugxJCYp5yCuVatWuZGnnTt3tqxZ/3+X7Xbt2rlms/jcd999YYNDvG1629E0JjrHd999t1u399ypy4OahdV1wRvYoOdETam//vqrpYYPP/zQrXvgwIGuOT6U1w1i7ty5dvz4cdfEHHofnYO8efMGuyYk5zhSKi1e78l11113ucFdGqji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z5/fChYsaK1atbLt27dnyPEAABBpNA3N008/beXKlbPs2bNbqVKlbMSIEe62devW2XXXXec+jwsVKmQPPvigHT58OOzxr7zyilWqVMlNtaKm3Oeffz54m+YyXL16tQ0dOtT9PHjwYDctS9euXd2kzHqMAuGoUaMsoxH80oHa/FetWmUff/yxff31126yxmbNmtmJEycsb9681qJFC5s+fXrYY6ZNm2a33HKLC4q6X5MmTVwQXLx4sS1dutSVkZs2bepeWAk5duyYC5ahFwAA/Khfv342evRoGzBggG3YsMF97hYtWtSOHDniPmNVnFm5cqW99957NnfuXBfaQj+TBw4c6ILixo0bbeTIkW49b7zxhrtd32RSpUoVe+KJJ9zPvXr1sueee8597r/77ruu+VfrKFOmjGU0mnrTmCp7euIV1q666iq3TE++Jr/88MMP7Y477rB27drZvffe66p7CnoKaLNmzXJVP3nnnXfcXyr6a8ObIf3111931b8FCxbYjTfeGO+29ZfFkCFD0vFoAQA4//z11182YcIEmzRpknXo0MEtK1u2rDVo0MAmT55sR48etalTp7o+eqL7tWzZ0p566ikXDtV/b9y4cda6dWt3+8UXX+zC40svveTWV6xYMfdduyrK6GfZuXOn+xYObUOf3edLEzAVvzSmvwz0YrjiiiuCy1RGrlChgrtNVP3TjN0KiPLBBx+4SuD111/vrq9du9Z++uknV/HTi0oXNffqhao+BYn9dXPw4MHgRc3FAAD4jT5v1QrWuHHjeG+rUaNGMPRJ/fr1XcFFlTpVBPVZ+8ADDwQ/g3UZPnx4op/B3ghffd4/9thj9sUXX9j5gIrfeUDfdXj77be7snObNm3c/3fddZcLjKJ+BrVr13aVwriKFCmS4HrVh0EXAAD8TH33ztXh/+vrp8pgaBFH9J3FCalVq5b77l314VfTsfrpq6Dz/vvvW0ai4pfG1BH05MmTtnz58uCyP//80/0VUbly5eAyNffOmTPHfvjhB/vqq6/c9dAXj5qML7jgAtcpNfSSL1++dD8mAAAiiZpcFf7mzZsX7+e0WtZU2fOoe5a+Qk3VOjX1lihRwn7++eczPoPV5JsYtd6pkKPQqG5batHbty995zyMi+CXDi82jcDt3LmzLVmyxL247rnnHrvwwgvdcs8111zj+gUo8OmFFPpXhZYV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UaNG9t5779nHH3/sBquoErhixYqwiqeCn6qGFSpUsFtuucWNEi5VqlSS9q1Tp05uOhetp1q1aq4qqQmZkzMVjkb2an/vuusuK1KkiJtUGwAA4GwyBRKanwVRR4M7VGlsP3abxcSen300AZx/JncpmNG7APjaof/7/FYLZkrHWERlxQ8AAABnIvgBAAD4RNQN7sDZTexc8LydjgcAAKQdKn4AAAA+QfADAADwCYIfAACATxD8AAAAfILgBwAA4BMEPwAAAJ8g+AEAAPgEwQ8AAMAnCH4AAAA+QfADAADwCYIfAACATxD8AAAAfILgBwAA4BMEPwAAAJ8g+AEAAPgEwQ8AAMAnCH4AAAA+QfADAADwiawZvQNIf90m77OY2JMZvRsAosTkLgUzehcAJBEVPwAAAJ8g+AEAAPgEwQ8AAMAnCH4AAAA+QfADAADwCYIfAACAT0RN8JszZ441aNDA8ufPb4UKFbIWLVrY1q1b3W233367de3aNXjf7t27W6ZMmezHH390148fP265cuWyuXPnuuunT5+2UaNG2cUXX2yxsbFWo0YNe//994OP379/v7Vr186KFCnibi9fvry9/vrrwdvXrVtn1113nbtN+/Lggw/a4cOHg7d37NjRbrnlFhs5cqQVLVrU7fPQoUPt5MmT1rt3bytYsKBddNFFYeuUXbt22Z133unur/u0atXKtm/fnoZnFQAARJOoCX5Hjhyxnj172qpVq2zevHmWOXNmu/XWW12Ia9iwoS1YsCB434ULF1rhwoWDy1auXGknTpywq666yl1X6Js6daq9+OKL9sMPP1iPHj3snnvucY+TAQMG2IYNG2z27Nm2ceNGe+GFF9z6vP1o0qSJFShQwK33vffec4EyNHjKV199Zb/++qstWrTIxo8fb4MGDXJhVY9bvny5Pfzww/bQQw/ZL7/84u6v/dN68+TJY4sXL7alS5da7ty5rWnTpi64xufYsWN26NChsAsAAPCvTIFAIGBR6I8//nAVOVXfdIiq2v3++++WNWtWK1asmAtv69evt7fffttGjBhhn332mQtTCkuqpims1atXL7i+Tp062d9//23Tp0+3m2++2QW911577YztTp482fr06eOqc6oiitbdsmVLF/RU4VPFT6Hz559/dgFVKlasaBdccIELgnLq1CnLly+fvfLKK9amTRt78803bfjw4S5oqlopCnyq/n344Yd24403nrEvgwcPtiFDhpyxvP3YbRYTmzcVzzYAP2MCZyBtqXCjTHDw4EHLmzdln99RU/HbsmWLtW3b1i655BJ3UsqUKeOW79y506pWrerCnCp2qpZddtllrrrmVfD0f6NGjdzPP/30kwt4N9xwg6uoeRdVAL2m40ceecQFxpo1a9o//vEPW7ZsWXA/FMwUMr3QJ/Xr13eVx02bNgWXValSJRj6RIGwWrVqwetZsmRxzcR79uxx19euXev2TRU/b590TEePHg3uV1z9+vVzLxLvojAKAAD8K2q+sk0VtdKlS7uKW4kSJVzQUuBTVUwVsmuuucZV2bJnz+5CXvXq1V11T1U/BbdevXq59Xh98WbNmmUXXnhh2Db0WLnppptsx44drpL35ZdfWuPGje3RRx+1sWPHJnl/s2XLFnZd+xjfMh2Ht1+1a9e2adOmnbEuVTbjo/319hkAACAqgt+ff/7pqmkKfVdffbVbtmTJkrD7qJ+fblcQUtOuqm0Kg2PGjHEBUFU5qVy5sruPKoV6TEIUtjp06OAu2qYGZSj4VapUyaZMmeL6+nlVPzUha3sVKlQ452OsVauWvfPOO645OKVlXgAA4E9R0dSrARFqFn355Zddc6gGTmigRyhV+TQgQ4M1NPrXW6YKWp06dYIhTU2pqv5pQMcbb7zhmlG//fZbmzhxorsuAwcOtI8++shtS+v79NNPXeATjfbNkSOHC4SqJs6fP9+6detm9957r2vOPVdar/oVaiSvmqu3bdvmKpiPPfZYcAAIAABA1Ac/VdPU52716tWueVehTZW8UOo/p4EQ6pen/nFe8NMgCq9/n2fYsGFu8IdG9yrQaeSsmn41vYvExMS4/nNqLlbVUP3xtH3JmTOnff7557Zv3z6rW7eum0pGTcGTJk1K0TFqvRr4UapUKWvdurXbrwceeMD18aMCCAAAfD2qFwmPCmJUL4DUxKheIG0xqhcAAADJRvADAADwiagY1Yvkmdi5IP0CAQDwISp+AAAAPkHwAwAA8AmCHwAAgE8Q/AAAAHyC4AcAAOATBD8AAACfIPgBAAD4BMEPAADAJwh+AAAAPkHwAwAA8AmCHwAAgE8Q/AAAAHyC4AcAAOATBD8AAACfIPgBAAD4BMEPAADAJwh+AAAAPkHwAwAA8ImsGb0DSH/dJu+zmNiTGb0bAHxkcpeCGb0LAKj4AQAA+AfBDwAAwCcIfgAAAD5B8DtH27dvt0yZMtmaNWtSvK7ffvvNbrjhBsuVK5flz58/SY9ZsGCB2/6BAwdSvH0AAOAPDO44DzzzzDO2e/duFyLz5cuX0bsDAACiFMEvAx0/ftxiYmJs69atVrt2bStfvnxG7xIAAIhiEdnU++mnn7om0VOnTrnrqpSp2bNv377B+3Tq1Mnuuece9/MHH3xgVapUsezZs1uZMmVs3LhxYevTspEjR9r9999vefLksVKlStnLL78cdp8VK1bYZZddZjly5LA6derYd999d8Z+rV+/3m666SbLnTu3FS1a1O699177448/grc3atTIunbtat27d7fChQtbkyZN3La1f1OnTnXH0LFjx3ibkdWkq2Vq4gUAAPBN8Lv66qvtr7/+CoavhQsXuiAVGoq0TEFr9erVduedd1qbNm1s3bp1NnjwYBswYIBNmTIlbJ0Kg16g69Kliz3yyCO2adMmd9vhw4etRYsWVrlyZbc+raNXr15hj1cwu+6661w4XLVqlc2ZM8d+//13t+1Qb7zxhqvyLV261F588UVbuXKlNW3a1N1Pzb0TJkxItfN07NgxO3ToUNgFAAD4V0Q29aofXM2aNV3QU1jT/z169LAhQ4a4kHbw4EH76aefrGHDhi6kNW7c2IU9ufTSS23Dhg02ZswYV13zNGvWzAU+6dOnj+t3N3/+fKtQoYJNnz7dTp8+ba+++qqr+Kl6+Msvv7hw6Jk0aZILfaocel577TUrWbKkbd682W1X1Jz79NNPhx2PKpGxsbFWrFgxd33//v2pcp5GjRrlzgkAAEDEVvxEoU6BLxAI2OLFi61169ZWqVIlW7Jkiav2lShRwoWsjRs3Wv369cMeq+tbtmwJNhVL9erVgz+rSVUhbM+ePe661qHbFfo89erVC1vn2rVrXVBUM693qVixortNffg86suXXvr16+dCsHfZtWtXum0bAACcfyKy4idqxlVFTYErW7ZsLmRpmcKgKmYKhsmhdYRS+FOVL6lUaWzZsqU99dRTZ9xWvHjx4M+asuVsMmf+Xx5XqPWcOHHCkkuVRF0AAAAiuuLn9fNTk6wX8rzgp4t+FlUB1Z8ulK6r6TVLlixJ2pbW8f3339vRo0eDy7755puw+9SqVct++OEHN1ijXLlyYZekhL1QRYoUcf+rz58nNeYLBAAA/haxwa9AgQKu+XXatGnBkHfNNdfYt99+6/rUeWHwiSeesHnz5tmwYcPccg2uUH+8uIMzEnP33Xe7CmDnzp1d/8DPPvvMxo4dG3afRx991Pbt22dt27Z1AzbUvPv555/bfffdF9aknBTq73fllVfa6NGjXTOzmq6ffPLJZK0DAAAgaoKfKNwpVHnBr2DBgm7krfrnaVCGV4l799137e2337aqVavawIEDbejQoWEDO85G/fU++eQTNypYAzj69+9/RpOu+hSqkqj9ufHGG61atWpu2hZNO+M13SaHmrFPnjzp+gRqPcOHD0/2OgAAAEJlCoR2JENU03QuGhHdfuw2i4nNm9G7A8BHJncpmNG7AET857cGaubNm9e/FT8AAAAkHcEPAADAJyJ2Ohecu4mdC6a4VAwAACIPFT8AAACfIPgBAAD4BMEPAADAJwh+AAAAPkHwAwAA8AmCHwAAgE8Q/AAAAHyC4AcAAOATBD8AAACfIPgBAAD4BMEPAADAJwh+AAAAPkHwAwAA8AmCHwAAgE8Q/AAAAHyC4AcAAOATBD8AAACfIPgBAAD4RNaM3gGkv26T91lM7MmM3g0APjW5S8GM3gXAt6j4AQAA+ATBDwAAwCcIfgAAAD5B8EsFjRo1su7du6fa+hYsWGCZMmWyAwcOpNo6AQAACH4AAAA+QfADAADwCYJfGpg1a5bly5fPRowY4Zps16xZE7xNzbdapuZcz2effWaXXnqpxcbG2rXXXmvbt28/Y50ffPCBValSxbJnz25lypSxcePGpdvxAACA6EDwS2XTp0+3tm3b2rRp06xdu3Znvf+uXbusdevW1rJlSxcQO3XqZH379g27z+rVq+3OO++0Nm3a2Lp162zw4ME2YMAAmzJlSqLrPnbsmB06dCjsAgAA/Ivgl4r+9a9/WZcuXeyTTz6xFi1aJOkxL7zwgpUtW9ZV8CpUqODCYseOHcPuM378eGvcuLELe6oM6vauXbvamDFjEl33qFGjXOXRu5QsWTJFxwcAACIbwS+VvP/++9ajRw/78ssvrWHDhkl+3MaNG+2KK64IW1avXr0z7lO/fv2wZbq+ZcsWO3XqVILr7tevnx08eDB4UXURAAD4F8EvlVx22WVWpEgRe+211ywQCLhlmTP/7/R61+XEiRPptk/qD5g3b96wCwAA8C+CXypRc+38+fPto48+sm7durllCoKye/fu4P1CB3pIpUqVbMWKFWHLvvnmmzPus3Tp0rBluq5m3yxZsqT6sQAAgOhE8EtFCmIKfxqBqwmdNUr3yiuvtNGjR7vm2oULF9qTTz4Z9piHH37YNdn27t3bNm3a5AaHxB208cQTT9i8efNs2LBhtnnzZnvjjTds0qRJ1qtXr3Q+QgAAEMkIfqlMAzS++uore+utt1xgU9PvyZMnrXbt2i4MDh8+POz+pUqVckHxww8/tBo1atiLL75oI0eODLtPrVq17N1337W3337bqlatagMHDrShQ4eeMQgEAAAgMZkCoR3QENU0nYtG97Yfu81iYunvByBjTO5SMKN3AYjIz28N1Expf30qfgAAAD5B8AMAAPCJrBm9A0h/EzsXZGoXAAB8iIofAACATxD8AAAAfILgBwAA4BMEPwAAAJ8g+AEAAPgEwQ8AAMAnCH4AAAA+QfADAADwCYIfAACATxD8AAAAfILgBwAA4BMEPwAAAJ8g+AEAAPgEwQ8AAMAnCH4AAAA+QfADAADwCYIfAACATxD8AAAAfCJrRu8A0l+3yfssJvZkRu8GAAARYXKXghYtqPgBAAD4BMEPAADAJwh+AAAAPkHwS4EFCxZYpkyZ7MCBA2m6ne3bt7vtrFmzJk23AwAAohvBLxkaNWpk3bt3z+jdAAAAOCcEPwAAAJ8g+CVRx44dbeHChTZhwgTX7KqLmmBl9erVVqdOHcuZM6ddddVVtmnTpuDjtm7daq1atbKiRYta7ty5rW7dujZ37tywdZcpU8ZGjhxp999/v+XJk8dKlSplL7/8coL7curUKXffihUr2s6dO9PwqAEAQDQh+CWRAl+9evWsc+fOtnv3bncpWbKku61///42btw4W7VqlWXNmtWFMs/hw4etWbNmNm/ePPvuu++sadOm1rJlyzMCmx6v8Kj7dOnSxR555JGwAOk5duyY3XHHHa6/3+LFi11ITIjue+jQobALAADwL4JfEuXLl89iYmJcVa9YsWLukiVLFnfbiBEjrGHDhla5cmXr27evLVu2zI4ePepuq1Gjhj300ENWtWpVK1++vA0bNszKli1rH3/8cdj6FQ4V+MqVK2d9+vSxwoUL2/z588PuoxDZvHlz27t3r7utSJEiie7zqFGj3H57Fy+oAgAAfyL4pYLq1asHfy5evLj7f8+ePcGw1qtXL6tUqZLlz5/fNfdu3LjxjIpf6DrUjKxg6a3D07ZtWzty5Ih98cUXLsidTb9+/ezgwYPBy65du1J8rAAAIHIR/FJBtmzZwkKbnD592v2v0Ddz5kzXh09Ns2qirVatmh0/fjzBdXjr8dYRWhX8/vvv7euvv07SfmXPnt3y5s0bdgEAAP7Fd/Umg5p6NbAiOZYuXeoGhtx6663BCqA3KCS51O9PTcY333yzzZo1yzUvAwAAJBXBLxk0+nb58uUuuKnJNm5FLj7q1zdjxgw3oENVvAEDBiTpcQnp1q2bC58tWrSw2bNnW4MGDc55XQAAwF9o6k0GNdtqQIcGcWhgRVKmUhk/frwVKFDATfOi8NekSROrVatWivZDk0gPGTLENf1qIAkAAEBSZAoEAoEk3RMRT9O5aFBI+7HbLCaW/n4AACTF5C4F7Xz4/NZAzZT216fiBwAA4BMEPwAAAJ9gcIcPTexckKldAADwISp+AAAAPkHwAwAA8AmCHwAAgE8Q/AAAAHyC4AcAAOATBD8AAACfIPgBAAD4BPP4+Yj37Xz66hcAABAZvM/t1PiWXYKfj/z555/u/5IlS2b0rgAAgHP4HNd39qYEwc9HChb835dM79y5M8UvnPPxryEF2l27dkXdt5JwbJGJY4tMHFtkiuZjk4MHD1qpUqWCn+MpQfDzkcyZ/9elU6EvGn8xRMfFsUUeji0ycWyRiWOL/M/xFK0jVfYEAAAA5z2CHwAAgE8Q/Hwke/bsNmjQIPd/tOHYIhPHFpk4tsjEsUWu1Dy+TIHUGBsMAACA8x4VPwAAAJ8g+AEAAPgEwQ8AAMAnCH4AAAA+QfADAADwCYKfT/zrX/+yMmXKWI4cOeyKK66wFStWWKQbNWqU1a1b1/LkyWMXXHCB3XLLLbZp0yaLRqNHj7ZMmTJZ9+7dLRr85z//sXvuuccKFSpksbGxVq1aNVu1apVFg1OnTtmAAQPs4osvdsdWtmxZGzZsWKp8uXp6W7RokbVs2dJKlCjhXn8ffvhh2O06poEDB1rx4sXdsV5//fW2ZcsWi/RjO3HihPXp08e9LnPlyuXu0759e/v1118tGp63UA8//LC7z7PPPmvRcmwbN260m2++2X1LlZ4/fU7oq0oj/dgOHz5sXbt2tYsuusj9vlWuXNlefPHFZG+H4OcD77zzjvXs2dPNAfTtt99ajRo1rEmTJrZnzx6LZAsXLrRHH33UvvnmG/vyyy/dm/WNN95oR44csWiycuVKe+mll6x69eoWDfbv32/169e3bNmy2ezZs23Dhg02btw4K1CggEWDp556yl544QWbNGmS+wDS9aefftomTpxokUa/S3q/0B+O8dFxPffcc+7DZ/ny5e5DVu8tR48etUg+tr///tu9VyrA6/8ZM2a4PyoVJqLhefPMnDnTvX8qaESKsx3b1q1brUGDBlaxYkVbsGCBff/99+55VNEj0o+tZ8+eNmfOHHvzzTfde4sKAQqCH3/8cfI2pHn8EN0uv/zywKOPPhq8furUqUCJEiUCo0aNCkSTPXv2qKQSWLhwYSBa/PXXX4Hy5csHvvzyy0DDhg0Djz/+eCDS9enTJ9CgQYNAtGrevHng/vvvD1vWunXrQLt27QKRTL9bM2fODF4/ffp0oFixYoExY8YElx04cCCQPXv2wFtvvRWI5GOLz4oVK9z9duzYEYiGY/vll18CF154YWD9+vWB0qVLB5555plApInv2O66667APffcE4h0Fs+xValSJTB06NCwZbVq1Qr0798/Weum4hfljh8/bqtXr3ZNMKFf8qzrX3/9tUWTgwcPuv8LFixo0UIVzebNm4c9f5FOf53WqVPH7rjjDtdEf9lll9nkyZMtWlx11VU2b94827x5s7u+du1aW7Jkid10000WTbZt22a//fZb2GtTTWvqShJt7y3e+4ua3/Lnz2+R7vTp03bvvfda7969rUqVKhYtdFyzZs2ySy+91FWe9f6i12NiTd2R9t6i9091lVE2nD9/vnufUUtXchD8otwff/zh+hwVLVo0bLmu6007mn7hVfZWE2LVqlUtGrz99tuumUl9GaPJzz//7JpCy5cvb59//rk98sgj9thjj9kbb7xh0aBv377Wpk0b19Sk5mwFW70227VrZ9HEe/+I9vcWUdO1+vy1bdvW8ubNa5FO3Q+yZs3qfu+iibovqR+c+kQ3bdrUvvjiC7v11lutdevWrmtQpJs4caLr16c+fjExMe4Y1Sx8zTXXJGs9WdNsD4F0roytX7/eVVaiwa5du+zxxx93fRcjoW9KckO6Kn4jR4501xWM9Nypn1iHDh0s0r377rs2bdo0mz59uqumrFmzxgU/9aOKhuPzG/UdvvPOO12FRX+wRDq1AE2YMMH9UakKZrS9t0irVq2sR48e7ueaNWvasmXL3PtLw4YNLdKDn/pkqupXunRpNxhEn316b0lOqxAVvyhXuHBhy5Ili/3+++9hy3W9WLFiFg3UufXTTz91ZW/9JRQN9Oasv15r1arl/jLXRX+xqiO9flYVN1JpBKj+ag1VqVKliBh1lxRqPvOqfhoVqiY1fQhFW+XWe/+I5vcWL/Tt2LHD/REWDdW+xYsXu/eWUqVKBd9bdHxPPPGEm/kh0j/vdDzR+P7y3//+1/75z3/a+PHj3chfDfbTZ99dd91lY8eOTda6CH5RTuXg2rVruz5HoX8V6Xq9evUskukvcL3wNTLtq6++ctNnRIvGjRvbunXrXLXIu6hKpuZC/awwH6nUHB932h31U9FfsNFAI0LVjzaUni+vGhEt9PumgBf63nLo0CE3ujfS31tCQ5+mp5k7d66beiga6A8RjXQNfW9RxUh/sKjrRaR/3mnqlmh8fzlx4oS7pMZ7C029PqAh4GpiUnC4/PLL3XxNGjZ+3333WSRTiVvNaR999JGby8/rV6QO5prjKJLpeOL2VdRUGfrwifQ+jKp+qZOymnr1wao5JV9++WV3iQb6a3zEiBGuoqKm3u+++879lX7//fdbpFF/qZ9++ilsQIeCggZQ6fjUhD18+HDXX1NBUNNmKERoTs1IPjZVpW+//XbXHKrWBFXYvfcX3a6AEcnPW9wQq76oCvEVKlSw893Zjk0BVlUw9Xu79tpr3fQnn3zyiZvaJdKPrWHDhu749PmmIKtWoKlTp7r3l2RJlXHHOO9NnDgxUKpUqUBMTIyb3uWbb74JRDq9fOO7vP7664FoFC3Tucgnn3wSqFq1qpv6o2LFioGXX345EC0OHTrknif9vuXIkSNwySWXuOkWjh07Fog08+fPj/d3rEOHDsEpXQYMGBAoWrSoey4bN24c2LRpUyDSj23btm0Jvr/ocZH+vMUVSdO5JOXYXn311UC5cuXc71+NGjUCH374YSAajm337t2Bjh07uunYdGwVKlQIjBs3zv0eJkcm/ZP6uRUAAADnG/r4AQAA+ATBDwAAwCcIfgAAAD5B8AMAAPAJgh8AAIBPEPwAAAB8guAHAADgEwQ/AAAAnyD4AQAA+ATBDwAAwCcIfgAAAOYP/w+CMUYv17Ha5AAAAABJRU5ErkJggg==", "text/plain": [ "
" ] @@ -3295,15 +3850,23 @@ " title='Top 10 tokens with highest coeffient values');" ] }, + { + "cell_type": "markdown", + "id": "66bc9491", + "metadata": {}, + "source": [ + "Este código crea un gráfico de barras horizontal que muestra las 10 palabras (tokens) con los coeficientes más altos (más positivas) del modelo de regresión logística. Ordena esas palabras de mayor a menor coeficiente y las grafica para visualizar cuáles son las más importantes o influyentes para predecir la clase positiva. El color de las barras es azul y el gráfico tiene un título descriptivo." + ] + }, { "cell_type": "code", - "execution_count": 64, + "execution_count": 220, "id": "159e00c6-8a9f-484f-aea2-853fd5512083", "metadata": {}, "outputs": [ { "data": { - "image/png": "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WvoPpg8aNAg//vhjoSXGwmBqaqr1XK1WY8SIERg7dmyGvpUrV8br16/Rrl07tGvXDps2bYKNjQ0iIyPh6emZ4SKDTp06YdeuXbhx4wZcXFyyrUOhUECh4EwZERERZS/Pt9lYt25dYdTxQU6fPp3heY0aNbKc0WrQoAGuX78OJyenTF+/evUqnj17hrlz52pmuM6dO5dp37lz58LMzAweHh4ICwvTml0jIiIiyo8S8cvmUVFRGD9+PG7fvo0tW7Zg2bJl+Pbbb7PsP3nyZJw6dQqjR4/GpUuXcOfOHezZswdjxowB8G4WzcjICMuWLcP9+/exZ88ezJgxI8v1LVy4EP369UPr1q1x69atAh8fERERlS4lIqANGDAAb9++RePGjTF69GiMGTMGw4cPz7K/q6srjh49ijt37uCzzz5D/fr14evrC3t7ewCAjY0NgoKCsGPHDtSpUwdz587FwoULs60hMDAQvXr1QuvWrfHXX38V6PiIiIiodMn1VZxU8NKvAuFVnESFj1dxElFBKYqrOEvEDBoRERFRScKARkRERCQzeb6KkwqezdBpxeq2JURERFS4OINGREREJDMMaEREREQyw4BGREREJDMMaEREREQyw4BGREREJDMMaEREREQyw4BGREREJDMMaEREREQyw4BGREREJDMMaEREREQyw4BGREREJDMMaEREREQyw4BGREREJDMMaEREREQyw4BGREREJDMMaEREREQyw4BGREREJDMMaEREREQyY6DrAgiIXTsdiUqFrssgoiJkO2qWrksgIhnjDBoRERGRzDCgEREREckMAxoRERGRzJTogObu7o5x48bpugwiIiKiPCnRAY2IiIioOGJAK2DJycm6LoGIiIiKuRIf0NRqNSZNmgQrKyvY2dnB399f81pkZCS6dOkCMzMzWFhYoFevXvjnn380r3t5eaFr165a6xs3bhzc3d01z93d3eHt7Y3x48fD2toabdu2LeQRERERUUlX4gPa+vXrYWpqioiICMyfPx/Tp09HSEgIhBDo2rUr4uLicPToUYSEhODevXvo3bt3vrZhYGCA8PBwrF69Ost+SUlJUKlUWg8iIiKi95X4G9W6urrCz88PAFCjRg0sX74coaGhAIArV67gwYMHcHBwAABs3LgRH330Ec6ePYtGjRrlehtOTk6YP39+jv3mzJmDgICAfIyCiIiISpMSP4Pm6uqq9dze3h4xMTG4efMmHBwcNOEMAOrUqYMyZcrg5s2bedqGm5tbrvr5+PggPj5e84iKisrTdoiIiKh0KPEzaIaGhlrPJUmCWq2GEAKSJGXo/+92PT09CCG0Xk9JScmwjKmpaa5qUSgUUCj4k05ERESUvRI/g5aVOnXqIDIyUmsW68aNG4iPj0ft2rUBADY2Nnjy5InWcpcuXSrKMomIiKgUKrUBrU2bNnB1dUW/fv1w4cIFnDlzBgMGDEDLli01hyxbt26Nc+fOYcOGDbhz5w78/Pxw7do1HVdOREREJV2pDWiSJCE4OBhly5ZFixYt0KZNG1SrVg3btm3T9PH09ISvry8mTZqERo0aISEhAQMGDNBh1URERFQaSOL9k6yoyKhUKlhaWuLuogkwV/LcNKLSxHbULF2XQET5lP79HR8fDwsLi0LZRqmdQSMiIiKSKwY0IiIiIpkp8bfZKA5shk4rtClSIiIiKn44g0ZEREQkMwxoRERERDLDgEZEREQkMwxoRERERDLDgEZEREQkMwxoRERERDLDgEZEREQkMwxoRERERDLDgEZEREQkMwxoRERERDLDgEZEREQkMwxoRERERDLDgEZEREQkMwxoRERERDLDgEZEREQkMwxoRERERDLDgEZEREQkMwxoRERERDJjoOsCCIhdOx2JSoWuyyCiYsR21Cxdl0BEhYgzaEREREQyw4BGREREJDMMaEREREQyw4CWC2FhYZAkCS9fvtR1KURERFQKMKDlwieffIInT57A0tJS16UQERFRKVDqA1pycnKOfYyMjGBnZwdJkoqgIiIiIirtSl1Ac3d3h7e3N8aPHw9ra2vUqFEDkiTh0qVLmj4vX76EJEkICwsDkPEQZ1BQEMqUKYMDBw6gdu3aMDMzQ/v27fHkyZOiHxARERGVOKUuoAHA+vXrYWBggPDwcBw4cCBf63jz5g0WLlyIjRs34tixY4iMjMTEiROzXSYpKQkqlUrrQURERPS+UhnQnJycMH/+fDg7O8PY2Dhf60hJScGqVavg5uaGBg0awNvbG6GhodkuM2fOHFhaWmoeDg4O+do2ERERlWylMqC5ubl98DpMTExQvXp1zXN7e3vExMRku4yPjw/i4+M1j6ioqA+ug4iIiEqeUvlTT6amppr/r6f3LqMKITRtKSkpOa7D0NBQ67kkSVrryIxCoYBCwZ90IiIiouyVyhm0f7OxsQEArRP8/33BABEREVFRK5UzaP+mVCrRtGlTzJ07F1WqVMGzZ88wdepUXZdFREREpVipn0EDgF9//RUpKSlwc3PDt99+i5kzZ+q6JCIiIirFJJHTiVNUaFQqFSwtLXF30QSYK3luGhHlnu2oWbougajUSv/+jo+Ph4WFRaFsgzNoRERERDLDgEZEREQkM6X+IgE5sBk6rdCmSImIiKj44QwaERERkcwwoBERERHJDAMaERERkcwwoBERERHJDAMaERERkcwwoBERERHJDAMaERERkcwwoBERERHJDAMaERERkcwwoBERERHJDAMaERERkcwwoBERERHJDAMaERERkcwwoBERERHJDAMaERERkcwwoBERERHJDAMaERERkcwwoBERERHJjIGuCyAgdu10JCoVui6DiIop21GzdF0CERUwzqARERERyQwDGhEREZHMMKARERERyQwDGhEREZHMMKARERERyQwD2v+XkpKi6xKIiIiIAJSAgLZz5064uLhAqVSiXLlyaNOmDV6/fg0A+PXXX/HRRx9BoVDA3t4e3t7emuUkScKqVavQpUsXmJqaYubMmQCAP/74Aw0bNoSxsTGqVauGgIAApKamAgAmTJiAzz//XLOOJUuWQJIk/Pnnn5o2Z2dnrF69uiiGTkRERCVUsQ5oT548QZ8+fTB48GDcvHkTYWFh6N69O4QQWLlyJUaPHo3hw4fj6tWr2LNnD5ycnLSW9/PzQ5cuXXD16lUMHjwYBw4cwNdff42xY8fixo0bWL16NYKCgjBr1rt7DLm7u+P48eNQq9UAgKNHj8La2hpHjx4FADx9+hR//fUXWrZsmWm9SUlJUKlUWg8iIiKi90lCCKHrIvLrwoULaNiwIR4+fAhHR0et1ypWrIhBgwZpZsbeJ0kSxo0bh8DAQE1bixYt0KFDB/j4+GjaNm3ahEmTJiE6Ohrx8fGwsrLCmTNn0KBBA9jY2GDixInYvXs3zpw5gy1btuC7777D06dPM92mv78/AgICMrTfXTQB5rxRLRHlE29US1S0VCoVLC0tER8fDwsLi0LZRrGeQatbty48PDzg4uKCnj17Ys2aNXjx4gViYmIQHR0NDw+PbJd3c3PTen7+/HlMnz4dZmZmmsewYcPw5MkTvHnzBpaWlqhXrx7CwsJw9epV6Onp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", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmgAAAGzCAYAAACb/us4AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAR2JJREFUeJzt3QmczfX+x/HPCGPs2UIhRUh2KrlFUbSjVW5RaRFFRLmVLSJRxA3lZolK25XbjptdUiFboogboTBDsp//4/2993f+54wZZpiZ8zvnvJ6PxzHO7/zmd37bnN/7fLdfQiAQCBgAAAB8I1ekVwAAAADhCGgAAAA+Q0ADAADwGQIaAACAzxDQAAAAfIaABgAA4DMENAAAAJ8hoAEAAPgMAQ0AAMBnCGhAjJk9e7YlJCTYu+++a7Gsffv2dvbZZ2d43oIFC570ezVp0sQ9kH22bdtmN998sxUvXtydv8OHD3fT161bZ1dddZUVKVLETZ82bZpNmDDB/X/jxo0W63/H+on4RECDr+kDKiOPnPgQGz16tN1yyy1Wvnx595666Kdn9+7ddv/991vJkiWtQIECdvnll9u3336bofd5+eWX3QUImbNv3z7r27cvF7RUFi5c6PaLzkk/e/TRR+2zzz6zXr162euvv24tWrRw09u1a2crVqywgQMHuun169fPkfXhfEKk5Y70CgDHow/kUJMmTbIZM2YcM71atWrZvi7PPfec7dmzxy688ELbunVruvMdPXrUrr32Wlu+fLn16NHDSpQo4UKXSmC++eYbq1y58nHfR/Pqd44XAGH26quvun0dekHt16+f+z+lXeEBTftF51PRokXNr/7973/bjTfeaI899lhw2p9//mmLFi2yJ5980jp37hycfuedd9rtt99uiYmJ2bY+nE+INAIafO2vf/1r2PMvv/zSBbTU03PCnDlzgqVnx6suU9WiLorvvPOOq7KRW2+91c477zzr06ePvfHGGzm41rErT548kV4FZKHt27cfEyB37Njhfqaeftppp7kHEMuo4kTU++OPP6x79+5Wrlw59426SpUqNnToUAsEAmHzKVjpW/iUKVPcPPny5bN69erZ3LlzM/Q+FSpUcMs4EQW0M844w1q3bh2cpqpOhbQPPvjADhw4kO7vqk3VqlWrXBj0qm9Dv73/9NNPrpq1WLFilj9/frv44ovto48+OuE66T2vu+46145H4VFU+qR2PtWrV3f7Quv8wAMP2K5du45ZJ/3u/PnzXemh5j3nnHNcaWaoQ4cOuRIHlRBqHrUl+stf/uICdXpU7aYL7UsvvRSc9ttvv1muXLnc74cew44dO1rp0qXTbIOmtkjax6J18PadqqhC/fLLL9ayZUsXsDW/SmuOHDliJxso7r33XrfftL21atWyiRMnhs1Tt27dsPNAatSo4dbtu+++C06bOnWqm7ZmzZqwdb3nnnvc8nVe6zi99tprx6zHyJEj3Ws6H04//XRXBeh9CdD2qxRXKlasGNwvJ2q7tXjxYrvmmmvc8lRFX7NmTRsxYsQxJV6XXnqpe10BSqVfoeuf0e3w2pPpWP/9738PO3b6mxNtg6Z5xzu9NmiffPJJcJ0KFSrkSrL195RWe8TjnQsZPZ88X3/9tXs99fEXVdvqtQ8//NA9//nnn+2hhx5yn0FJSUnuPNffdEba02n70ypZT6uNpP7m9YWwUqVKbr/r87Fnz57HfP7o71N/pzqG2hdar7/97W8nXBdkP0rQENX0oX7DDTfYF1984S6WtWvXdh+I+kDXB/CLL74YNr+Cjy6GjzzyiPvQUnWi2rp89dVXdsEFF2TJOi1dutRdmBUyQincvPLKK/bDDz+4i3RaFJgefvhh90Gpah3Rhc1rRH3JJZe4qhetvz7YdUHQ9isUtmrVKs1lqppIF09dRGbOnGkNGjRw0xXGdKG7++673fI2bNhgo0aNcuu/YMGCsBKq9evXu9JA7WO1CdIFVhcKBVxdcEUXr0GDBlmHDh3ctqakpLj3VNu7K6+8Ms1100VB+10hWesgCoK6oO3cudNWr14dXP68efPcxTctupiqjaBCnPaDF4oULDy6+DZv3twuuugiF+C1L4YNG2bnnnuu+73M0D7VBVH7RaFf4UclptonCp1dunRx82l933zzzeDvaZsUGHRuaHu89dP/tQ1eVb2OtcK396VCryl8aP9rv3bt2jVYzav9pmOj99y/f78LfgpYd9xxh9sPOt+0DvpbUNW5t7/Sowu2AnmZMmXcMhWKFbwUMLzt0r67+uqrXVDXcdf+UFBs1KiRO95ekMrIdlx22WWuyYKqLXWe3HXXXcFjp/NDbdPatGnjAuPxSq61DJ2bOsZqjqC/E50TCh86p0M7lJzoXMjI+RRKoVj74u2333brEEqfNwq6ej9ZsmSJ+5KkKtqzzjrLBTO9l84nne8K2qdKX770uaC/JbWF1Xmldnw6B3Q+qKOF6FzUsdZ29e/f330m6pzW3z98IABEkU6dOqlIJfh82rRp7vmAAQPC5rv55psDCQkJgfXr1wenaT49vv766+C0n3/+OZAvX75Aq1atMrUeBQoUCLRr1y7d1+65555jpn/00Ufu/T/99NPjLrt69eqBxo0bHzO9a9eu7vfnzZsXnLZnz55AxYoVA2effXbgyJEjbtoXX3zh5nvnnXfc61pWiRIlAkuXLg3+npaheaZMmRL2Hlq31NMrVKjgps2dOzc4bfv27YHExMRA9+7dg9Nq1aoVuPbaawMnc0zPOOOM4PNu3boFLrvsskCpUqUCo0ePdtN+//13dzxHjBgRnE/7X+vm2bFjh1vPPn36HPMemlev9e/fP2x6nTp1AvXq1TvhOmofhh6T4cOHu+VNnjw5OO3gwYOBhg0bBgoWLBhISUlx03QMNN/q1avd8+nTp7v9dsMNNwRuu+224O/WrFkz7By89957A2XKlAn89ttvYetx++23B4oUKRLYt2+fe37jjTe68+V4nn/+ebcOGzZsOOF2Hj582J1P2q+7du0Ke+3o0aPB/9euXdsdHx0Xz/LlywO5cuUK3HXXXZneDtE66lwIpXXWdG1DqPHjx4dtk87zokWLBu67776w+X799Vf3PqHTM3ouHO98SkuvXr0CefLkCezcuTM47cCBA269Qj8PQrfZs2jRIvdekyZNCk7z/o7106PjktbnTurz8/XXX3fHIvSzQsaMGeOWuWDBAvf8xRdfdM+1rfAfqjgR1T7++GNXReaVvnhU5anPfH1bD9WwYUNX6uNRmzKVLqnU7WSrulJTaUJajZdVDea9frLbqpIplQh4VKKgb8j6Fq5v36GSk5Pd8ATff/+964mm0kWPSntU3akSC1Upeg/tGy1TJZKhzj///LDSK5UwqCpEVa4elXboG7mGRcgMLVclLWvXrg2WJqlURdP1f1FJgI5neiVoGfXggw8e896h25CZY6GSJZXseFTiqPNw7969rqTWW7541ejaHpVgar9726YSt5UrVwbn1Xa+9957dv3117v/hx4flcLouHo9grXP//Of/7hSmaygkiaVpKpkK3W7L696Xx1kli1b5koLVdXuUSmMtkv7JrPbcapU6qf9qOMR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X6xChQpWvHhxizYxH9DU/bhnz55WrFgxK126tPXt2zf42qZNm+zGG290ybpw4cJ266232rZt24Kvq2i0ZcuWYcvr2rWrqzr16P+dO3d200uUKGHNmzfPoS0DACC6r89DhgyxSpUqWWJiopUvX94GDvxvVemKFSvsiiuucMNdKFzdf//9tnfv3rDfHzdunFWrVs0NgaEqzJdffjn4msaC++abb6x///7u/7r2qwBF12sNPqvfUXAbNGiQ+VXMV3FOnDjRunXrZosXL7ZFixa50NWoUSNr2rRpMJzNmTPH3SKjU6dOdtttt9ns2bMz/R4dO3a0BQsWHHe+AwcOuIcnJSXlpLcLAIBo1qtXL3v11VftxRdfdCVduhuC2o398ccfrrCjYcOGtmTJEtu+fbt16NDBhasJEya4350yZYr17t3bRo0aZXXq1LGlS5fafffd56o027Vr55bVrFkza9GihT322GPuWv/SSy/Z9OnT7e2333ZhcPPmze7hVzEf0GrWrOnqoUWjAetgzpo1K5jQNUqwBviTSZMmWfXq1d0J0aBBgwy/h5arbwEnoqTer1+/k94WAABiwZ49e2zEiBHumqxAJeeee64Lagpt+/fvd9dkBS7RfNdff70999xzdsYZZ7jr+rBhw6x169bu9YoVK9rq1att7NixbnmqMdO9NBXM9H+v1kzXa72HStVUguZnueIhoIVS0abS+Jo1a1ww88KZnH/++Va0aFH3WmbUq1cvw98WkpOTgw8/J3cAALKLrrOqUVJtVlqv1apVKxjORDVfqhJVg3+VsKl92b333usCmPcYMGCAm54er0dnlSpV7JFHHrHPP//c/CzmS9B0q4ZQSs06yBkdRVj35Ap16NChY+YLPYmOR3XsegAAEM/Utuxk7f1fWzSVtF100UVhr+mepOmpW7euqzX75JNPbObMma7duapB3333XfOjmC9BS48aFqauf1bx6O7du11JmpQsWdLVY4eKtnFUAADwG1U1KqR5TY5SX5+XL1/uSso8auOtQhOVfqmKUzeG/+mnn1wHg9CHqjqPRx0C1dZc4W7q1Kn23nvv2c6dO82PYr4ELT1KzTVq1LC2bdu6gWzVSeChhx6yxo0bW/369d086kHy/PPPu3pwNVacPHmyrVy50jVIBAAAJ0e9KB9//HE3ykLevHldFeaOHTts1apV7rrcp08f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AAD4DAENAADAZwhoAAAAPkNA+59Dhw5FehUAAABiI6C9++67VqNGDUtKSrLixYtbs2bN7I8//nCvvfbaa1a9enVLTEy0MmXKWOfOnYO/l5CQYKNHj7YbbrjBChQoYAMH/reb+wcffGB169a1fPny2TnnnGP9+vWzw4cPu9cee+wxu+6664LLGD58uFvOp59+GpxWqVIlGzduXA7uAQAAEGuiOqBt3brV2rRpY/fcc4+tWbPGZs+eba1bt7ZAIODCV6dOnez++++3FStW2PTp0114CtW3b19r1aqVe13LmDdvnt11113WpUsXW716tY0dO9YmTJgQDG+NGze2+fPn25EjR9zzOXPmWIkSJdz7yi+//GI//vijNWnSJM31PXDggKWkpIQ9AAAAUksIKM1EqW+//dbq1atnGzdutAoVKoS9duaZZ9rdd99tAwYMSPN3VfLVtWtXe/HFF4PTVPrWtGlT69WrV3Da5MmTrWfPnrZlyxbbvXu3K6VbvHixe1+Fsx49eti0adPsyy+/tClTptjjjz9u//nPf9J8TwVClciltn5YdyvEQLVA3GKgWiC6pKSkWJEiRSw5OdkKFy6cLe8R1SVotWrVcoFKVZy33HKLvfrqq7Zr1y7bvn27C1R67Xjq168f9nz58uXWv39/K1iwYPBx3333uZK6ffv2WdGiRd17qsRMpW558+Z1JXRLly61vXv3uhI1lbKlR8FPB9N7bN68Ocv2BQAAiB1Rfaun0047zWbMmGELFy60zz//3EaOHGlPPvmkzZo1K0O/r7ZnoRSyVMKlatLU1CZNVH2pgKZ2bQpjxYoVs2rVqrmqTwW07t27p/t++h09AAAAYjageVWVjRo1co/evXu7qk6FtrPPPtsFtcsvvzzDy1LngLVr1x7TVi2UQpk6H+TOndtatGgRDG1vvvmm/fDDD+m2PwMAAIiLgKa2YAphV111lZUqVco937FjhyvRUnuvBx980E2/+uqrbc+ePbZgwQJ7+OGH012eAp56aZYvX95uvvlmy5Url6v2XLlyZbAt22WXXeaW9eGHH9rgwYPdNIUyza+eouedd16ObT8AAIhNUR3Q1DBv7ty5brgLNdhT6dmwYcNcIJP9+/e7TgAaHkMN+hWijqd58+YueKkd2nPPPWd58uSxqlWrWocOHYLznH766a7N27Zt29xrXmg7evTocdufAQAAxEUvzljpBUIvTiC+0YsTiC4p9OIEAACIPwQ0AAAAn4nqNmixomSH3tlWRAoAAKIPJWgAAAA+Q0ADAADwGQIaAACAzxDQAAAAfIaABgAA4DMENAAAAJ8hoAEAAPgMAQ0AAMBnCGgAAAA+Q0ADAADwGQIaAACAzxDQAAAAfIaABgAA4DMENAAAAJ8hoAEAAPgMAQ0AAMBnCGgAAAA+Q0ADAADwmdyRXgGY7RjX3/YnJUZ6NQDEmVIdB0Z6FQCkgxI0AAAAnyGgAQAA+AwBDQAAwGcIaBkwe/ZsS0hIsN27d0d6VQAAQBwgoGXAJZdcYlu3brUiRYpEelUAAEAciPuAdvDgwRPOkzdvXitdurQrRQMAAMhucRfQmjRpYp07d7auXbtaiRIlrHnz5i54LVu2LDiPqjI1TVWbaVVxTpgwwYoWLWqfffaZVatWzQoWLGgtWrRwpWwAAACnKu4CmkycONGVii1YsMDGjBlzUsvYt2+fDR061F5//XWbO3eubdq0yR577LHj/s6BAwcsJSUl7AEAAJBaXAa0ypUr25AhQ6xKlSqWmHhyA8QeOnTIhbv69etb3bp1XancrFmzjvs7gwYNcu3YvEe5cuVOcgsAAEAsi8uAVq9evVNeRv78+e3cc88NPi9Tpoxt3779uL/Tq1cvS05ODj42b958yusBAABiT1ze6qlAgQLB/+fK9d+MGggEwkrHTiRPnjxhz9VGLXQZaVFp3cmW2AEAgPgRlyVooUqWLOl+hjbwD+0wAAAAkNPisgQtVFJSkl188cU2ePBgq1ixoqumfOqppyK9WgAAII7FfQmavPbaa3b48GHXNk3DbwwYMCDSqwQAAOJYQuBEDaeQbTTMhnpzrh/W3Qol0TYNQM4q1XFgpFcBiOrrd3JyshUuXDhb3oMSNAAAAJ8hoAEAAPhM3HcS8IOSHXpnWxEpAACIPpSgAQAA+AwBDQAAwGcIaAAAAD5DQAMAAPAZAhoAAIDPENAAAAB8hoAGAADgMwQ0AAAAnyGgAQAA+AwBDQAAwGcIaAAAAD5DQAMAAPAZAhoAAIDPENAAAAB8hoAGAADgMwQ0AAAAnyGgAQAA+AwBDQAAwGdyR3oFYLZjXH/bn5QY6dUAgKhWquPASK8CkGUoQQMAAPAZAhoAAIDPENAAAAB8hoCWAbNnz7aEhATbvXt3pFcFAADEAQIaAACAz8RVQDt48GCkVwEAACC+A1qTJk2sc+fO1rVrVytRooQ1b97cVVUuW7YsOI+qLTVN1Ziejz/+2M477zxLSkqyyy+/3DZu3HjMsufPn2+XXnqpm6dcuXL2yCOP2B9//JFj2wYAAGJXTAc0mThxouXNm9cWLFhgY8aMOeH8mzdvttatW9v111/vglyHDh3siSeeCJvnxx9/tBYtWthNN91k3333nU2dOtUFNoXB4zlw4IClpKSEPQAAAOIuoFWuXNmGDBliVapUscTEEw8GO3r0aDv33HNt2LBh7nfatm1r7du3D5tn0KBBbrpK5rT8Sy65xF566SWbNGmS7d+/P91l6/eKFCkSfKjkDQAAIO4CWr169TI1/5o1a+yiiy4Km9awYcOw58uXL7cJEyZYwYIFgw9Vnx49etQ2bNiQ7rJ79eplycnJwYdK6wAAAOLuVk8FChQI/j9Xrv/m0UAgEJx26NChTC9z79699sADD7h2Z6mVL18+3d9TCV5GSvEAAEB8i/mAFqpkyZLu59atW61OnTru/6EdBqRatWo2ffr0sGlffvll2PO6deva6tWrrVKlStm+zgAAIP7EfBVnKPW4vPjii23w4MGuKnPOnDn21FNPhc3z4IMP2rp166xHjx62du1ae+ONN1x1ZqjHH3/cFi5c6DoFKOBp/g8++OCEnQQAAAAyIq4Cmrz22mt2+PBh1zZNjfwHDBhwTBXle++9Z9OmTbNatWq5np/PPvts2Dw1a9Z04e6HH35wQ22oNK53795WtmzZHN4aAAAQixICoQ2ykKM0zIZ6c64f1t0KJdE2DQBORamOAyO9Coiz63dycrIVLlw4W94j7krQAAAA/I6ABgAA4DNx1YvTr0p26J1tRaQAACD6UIIGAADgMwQ0AAAAnyGgAQAA+AwBDQAAwGcIaAAAAD5DQAMAAPAZAhoAAIDPMA5aBHl32dItIwAAQHRI+d91OzvvlklAi6Dff//d/SxXrlykVwUAAJzEdVz35MwOBLQIKlasmPu5adOmbDvAkfx2oeC5efPmmLtLAtsWndi26MS2Ra9Y3r7k5GQrX7588DqeHQhoEZQr13+bACqcxdrJ69F2sW3Rh22LTmxbdIrlbYv17cv1v+t4tiw725YMAACAk0JAAwAA8BkCWgQlJiZanz593M9Yw7ZFJ7YtOrFt0SmWty3Wty8xB7YtIZCdfUQBAACQaZSgAQAA+AwBDQAAwGcIaAAAAD5DQAMAAPAZAhoAAIDPENAi5O9//7udffbZli9fPrvooovsq6++sli0ceNGu/fee61ixYqWlJRk5557ruuafPDgQYslBw4csNq1a1tCQoItW7bMYsVHH33kzk8du9NPP91atmxpseCHH36wG2+80UqUKOFGOP/LX/5iX3zxhUWjgQMH2iWXXGL58+e3okWLpjmPbid37bXXunlKlSplPXr0sMOHD1u0b9vy5cutTZs27nZCOkerVatmI0aMsFg5bqH3ezzrrLPc58vu3bstVrZtwoQJVrNmTXcd1HnZqVMni4VtW7JkiTVt2tS9rs/N5s2bu3M1swhoETB16lTr1q2bCyrffvut1apVyx3A7du3W6z5/vvv7ejRozZ27FhbtWqVvfjiizZmzBj729/+ZrGkZ8+eVrZsWYsl7733nt1555129913uw+XBQsW2B133GGx4LrrrnMB5d///rd988037m9Q03799VeLNvqyc8stt1jHjh3TfP3IkSMunGm+hQsX2sSJE92FsXfv3hbt26Zjpwv75MmT3efLk08+ab169bJRo0ZZtG9bKH3JVZCJFhnZthdeeMEdryeeeMIdu5kzZ7rrYLRv2969e61FixbuPp2LFy+2+fPnW6FChdy2HTp0KHNvpnHQkLMuvPDCQKdOnYLPjxw5Eihbtmxg0KBBgXgwZMiQQMWKFQOx4uOPPw5UrVo1sGrVKo0pGFi6dGkg2h06dChw5plnBsaNGxeINTt27HDHae7cucFpKSkpbtqMGTMC0Wr8+PGBIkWKpHl+5sqVK/Drr78Gp40ePTpQuHDhwIEDBwLRvG1peeihhwKXX355IFqcaNtefvnlQOPGjQOzZs1y5+iuXbsC0b5tO3fuDCQlJQVmzpwZiFbj09m2JUuWuOO0adOm4LTvvvvOTVu3bl2m3oMStAikb33ra9asWdjNVvV80aJFFg+Sk5OtWLFiFgu2bdtm9913n73++uuuyDtWqGT3l19+cedmnTp1rEyZMnb11VfbypUrLdoVL17cqlSpYpMmTbI//vjDlaSphFclMfXq1bNYo8+VGjVq2BlnnBGcpm/zKSkpruQi1sTS58vq1autf//+7lzNzpty57QZM2a4mhV9xqhaWtW3t956q23evNmiXZUqVdxnzD/+8Q93vf/zzz/d/7WdataUGbFzxKPEb7/95qocQj8sRc+jsXols9avX28jR460Bx54wKKdbsLRvn17e/DBB61+/foWS3766Sf3s2/fvvbUU0/Zhx9+6NpSNGnSxHbu3GnRTO14VJ2ydOlSV/Wg9i+qbvn000/dNsYafa6k9XnjvRZLVIWrJiT333+/xUK7VrWve/755111Wax9viigPfvsszZ8+HB799133efKlVdeGfXtkwsVKmSzZ8921e5qF1mwYEH32fLJJ59Y7ty5M7UsAhpOitoN6EJ3vIfan4XStyXVzav+XqVO0b5tCpp79uxxbV6iRUa3TR+eojYiN910kytZGj9+vHv9nXfesWjeNgVrNUZWidm8efNcBx11frj++utt69atFq1/X9Eiu7ZNpbvq+KG2vVdddZVF+7bpc0WlLn/961/ND7Jy2/T5ovZYL730kivNvfjii+3NN9+0devWRaSzzhNZuG0qMVObwUaNGtmXX37p2u5ecMEFrh2oXsuMzMU5nDL1GjvttNNc1VgoPS9durRFi+7du7vSo+M555xzgv/fsmWLXX755a73yyuvvGKxsG1qYK7qo9Q3y1VpWtu2bV1j7GjdNi+onH/++cHp2k69ph6B0X7cVCK4a9cu14NTXn75ZVftomOmD+to+/s6Hn2upO4l7n3+ROIzJyu3LbQqUL3mVHKmEt9Iycpt03m6YsUKV7ok3m2zdQ3RF6d+/fpZtG6bmkyk/nwpWbKk27ZIfL50z8Jte+ONN9zoBbo2eNXSmqbS+Q8++MBuv/32DK8XAS2H5c2b15VGzJo1Kzhkgb5N6Hnnzp0tWuiPSY+MUMmZwplXCuP3thQZ3TZ9+xswYEBYCNW3QVWxaGiKaN42HSsFsrVr17ohKETfePXBU6FCBYvmbdu3b5/7mfo81HOv5DCa/r5OpGHDhm5oAPUSV6mhKIwqnIZeIKNx20Tt6K644gpr166d285IysptUy/q0BIXDd1wzz33uFJfDVcUzdum0iXR54van4mqONUEKBKfLyWzcNv0+aLPEpW6ebznmf18IaBFgIbY0IeJSlouvPBCVwevxsoaziDWKJyp3ZL+6IYOHWo7duwIvhZNJYZpSd0uRG0NRB+e3odOtNLFW23rVF2kMaZ0/NQWRlRFHc0UWPRtVn+DGmpC7UReffVV27Bhg6uGiDYqcdDFTT/VvtUbh69SpUrunFR1n4KYhkwZMmSIa3emUiZV86Yu/Y22bVO1psKZvhjpc9VrU6daiqwMgZHYttQhTOFFVO15onHT/L5t5513nquO7tKli6tR0eeNqnSrVq3qvsxH87ZdeeWVbpxB/X09/PDDLpQNHjzYtT/L9LZlSX9TZNrIkSMD5cuXD+TNm9cNu/Hll18GYpG6Ius0S+sRazZs2BAzw2zIwYMHA927dw+UKlUqUKhQoUCzZs0CK1euDMQCdYW/6qqrAsWKFXPbdvHFF7vhKKJRu3bt0vz7+uKLL4LzbNy4MXD11Ve7oQ1KlCjhjquGUon2bevTp0+ar1eoUCEQC8ctlKZHyzAbGdm25OTkwD333BMoWrSo+zts1apV2NAU0bxtn3/+eaBRo0ZuGI7TTz89cMUVVwQWLVqU6fdK0D/ZkzMBAABwMvzdGAgAACAOEdAAAAB8hoAGAADgMwQ0AAAAnyGgAQAA+AwBDQAAwGcIaAAAAD5DQAMAAPAZAhoAAIDPENAAAAB8hoAGAABg/vJ/M8SZelSf+3UAAAAASUVORK5CYII=", "text/plain": [ "
" ] @@ -3321,6 +3884,14 @@ " title='Top 10 tokens with lowest coeffient values');" ] }, + { + "cell_type": "markdown", + "id": "7f43b0c3", + "metadata": {}, + "source": [ + "Muestra un gráfico con las 10 palabras más relacionadas con sentimientos negativos según el modelo." + ] + }, { "cell_type": "markdown", "id": "2eed48ea-fd35-4585-9b98-90456aaee447", @@ -3350,7 +3921,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -3364,7 +3935,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.4" + "version": "3.13.5" } }, "nbformat": 4, From 112ba9e6d7735d14edd69bf5fd5f84ddb698641b Mon Sep 17 00:00:00 2001 From: jbonilla1234 Date: Tue, 29 Jul 2025 11:36:21 -0500 Subject: [PATCH 2/4] =?UTF-8?q?Ejercicio=201=20literal=20b=2001=5Fpreproce?= =?UTF-8?q?ssing.ipynb=20comentarios=20=20de=20los=20pasos=20de=20c=C3=B3d?= =?UTF-8?q?igo=20del=20notebook?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lessons/01_preprocessing.ipynb | 603 ++++++++++++++++++++++++++++++++- 1 file changed, 600 insertions(+), 3 deletions(-) diff --git a/lessons/01_preprocessing.ipynb b/lessons/01_preprocessing.ipynb index de33786..f107411 100644 --- a/lessons/01_preprocessing.ipynb +++ b/lessons/01_preprocessing.ipynb @@ -47,6 +47,14 @@ "# !python -m spacy download en_core_web_sm" ] }, + { + "cell_type": "markdown", + "id": "ae6e35fa", + "metadata": {}, + "source": [ + "Las siguientes líneas contienen el instalador de los paquetes y el modelo, se tiene que descomentar acorde a lo que necesitemos realizar." + ] + }, { "cell_type": "markdown", "id": "df5b8f8e-4e69-426e-a202-ec48b325e89a", @@ -117,6 +125,14 @@ "tweets = pd.read_csv(csv_path, sep=',')" ] }, + { + "cell_type": "markdown", + "id": "c86ecb46", + "metadata": {}, + "source": [ + "Este fragmento de código utiliza la biblioteca pandas para cargar un archivo CSV que contiene datos y lee el archivo CSV especificando que las columnas están separadas por comas." + ] + }, { "cell_type": "code", "execution_count": 2, @@ -303,6 +319,14 @@ "tweets.head()" ] }, + { + "cell_type": "markdown", + "id": "a12ac653", + "metadata": {}, + "source": [ + "Este método muestra las primeras cinco filas." + ] + }, { "cell_type": "markdown", "id": "ae3b339f-45cf-465d-931c-05f9096fd510", @@ -347,6 +371,14 @@ "print(tweets['text'].iloc[2])" ] }, + { + "cell_type": "markdown", + "id": "f5f83e26", + "metadata": {}, + "source": [ + "Selecciona la columna llamada text, que contiene el contenido de los tweets, accede a las filas 0,1,2 y muestra el contenido de esos tweets en la consola." + ] + }, { "cell_type": "markdown", "id": "8adc05fa-ad30-4402-ab56-086bcb09a166", @@ -391,6 +423,14 @@ "print(first_example)" ] }, + { + "cell_type": "markdown", + "id": "7a2796bc", + "metadata": {}, + "source": [ + "Accede al texto del tweet ubicado en la fila 108, específicamente en la columna text y muestra el contenido del tweet número 108 en la consola." + ] + }, { "cell_type": "code", "execution_count": 5, @@ -422,6 +462,18 @@ "print(first_example.upper())" ] }, + { + "cell_type": "markdown", + "id": "bc305d5d", + "metadata": {}, + "source": [ + "* Verifica si todos los caracteres alfabéticos del texto están en minúsculas\n", + "* Imprime una línea de 50 signos de igual (=) para separar visualmente las salidas y mejorar la legibilidad.\n", + "* Convierte todo el texto a minúsculas, incluyendo letras, dejando intactos los demás caracteres.\n", + "* Imprime una línea de 50 signos de igual (=) para separar visualmente las salidas y mejorar la legibilidad.\n", + "* Convierte todo el texto a mayúsculas.\n" + ] + }, { "cell_type": "markdown", "id": "7bf0d8c8-bd6c-47ef-b305-09ac61d07d4d", @@ -454,6 +506,17 @@ " file.close()" ] }, + { + "cell_type": "markdown", + "id": "94766721", + "metadata": {}, + "source": [ + "* Guarda la ruta del archivo de texto (poem_wordsworth.txt) en la variable text_path.\n", + "* Abre el archivo en modo lectura ('r') usando un context manager (with), que garantiza que el archivo se cierre automáticamente cuando terminamos de trabajar con él.\n", + "* Lee todo el contenido del archivo y lo guarda en la variable text como una cadena de texto.\n", + "* Cierra el archivo manualmente." + ] + }, { "cell_type": "markdown", "id": "7a693dd9-9706-40b3-863f-f568020245f7", @@ -464,7 +527,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "7e78a75a-8e15-4bcb-a416-783aa7f60ef3", "metadata": {}, "outputs": [ @@ -483,6 +546,14 @@ "text" ] }, + { + "cell_type": "markdown", + "id": "dad2acb4", + "metadata": {}, + "source": [ + "Se imprime el contenido completo de la variable text, es decir, el texto completo del archivo que se cargo." + ] + }, { "cell_type": "markdown", "id": "47cce993-c315-4aaa-87fe-149de8607f65", @@ -542,6 +613,14 @@ "text.splitlines()" ] }, + { + "cell_type": "markdown", + "id": "86801932", + "metadata": {}, + "source": [ + "Toma la cadena de texto completa almacenada en text, la divide en una lista, separando el texto en cada salto de línea." + ] + }, { "cell_type": "markdown", "id": "44d3825b-0857-44e1-bf6a-d8c7a9032704", @@ -573,6 +652,14 @@ "second_example" ] }, + { + "cell_type": "markdown", + "id": "fffba8f4", + "metadata": {}, + "source": [ + "Accede al tweet ubicado en la fila número 5 dentro de la columna text del DataFrame tweets y guarda ese tweet en la variable second_example." + ] + }, { "cell_type": "markdown", "id": "aef55865-36fd-4c06-a765-530cf3b53096", @@ -605,6 +692,14 @@ "second_example.strip()" ] }, + { + "cell_type": "markdown", + "id": "bf864ab6", + "metadata": {}, + "source": [ + ".strip() Elimina los espacios en blanco solo al inicio y al final de una cadena de texto." + ] + }, { "cell_type": "markdown", "id": "b99b80b4-804f-460f-a2d5-adbd654902b3", @@ -623,6 +718,14 @@ "import re" ] }, + { + "cell_type": "markdown", + "id": "2ba3cf4d", + "metadata": {}, + "source": [ + "Importa la libreria re, que es el módulo de expresiones regulares en Python y permite buscar, reemplazar, extraer o dividir texto basándose en patrones complejos." + ] + }, { "cell_type": "markdown", "id": "d5f08d20-ba81-4e48-9e2a-5728148005b3", @@ -648,6 +751,14 @@ "blankspace_pattern = r'\\s+'" ] }, + { + "cell_type": "markdown", + "id": "9ecfef22", + "metadata": {}, + "source": [ + "Define un patrón de expresión regular y lo guarda en la variable blankspace_pattern." + ] + }, { "cell_type": "markdown", "id": "cc075c2e-1a1d-4393-a3ea-8ad7c118364b", @@ -667,6 +778,14 @@ "blankspace_repl = ' '" ] }, + { + "cell_type": "markdown", + "id": "ae7ba98a", + "metadata": {}, + "source": [ + "Define la cadena de reemplazo que se usará junto con la expresión regular que se escribio antes." + ] + }, { "cell_type": "markdown", "id": "bc12e3d1-728a-429b-9c83-4dcc88590bc4", @@ -697,6 +816,14 @@ "print(clean_text)" ] }, + { + "cell_type": "markdown", + "id": "f989d972", + "metadata": {}, + "source": [ + "Realiza una limpieza de espacios en blanco en el texto del tweet almacenado en second_example." + ] + }, { "cell_type": "markdown", "id": "a895fbe3-a034-4124-94af-72a528913c51", @@ -737,6 +864,17 @@ "print(punctuation)" ] }, + { + "cell_type": "markdown", + "id": "50bcb8da", + "metadata": {}, + "source": [ + "from string import punctuation\n", + "Importa la constante punctuation del módulo estándar string\n", + "print(punctuation)\n", + "Imprime la cadena completa de signos de puntuación." + ] + }, { "cell_type": "markdown", "id": "91119c9e-431c-42cb-afea-f7e607698929", @@ -767,6 +905,19 @@ " return text_no_punct" ] }, + { + "cell_type": "markdown", + "id": "a99e9490", + "metadata": {}, + "source": [ + "* Recibe una cadena text como entrada.\n", + "* Recorre cada carácter del texto.\n", + "* Verifica si ese carácter no está en punctuation (la lista de signos de puntuación importada de string).\n", + "* Si no es un signo de puntuación, lo añade a una lista llamada no_punct.\n", + "* Une todos esos caracteres nuevamente en una cadena sin puntuación (text_no_punct).\n", + "* Devuelve el texto limpio." + ] + }, { "cell_type": "markdown", "id": "d4fc768b-c2dd-4386-8212-483c4485e4be", @@ -777,7 +928,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "id": "7596c465-3d85-4b72-a853-f2151bcd91df", "metadata": {}, "outputs": [ @@ -810,6 +961,16 @@ "remove_punct(third_example)" ] }, + { + "cell_type": "markdown", + "id": "0a22808a", + "metadata": {}, + "source": [ + "* Accede al tweet número 20 (índice base 0, por lo que es el tweet 21) y lo guarda en third_example.\n", + "* Imprime el texto original del tweet.\n", + "* Imprime una línea de separación visual (==================================================)." + ] + }, { "cell_type": "markdown", "id": "853a4b83-f503-4405-aedd-66bbc088e3e7", @@ -818,9 +979,15 @@ "Let's give it a try with another tweet. What have you noticed?" ] }, + { + "cell_type": "markdown", + "id": "d1abd898", + "metadata": {}, + "source": [] + }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "id": "5b3c2f60-fc92-4326-bad6-5ad04be50476", "metadata": {}, "outputs": [ @@ -852,6 +1019,16 @@ "remove_punct(tweets['text'][100])" ] }, + { + "cell_type": "markdown", + "id": "ddf6fca9", + "metadata": {}, + "source": [ + "* Imprime el tweet número 100 del DataFrame tweets (índice 100 → tweet 101).\n", + "* Muestra una línea separadora para mayor claridad visual.\n", + "* Aplica la función remove_punct() al texto del tweet, eliminando todos los signos de puntuación." + ] + }, { "cell_type": "markdown", "id": "1af02ce5-b674-4cb4-8e08-7d7416963f9c", @@ -860,6 +1037,20 @@ "What about the following example?" ] }, + { + "cell_type": "markdown", + "id": "e300aa82", + "metadata": {}, + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "782b9230", + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "code", "execution_count": 19, @@ -885,6 +1076,14 @@ "remove_punct(contraction_text)" ] }, + { + "cell_type": "markdown", + "id": "7a0b5ef9", + "metadata": {}, + "source": [ + "Eliminará todos los signos de puntuación, incluyendo las comillas de contraction_text;" + ] + }, { "cell_type": "markdown", "id": "62574c66-db3f-4500-9c3b-cea2f3eb2a30", @@ -945,6 +1144,23 @@ "print(challenge1)" ] }, + { + "cell_type": "markdown", + "id": "e47adf41", + "metadata": {}, + "source": [ + "* Define la ruta al archivo example1.txt y la guarda en la variable challenge1_path.\n", + "* Abre el archivo en modo lectura ('r') usando un contexto with, que asegura que el archivo se cierre automáticamente al finalizar.\n", + "* Lee todo el contenido del archivo y lo almacena en la variable challenge1 como una cadena de texto.\n", + "* Muestra el contenido completo del archivo en la consola." + ] + }, + { + "cell_type": "markdown", + "id": "1721100a", + "metadata": {}, + "source": [] + }, { "cell_type": "code", "execution_count": 21, @@ -968,6 +1184,16 @@ " return text" ] }, + { + "cell_type": "markdown", + "id": "18a34412", + "metadata": {}, + "source": [ + "Paso 1: Convierte todo el texto a minúsculas.\n", + "Paso 2: Llama a la función remove_punct para eliminar los signos de puntuación.\n", + "Paso 3: Usa una expresión regular para reemplazar cualquier secuencia de espacios por un solo espacio, y luego .strip() para eliminar espacios al inicio y final." + ] + }, { "cell_type": "code", "execution_count": 22, @@ -1027,6 +1253,14 @@ "print(url_tweet)" ] }, + { + "cell_type": "markdown", + "id": "779b5d92", + "metadata": {}, + "source": [ + "Accede al tweet número 13 de la columna 'text' del DataFrame tweets, guarda ese texto en la variable url_tweet y lo imprime para que puedas verlo." + ] + }, { "cell_type": "code", "execution_count": 24, @@ -1051,6 +1285,16 @@ "re.sub(url_pattern, url_repl, url_tweet)" ] }, + { + "cell_type": "markdown", + "id": "97b27226", + "metadata": {}, + "source": [ + "* Define un patrón regex en url_pattern para detectar URLs en el texto, que puede incluir direcciones que comienzan con http, https o ftp.\n", + "* Define la cadena url_repl que usará para reemplazar las URLs encontradas por el texto \"URL\".\n", + "* Usa re.sub() para buscar y reemplazar todas las URLs en url_tweet por \"URL\"." + ] + }, { "cell_type": "code", "execution_count": 25, @@ -1075,6 +1319,16 @@ "re.sub(hashtag_pattern, hashtag_repl, url_tweet)" ] }, + { + "cell_type": "markdown", + "id": "e22dfec6", + "metadata": {}, + "source": [ + "* hashtag_pattern almacena un patrón de expresión regular que busca hashtags en el texto.\n", + "* hashtag_repl = 'HASHTAG' define el texto con el que reemplazaremos cada hashtag detectado.\n", + "* re.sub() reemplaza todos los hashtags en url_tweet por \"HASHTAG\"." + ] + }, { "cell_type": "markdown", "id": "71d68d49-4923-49c0-9113-b844dc7546b9", @@ -1109,6 +1363,14 @@ "import nltk" ] }, + { + "cell_type": "markdown", + "id": "834c477d", + "metadata": {}, + "source": [ + "Esta importando la biblioteca nltk, una de las librerías de Python para procesamiento de lenguaje natural (NLP)." + ] + }, { "cell_type": "code", "execution_count": 27, @@ -1122,6 +1384,16 @@ "# nltk.download('punkt')" ] }, + { + "cell_type": "markdown", + "id": "471f0ac8", + "metadata": {}, + "source": [ + "* wordnet: Descarga el corpus WordNet, una base de datos léxica grande para inglés, usada para lematización, sinónimos, y relaciones semánticas.\n", + "* stopwords: Descarga listas de palabras muy comunes (como \"the\", \"is\", \"and\") que a menudo se eliminan porque aportan poco significado.\n", + "* punkt: Descarga el modelo necesario para la tokenización dividir texto en oraciones o palabras." + ] + }, { "cell_type": "markdown", "id": "6e79b699-c3a5-489f-9b3c-95653aba34d6", @@ -1153,6 +1425,16 @@ "print(text)" ] }, + { + "cell_type": "markdown", + "id": "0d40f665", + "metadata": {}, + "source": [ + "* Importar word_tokenize: Esta función de nltk divide un texto en una lista de palabras o tokens, manejando adecuadamente signos de puntuación y caracteres especiales.\n", + "* Seleccionar tweet: Asigna a la variable text el tweet en la fila 7 de la columna 'text'.\n", + "* Imprimir el tweet: Muestra el contenido del tweet para que puedas verlo." + ] + }, { "cell_type": "code", "execution_count": 29, @@ -1193,6 +1475,17 @@ "nltk_tokens" ] }, + { + "cell_type": "markdown", + "id": "58db5ffc", + "metadata": {}, + "source": [ + "* Aplica la función word_tokenize de NLTK al texto guardado en la variable text.\n", + "* word_tokenize divide el texto en una lista de tokens.\n", + "* La lista resultante se guarda en la variable nltk_tokens.\n", + "* La última línea muestra la lista de tokens generada." + ] + }, { "cell_type": "markdown", "id": "80ead039-7721-4b22-8590-0d7824631675", @@ -1228,6 +1521,15 @@ "from nltk.corpus import stopwords" ] }, + { + "cell_type": "markdown", + "id": "5b810c65", + "metadata": {}, + "source": [ + "Importa el conjunto de \"stopwords\" desde el módulo nltk.corpus.\n", + "Los stopwords son palabras muy comunes en un idioma (como “the”, “and”, “is” en inglés) que normalmente se eliminan en el análisis de texto porque no aportan significado relevante para tareas como clasificación, resumen o búsqueda." + ] + }, { "cell_type": "markdown", "id": "dee971a1-1189-4cb6-8317-4836f54c3ae2", @@ -1259,6 +1561,17 @@ "stop[:10]" ] }, + { + "cell_type": "markdown", + "id": "aa6e0f00", + "metadata": {}, + "source": [ + "* stopwords.words('english')\n", + " Carga una lista de palabras vacías (stopwords) en inglés desde la biblioteca NLTK.\n", + "* stop[:10]\n", + " Muestra las primeras 10 palabras de esa lista." + ] + }, { "cell_type": "markdown", "id": "4c3ec908-de6c-42c5-a370-f1b1df0032b3", @@ -1303,6 +1616,21 @@ "nlp = spacy.load('en_core_web_sm')" ] }, + { + "cell_type": "markdown", + "id": "15bd5e8c", + "metadata": {}, + "source": [ + "import spacy\n", + "Importa la biblioteca spaCy, una herramienta avanzada y muy rápida para procesamiento de lenguaje natural (NLP) en Python.\n", + "\n", + "spacy.load('en_core_web_sm')\n", + "Carga un modelo de lenguaje en inglés llamado en_core_web_sm, que es una versión ligera entrenada por spaCy.\n", + "\n", + "nlp = ...\n", + "Guarda el modelo cargado en la variable nlp, que luego puedes usar para analizar textos." + ] + }, { "cell_type": "markdown", "id": "57d669c3-2f5a-41b6-893b-ea1d438b3a48", @@ -1335,6 +1663,14 @@ "nlp.pipe_names" ] }, + { + "cell_type": "markdown", + "id": "5e615922", + "metadata": {}, + "source": [ + "Es un atributo del modelo de spaCy (nlp) que devuelve una lista con los nombres de los componentes activos en el pipeline de procesamiento." + ] + }, { "cell_type": "markdown", "id": "d1e37f91-d174-4101-bfc6-2859cb0fe5cc", @@ -1354,6 +1690,21 @@ "doc = nlp(tweets['text'][7])" ] }, + { + "cell_type": "markdown", + "id": "9ade311c", + "metadata": {}, + "source": [ + "tweets['text'][7]\n", + "Accede al séptimo tweet del conjunto de datos.\n", + "\n", + "nlp(...)\n", + "Pasa ese texto al modelo de spaCy que ya cargaste con en_core_web_sm. Esto activa el pipeline completo de procesamiento de lenguaje natural.\n", + "\n", + "doc = ...\n", + "Guarda el resultado en la variable doc, que es un objeto especial de spaCy que contiene mucha información estructurada sobre el texto." + ] + }, { "cell_type": "markdown", "id": "54325d60-5c5c-488d-baf2-7eed4de2c031", @@ -1417,6 +1768,14 @@ "spacy_tokens" ] }, + { + "cell_type": "markdown", + "id": "0fde4e8a", + "metadata": {}, + "source": [ + "Está creando una lista con todas las palabras del tweet que fueron procesadas por spaCy, tal como aparecen en el texto original." + ] + }, { "cell_type": "code", "execution_count": 36, @@ -1456,6 +1815,14 @@ "nltk_tokens" ] }, + { + "cell_type": "markdown", + "id": "7ac154df", + "metadata": {}, + "source": [ + "Muestra el contenido de una variable que ya fue creada anteriormente." + ] + }, { "cell_type": "markdown", "id": "a0ace59e-40e0-42b3-9f2b-d30ac94dccab", @@ -1505,6 +1872,14 @@ "spacy_stops" ] }, + { + "cell_type": "markdown", + "id": "f191e65f", + "metadata": {}, + "source": [ + "Crea una lista llamada spacy_stops que contiene valores booleanos True o False para cada palabra del texto procesado, indicando si esa palabra es una stopword o no." + ] + }, { "cell_type": "markdown", "id": "3b6548b6-7e89-4f42-b8cb-bf7c93b34eb4", @@ -1540,6 +1915,16 @@ " # YOUR CODE HERE" ] }, + { + "cell_type": "markdown", + "id": "d331ecfb", + "metadata": {}, + "source": [ + "Busca eliminar las stopwords de un texto usando NLTK.\n", + "* raw_text: es el texto original que quieres limpiar.\n", + "* stopword: es una lista de palabras que consideras irrelevantes." + ] + }, { "cell_type": "code", "execution_count": null, @@ -1556,6 +1941,14 @@ " # YOUR CODE HERE" ] }, + { + "cell_type": "markdown", + "id": "5a84bcae", + "metadata": {}, + "source": [ + "Es otra plantilla de función, esta vez utilizando spaCy en lugar de NLTK. Su objetivo es: eliminar las stopwords (palabras vacías/comunes) de un texto usando la librería spaCy." + ] + }, { "cell_type": "code", "execution_count": null, @@ -1566,6 +1959,14 @@ "# remove_stopword_nltk(text, stop)" ] }, + { + "cell_type": "markdown", + "id": "2fe97ff0", + "metadata": {}, + "source": [ + "Llama a una función que definió anteriormente con el nombre remove_stopword_nltk." + ] + }, { "cell_type": "code", "execution_count": null, @@ -1576,6 +1977,14 @@ "# remove_stopword_spacy(text)" ] }, + { + "cell_type": "markdown", + "id": "68dd65c4", + "metadata": {}, + "source": [ + "Llama a la función remove_stopword_spacy que recibe un texto (text) y devuelve una lista de tokens, usando la librería spaCy para identificar esas stopwords." + ] + }, { "cell_type": "markdown", "id": "d3a6b1ec-87cc-4a08-a5dd-0210a9c56f0b", @@ -1622,6 +2031,19 @@ " print(f\"{token.text:<24} | {token.lemma_:<24} | {token.pos_:<12} | {spacy.explain(token.pos_):<12} | {token.like_url:<12} |\")" ] }, + { + "cell_type": "markdown", + "id": "72cb4074", + "metadata": {}, + "source": [ + "Imprime información detallada de cada palabra (token) del texto procesado por spaCy (doc), mostrando:\n", + "* token.text: La palabra original tal cual aparece en el texto.\n", + "* token.lemma_: El lema o forma base de la palabra (ejemplo: “running” → “run”).\n", + "* token.pos_: La categoría gramatical en forma abreviada.\n", + "* spacy.explain(token.pos_): Una explicación legible en inglés de la categoría gramatical.\n", + "* token.like_url: Valor booleano True o False que indica si spaCy detecta que el token parece una URL." + ] + }, { "cell_type": "markdown", "id": "17388e0c-88b6-4cd9-8d2b-adb7f10b5330", @@ -1655,6 +2077,19 @@ "print(tweet_airport)" ] }, + { + "cell_type": "markdown", + "id": "6afc44d0", + "metadata": {}, + "source": [ + "Accede a dos tweets específicos en el DataFrame tweets:\n", + "* El tweet en la fila 8273, almacenado en tweet_city.\n", + "* El tweet en la fila 502, almacenado en tweet_airport.\n", + "* Imprime el tweet de tweet_city.\n", + "* Imprime una línea separadora compuesta por 50 signos = para visualmente separar las salidas.\n", + "* Imprime el tweet de tweet_airport." + ] + }, { "cell_type": "markdown", "id": "013990a5-5e07-4a45-9427-fcd33840d3b8", @@ -1688,6 +2123,21 @@ " print(f\"{ent.text:<15} | {ent.start_char:<10} | {ent.end_char:<10} | {ent.label_:<10}\")" ] }, + { + "cell_type": "markdown", + "id": "6c62dea8", + "metadata": {}, + "source": [ + "Procesa el texto de tweet_city con el modelo nlp de spaCy, guardando el resultado en doc_city. Esto analiza el texto y extrae información lingüística, incluyendo las entidades nombradas.\n", + "* Itera sobre las entidades encontradas en el texto (doc_city.ents). Cada entidad es una frase o palabra que representa algo importante, como nombres de personas, lugares, organizaciones, fechas, etc.\n", + "\n", + "Para cada entidad ent, imprime:\n", + "* ent.text: El texto exacto de la entidad encontrada.\n", + "* ent.start_char: La posición donde inicia la entidad en el texto original.\n", + "* ent.end_char: La posición donde termina la entidad en el texto.\n", + "* ent.label_: El tipo o categoría de la entidad por ejemplo, GPE para lugar geopolítico, ORG para organización, PERSON para persona, etc." + ] + }, { "cell_type": "markdown", "id": "7b933ed0-7018-450c-b0a6-fb76cb6d5be9", @@ -1748,6 +2198,18 @@ "displacy.render(doc_city, style='ent', jupyter=True)" ] }, + { + "cell_type": "markdown", + "id": "6faeaf7a", + "metadata": {}, + "source": [ + "Importa displacy, que es el visualizador para mostrar análisis de texto.\n", + "\n", + "* Usa displacy.render para mostrar gráficamente las entidades nombradas (personas, lugares, organizaciones, fechas, etc.) detectadas en el objeto doc_city.\n", + "* El parámetro style='ent' indica que queremos visualizar las entidades nombradas.\n", + "* jupyter=True hace que la visualización se muestre dentro de un cuaderno Jupyter en lugar de abrirse en una ventana externa." + ] + }, { "cell_type": "markdown", "id": "f5d7953b-04a1-46d0-817a-db29edd8c83b", @@ -1779,6 +2241,21 @@ " print(f\"{ent.text:<15} | {ent.start_char:<10} | {ent.end_char:<10} | {ent.label_:<10}\")" ] }, + { + "cell_type": "markdown", + "id": "5b99cb6d", + "metadata": {}, + "source": [ + "Procesa el texto tweet_airport con el modelo spaCy para obtener un objeto doc_airport que contiene análisis lingüístico, incluyendo entidades nombradas.\n", + "Itera sobre las entidades encontradas en doc_airport.ents. Cada entidad es una palabra o frase reconocida como entidad significativa (nombres propios, lugares, organizaciones, códigos, fechas, etc.).\n", + "\n", + "Por cada entidad ent, imprime una fila con:\n", + "* ent.text: el texto exacto de la entidad.\n", + "* ent.start_char: la posición de inicio (índice de carácter) en el texto.\n", + "* ent.end_char: la posición final.\n", + "* ent.label_: la etiqueta o tipo de entidad." + ] + }, { "cell_type": "markdown", "id": "1df38472-3193-44c5-9b2f-e311ce9d42e0", @@ -1826,6 +2303,14 @@ "displacy.render(doc_airport, style='ent', jupyter=True)" ] }, + { + "cell_type": "markdown", + "id": "c2669fb2", + "metadata": {}, + "source": [ + "Muestra visualmente las entidades nombradas detectadas en el texto procesado con spaCy." + ] + }, { "cell_type": "markdown", "id": "467d6f28-effc-4fe1-90e9-47c89dc5492d", @@ -1868,6 +2353,14 @@ "tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')" ] }, + { + "cell_type": "markdown", + "id": "dfdd6de5", + "metadata": {}, + "source": [ + "Carga e inicializa el tokenizador BERT desde el modelo preentrenado bert-base-uncased, que es una versión común de BERT." + ] + }, { "cell_type": "markdown", "id": "128cfb38-274e-4d75-9d14-8744020fe49c", @@ -1907,6 +2400,16 @@ "print(f\"Number of tokens: {len(tokens)}\")" ] }, + { + "cell_type": "markdown", + "id": "eab69f2a", + "metadata": {}, + "source": [ + "Selecciona el tweet que está en la fila 194 de la columna 'text' del DataFrame tweets.\n", + "Muestra el contenido del tweet en consola y luego imprime una línea de separación (50 signos =).\n", + "Convierte el texto en una lista de tokens compatibles con el modelo BERT.\n" + ] + }, { "cell_type": "markdown", "id": "bc4f780e-207c-4d3d-b1b6-063c6d118945", @@ -1944,6 +2447,22 @@ "print(f\"Token 2074 is: {tokenizer.decode([2074])}\")" ] }, + { + "cell_type": "markdown", + "id": "11ab9c1c", + "metadata": {}, + "source": [ + "tokenizer.vocab['just']\n", + "\n", + "* Busca el ID numérico que BERT le asigna al token \"just\".\n", + "* En los modelos de lenguaje, cada palabra es convertida a un número entero (token ID) para que el modelo pueda trabajar con ella.\n", + "\n", + "tokenizer.decode([2074])\n", + "\n", + "* Convierte el ID 2074 de nuevo en su representación textual (token).\n", + "* Sirve para interpretar qué palabra representa ese número dentro del vocabulario de BERT." + ] + }, { "cell_type": "markdown", "id": "2b9fd13d-f26e-480c-b43e-2b5fbc4898cd", @@ -1974,6 +2493,25 @@ "print(f\"Input IDs of text: {input_ids}\")" ] }, + { + "cell_type": "markdown", + "id": "66c47a8f", + "metadata": {}, + "source": [ + "tokenizer.convert_tokens_to_ids(tokens)\n", + "\n", + "* Toma una lista de tokens y los convierte en una lista de números enteros, que representan cada token en el vocabulario de BERT.\n", + "* Cada número corresponde a una posición en el vocabulario preentrenado.\n", + "\n", + "print(f\"Number of input IDs: {len(input_ids)}\")\n", + "\n", + "* Muestra cuántos IDs fueron generados.\n", + "\n", + "print(f\"Input IDs of text: {input_ids}\")\n", + "\n", + "* Muestra los números exactos que representan cada token del texto original." + ] + }, { "cell_type": "markdown", "id": "f25a1a14-a6db-414b-a1a8-c6be73c81a15", @@ -2014,6 +2552,25 @@ "print(f\"IDs from tokenizer: {input_ids_from_tokenizer}\")" ] }, + { + "cell_type": "markdown", + "id": "80d2dba0", + "metadata": {}, + "source": [ + "tokenizer(text)['input_ids']\n", + "* Usa el tokenizador de BERT para tokenizar y codificar el texto directamente.\n", + "Internamente, el tokenizer() no solo divide el texto en tokens, sino que también:\n", + " * Añade los tokens especiales [CLS] y [SEP].\n", + " * Convierte los tokens en IDs numéricos.\n", + " * Luego, accede a la clave 'input_ids' para obtener solo los IDs.\n", + "\n", + "print(f\"Number of input IDs: {len(input_ids_from_tokenizer)}\")\n", + "* Imprime cuántos IDs fueron generados, incluyendo los tokens especiales.\n", + "\n", + "print(f\"IDs from tokenizer: {input_ids_from_tokenizer}\")\n", + "* Muestra la lista completa de IDs que representa el texto original." + ] + }, { "cell_type": "markdown", "id": "bb6ea98e-7374-488a-a804-46cab166125c", @@ -2045,6 +2602,18 @@ "print(f\"The 102nd token: {tokenizer.convert_ids_to_tokens(102)}\")" ] }, + { + "cell_type": "markdown", + "id": "b6e12db5", + "metadata": {}, + "source": [ + "Este código convierte los IDs de entrada a sus tokens de texto equivalentes usando el tokenizador de BERT.\n", + "ID 101\n", + "* Token especial que marca el inicio de una secuencia de entrada en BERT.\n", + "ID 102\n", + "* Token especial que separa frases o marca el final de una secuencia." + ] + }, { "cell_type": "markdown", "id": "b16d4e10-e96c-432a-a6c9-2c992d00fcde", @@ -2079,6 +2648,14 @@ " return print(tokens)" ] }, + { + "cell_type": "markdown", + "id": "fa6abbb5", + "metadata": {}, + "source": [ + "Este código define una función llamada get_tokens que tokeniza una cadena de texto usando el tokenizador BERT y luego imprime los tokens resultantes." + ] + }, { "cell_type": "code", "execution_count": 51, @@ -2112,6 +2689,26 @@ "# YOUR EXAMPLE" ] }, + { + "cell_type": "markdown", + "id": "9d15f1d9", + "metadata": {}, + "source": [ + "Este bloque de código está usando la función get_tokens para mostrar cómo el tokenizador maneja diferentes tipos de palabras o casos.\n", + "\n", + "get_tokens('dlab')\n", + "* Muestra cómo el tokenizador divide o reconoce esa palabra.\n", + "\n", + "get_tokens('covid')\n", + "* Observa si el tokenizador la reconoce como token único o la divide en subpartes.\n", + "\n", + "get_tokens('huggable')\n", + "* Muestra si la palabra se divide en partes como \"hug\" + \"gable\" o algo similar.\n", + "\n", + "get_tokens('378')\n", + "* Observa cómo el tokenizador trata números." + ] + }, { "cell_type": "markdown", "id": "4acb7cb9-6e60-4e0a-8cc6-21d57237e835", From 648d00120e57bacd1c9311fb7ac59a92dfb1a7ae Mon Sep 17 00:00:00 2001 From: jmuquinche Date: Tue, 29 Jul 2025 12:08:57 -0500 Subject: [PATCH 3/4] Se realizan cambios --- lessons/02_bag_of_words.ipynb | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/lessons/02_bag_of_words.ipynb b/lessons/02_bag_of_words.ipynb index ab7d4ef..8bf1ace 100644 --- a/lessons/02_bag_of_words.ipynb +++ b/lessons/02_bag_of_words.ipynb @@ -86,7 +86,11 @@ "id": "aa02d204", "metadata": {}, "source": [ - "Se sugiere instalar las bibliotecas necesarias para procesamiento" + "Se sugiere instalar las bibliotecas necesarias para procesamiento: - %pip install NLTK: instala NLTK (Natural Language Toolkit), una biblioteca muy usada para tareas básicas de NLP como tokenización, stemming, y análisis léxico.\n", + "\n", + " - %pip install spaCy: instala spaCy, otra biblioteca potente y eficiente para NLP, especialmente útil para tareas como análisis gramatical, reconocimiento de entidades y dependencias sintácticas.\n", + "\n", + " - !python -m spacy download en_core_web_sm: descarga un modelo preentrenado de spaCy llamado \"en_core_web_sm\", que permite analizar texto en inglés (tokenización, lematización, entidades, etc.)." ] }, { @@ -112,7 +116,15 @@ "id": "2798d7be", "metadata": {}, "source": [ - "Aqui se añadió la linea from sklearn.feature_extraction.text import TfidfVectorizer" + "Aqui se añadió la linea from sklearn.feature_extraction.text import TfidfVectorizer Todo este bloque prepara tu entorno para:\n", + "\n", + "- Procesar texto (re, string, TfidfVectorizer)\n", + "\n", + "- Analizar datos (numpy, pandas)\n", + "\n", + "- Visualizar resultados (matplotlib, seaborn)\n", + "\n", + "- Mostrar gráficos directamente en el notebook (%matplotlib inline)" ] }, { From 210cf1f91afa326b5390a1ff264bfaa86cf5ff3e Mon Sep 17 00:00:00 2001 From: jmuquinche Date: Tue, 29 Jul 2025 12:26:59 -0500 Subject: [PATCH 4/4] Se realizan cambios --- lessons/02_bag_of_words.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lessons/02_bag_of_words.ipynb b/lessons/02_bag_of_words.ipynb index 8bf1ace..29f6042 100644 --- a/lessons/02_bag_of_words.ipynb +++ b/lessons/02_bag_of_words.ipynb @@ -65,7 +65,7 @@ "id": "4d338823", "metadata": {}, "source": [ - "Se sugiere instalar el paquete scikit-learn" + "Se sugiere instalar el paquete scikit-learn// %pip install scikit-learn instala la biblioteca scikit-learn, que sirve para aplicar algoritmos de aprendizaje automático en Python, y se usa dentro de entornos como Jupyter Notebook." ] }, {