Add files using upload-large-folder tool
Browse files- .gitattributes +4 -8
- notebooks/.ipynb_checkpoints/eda-checkpoint.ipynb +903 -0
- notebooks/results/checkpoint-2000/rng_state.pth +0 -0
- notebooks/results/checkpoint-2000/scheduler.pt +0 -0
- notebooks/results/checkpoint-2000/training_args.bin +0 -0
- notebooks/results/checkpoint-2500/rng_state.pth +0 -0
- notebooks/results/checkpoint-2500/scheduler.pt +0 -0
- notebooks/sentiment-bert-model/training_args.bin +0 -0
- sentiment-bert-model/rng_state.pth +0 -0
- sentiment-bert-model/scheduler.pt +0 -0
- sentiment-bert-model/training_args.bin +0 -0
.gitattributes
CHANGED
@@ -1,9 +1,5 @@
|
|
1 |
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
2 |
-
|
3 |
-
notebooks/results/checkpoint-
|
4 |
-
notebooks/results/checkpoint-
|
5 |
-
notebooks/results/checkpoint-
|
6 |
-
notebooks/results/checkpoint-500/rng_state.pth filter=lfs diff=lfs merge=lfs -text
|
7 |
-
notebooks/results/checkpoint-500/scheduler.pt filter=lfs diff=lfs merge=lfs -text
|
8 |
-
notebooks/results/checkpoint-500/training_args.bin filter=lfs diff=lfs merge=lfs -text
|
9 |
-
notebooks/results/checkpoint-500/optimizer.pt filter=lfs diff=lfs merge=lfs -text
|
|
|
1 |
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
2 |
+
sentiment-bert-model/optimizer.pt filter=lfs diff=lfs merge=lfs -text
|
3 |
+
notebooks/results/checkpoint-1000/optimizer.pt filter=lfs diff=lfs merge=lfs -text
|
4 |
+
notebooks/results/checkpoint-1500/optimizer.pt filter=lfs diff=lfs merge=lfs -text
|
5 |
+
notebooks/results/checkpoint-2000/optimizer.pt filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
|
|
notebooks/.ipynb_checkpoints/eda-checkpoint.ipynb
ADDED
@@ -0,0 +1,903 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"cells": [
|
3 |
+
{
|
4 |
+
"cell_type": "code",
|
5 |
+
"execution_count": 1,
|
6 |
+
"id": "ff355c0e-c42c-4e5e-a2bf-f860afb7a1e4",
|
7 |
+
"metadata": {},
|
8 |
+
"outputs": [
|
9 |
+
{
|
10 |
+
"name": "stdout",
|
11 |
+
"output_type": "stream",
|
12 |
+
"text": [
|
13 |
+
"Train set: 25000 ejemplos\n",
|
14 |
+
"Test set: 25000 ejemplos\n",
|
15 |
+
"\n"
|
16 |
+
]
|
17 |
+
},
|
18 |
+
{
|
19 |
+
"data": {
|
20 |
+
"text/html": [
|
21 |
+
"<div>\n",
|
22 |
+
"<style scoped>\n",
|
23 |
+
" .dataframe tbody tr th:only-of-type {\n",
|
24 |
+
" vertical-align: middle;\n",
|
25 |
+
" }\n",
|
26 |
+
"\n",
|
27 |
+
" .dataframe tbody tr th {\n",
|
28 |
+
" vertical-align: top;\n",
|
29 |
+
" }\n",
|
30 |
+
"\n",
|
31 |
+
" .dataframe thead th {\n",
|
32 |
+
" text-align: right;\n",
|
33 |
+
" }\n",
|
34 |
+
"</style>\n",
|
35 |
+
"<table border=\"1\" class=\"dataframe\">\n",
|
36 |
+
" <thead>\n",
|
37 |
+
" <tr style=\"text-align: right;\">\n",
|
38 |
+
" <th></th>\n",
|
39 |
+
" <th>text</th>\n",
|
40 |
+
" <th>label</th>\n",
|
41 |
+
" </tr>\n",
|
42 |
+
" </thead>\n",
|
43 |
+
" <tbody>\n",
|
44 |
+
" <tr>\n",
|
45 |
+
" <th>0</th>\n",
|
46 |
+
" <td>I rented I AM CURIOUS-YELLOW from my video sto...</td>\n",
|
47 |
+
" <td>0</td>\n",
|
48 |
+
" </tr>\n",
|
49 |
+
" <tr>\n",
|
50 |
+
" <th>1</th>\n",
|
51 |
+
" <td>\"I Am Curious: Yellow\" is a risible and preten...</td>\n",
|
52 |
+
" <td>0</td>\n",
|
53 |
+
" </tr>\n",
|
54 |
+
" <tr>\n",
|
55 |
+
" <th>2</th>\n",
|
56 |
+
" <td>If only to avoid making this type of film in t...</td>\n",
|
57 |
+
" <td>0</td>\n",
|
58 |
+
" </tr>\n",
|
59 |
+
" <tr>\n",
|
60 |
+
" <th>3</th>\n",
|
61 |
+
" <td>This film was probably inspired by Godard's Ma...</td>\n",
|
62 |
+
" <td>0</td>\n",
|
63 |
+
" </tr>\n",
|
64 |
+
" <tr>\n",
|
65 |
+
" <th>4</th>\n",
|
66 |
+
" <td>Oh, brother...after hearing about this ridicul...</td>\n",
|
67 |
+
" <td>0</td>\n",
|
68 |
+
" </tr>\n",
|
69 |
+
" </tbody>\n",
|
70 |
+
"</table>\n",
|
71 |
+
"</div>"
|
72 |
+
],
|
73 |
+
"text/plain": [
|
74 |
+
" text label\n",
|
75 |
+
"0 I rented I AM CURIOUS-YELLOW from my video sto... 0\n",
|
76 |
+
"1 \"I Am Curious: Yellow\" is a risible and preten... 0\n",
|
77 |
+
"2 If only to avoid making this type of film in t... 0\n",
|
78 |
+
"3 This film was probably inspired by Godard's Ma... 0\n",
|
79 |
+
"4 Oh, brother...after hearing about this ridicul... 0"
|
80 |
+
]
|
81 |
+
},
|
82 |
+
"metadata": {},
|
83 |
+
"output_type": "display_data"
|
84 |
+
},
|
85 |
+
{
|
86 |
+
"data": {
|
87 |
+
"image/png": "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LuQp1Op51d9N+4W2rQQ/4/3000/uxL5+/Xr3d/rQ/ctf/uJqMXNLH+AKyX//+9/d/qTXXrlypT3++OP25ZdfRvtl6HV69eplZ511lisnwbZcvHix61ek7a31qO0xbtw4t+0UBhQMgg8XrfPgefRBrRqHZcuWuZN8dnQBsHfvXmvUqFHM/VpOfZCEP1iCGrqGDRu67RT+8Nu+fbvXOlGw0NV6eJ9Wv0Ttg4899pi9//77NnLkSPf+b7311hzvL6p5HjFihF1yySXueRWC9FPhMOybb75x618BtGbNmrZp0yZ3TJx33nluvWr7+5wPAnp97XdvvPGGe55wTaZeRx++2obBvqbtp3OPjiu9/uTJk92H/7Zt29xxfbT7P8Wvj0T0nsqUKRNzn84XOg9oG+j8+fTTT7t+VIsWLXIXSTk53+Rmnz3csRLvqquuciFfx1C45k2B55NPPrFHH300ep+eU0FMF2J33HGHLVy40C2bWi7iL/wUFEX73ZlnnmkpK7/bB3Fs+jSpj0F2ypQp4/pfBO699173N4HHH3/c/f7jjz/mqg/Deeed5x4bP358wsd0i+/T9Itf/CKSlZUVvf+1115z948ZMyZ6n/r7JGqjj39O9ePS344aNeqQsuF2fJXRew907tw5UrRo0cjXX38dve+HH36IHH/88ZGWLVseso7btGkT83z9+/ePFC5cOLJt27bI4TRs2DBStWrVmHIzZ850zxnu0/Txxx+7+yZMmBDz9zNmzEh4f7zWrVtH6tevH9OfRMt79tlnR0499VSvPk3x63b06NGurLZPYOfOnZFatWod8hy+20t97woVKuTeb5j2Hz3nvHnzjthPY9euXYfct2DBAvf3L7/8cvS+Bg0aRDp27BjJqeeee84918qVK2PuD9bd3LlzD/mbK6+80vXriN/XfW7qexPQ+w36KYbpGG7cuHGO95eNGzdGMjMz3f4eNnToUFcuvH6176h/SpiWTX22wstzuPNBfF+99957z5V9++23Y8p16NAh8stf/vKQfe2vf/1rTP+o5s2bR4477riY80VuHKlfZrDej3QL78sS3L9kyZLofd99953r93bZZZfl+Hzjs8/Gn8MPd6wE569gH9u+fbvbnnfccUdMuREjRrg+fFp2Wb58ufu7Xr16xZS788473f1z5sw55LX0/m699dZIKqN5Dq4a+HCj6ILR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mgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAAFI9NB04cMDuueceq1mzppUoUcJOOeUUu//++y0SiUTL6P9DhgyxqlWrujJt2rSxr776KuZ5tmzZYt26dbPSpUtb2bJlrWfPnrZjx46YMitWrLBzzz3XihcvbtWrV7cRI0Ycs/cJAACSX1KHpkceecTGjRtnTz75pK1evdr9rjDzxBNPRMvo97Fjx9r48eNt4cKFVqpUKWvXrp3t3r07WkaBadWqVTZr1iybNm2azZ07126++ebo41lZWda2bVs7+eSTbenSpfboo4/a0KFD7Zlnnjnm7xkAACSnTEti8+fPt06dOlnHjh3d7zVq1LBXXnnFFi1aFK1lGj16tN19992unLz88stWuXJlmzp1qnXt2tWFrRkzZtjixYutSZMmroxCV4cOHeyxxx6zatWq2YQJE2zv3r32/PPPW9GiRe2MM86w5cuX26hRo2LCFQAASF9JXdN09tln2+zZs+3LL790v3/22Wf297//3S666CL3+7p162zjxo2uSS5QpkwZa9q0qS1YsMD9rp9qkgsCk6h8oUKFXM1UUKZly5YuMAVUW7V27VrbunVrwmXbs2ePq6EK3wAAQMGV1DVNd911lwsjtWvXtsKFC7s+Tg8++KBrbhMFJlHNUph+Dx7Tz0qVKsU8npmZaeXLl48po35T8c8RPFauXLlDlm348OE2bNiwPH2/AAAgeSV1TdNrr73mms4mTpxoy5Yts5deesk1qelnfhs0aJBt3749etuwYUN+LxIAAEjXmqbf//73rrZJfZOkfv369t1337lanh49eliVKlXc/Zs2bXKj5wL6vWHDhu7/KrN58+aY592/f78bURf8vX7qb8KC34My8YoVK+ZuAAAgPSR1TdOuXbtc36MwNdMdPHjQ/V9Nago16vcUUHOe+io1b97c/a6f27Ztc6PiAnPmzHHPob5PQRmNqNu3b1+0jEbanX766Qmb5gAAQPpJ6tB0ySWXuD5M06dPt2+//damTJniRrRddtll7vGMjAzr16+fPfDAA/bWW2/ZypUrrXv37m5EXOfOnV2ZOnXqWPv27e2mm25yo+7mzZtnffr0cbVXKifXXHON6wSu+Zs0NcGkSZNszJgxNmDAgHx9/wAAIHkkdfOcpgbQ5Ja33Xaba2JTyPntb3/rJrMMDBw40Hbu3OmmBlCNUosWLdwUA5qkMqB+UQpKrVu3djVXXbp0cXM7hUfczZw503r37m2NGze2ihUrutdgugEAABDIiISn10auqVlQ4UudwjXzeDqpcdf0/F4EHEPfPvx/86YhPXB8p5d0PL6zcvD5ndTNcwAAAMmC0AQAAOCB0AQAAOCB0AQAAOCB0AQAAOCB0AQAAOCB0AQAAOCB0AQAAOCB0AQAAOCB0AQAAOCB0AQAAHA0v7BXX4775z//2VavXu1+P+OMM+zGG290398CAABQ0OSqpmnJkiV2yimn2OOPP25btmxxt1GjRrn7li1blvdLCQAAkIo1Tf3797dLL73Unn32WcvM/L+n2L9/v/Xq1cv69etnc+fOzevlBAAASL3QpJqmcGByT5SZaQMHDrQmTZrk5fIBAACkbvNc6dKlbf369Yfcv2HDBjv++OPzYrkAAABSPzRdddVV1rNnT5s0aZILSrq9+uqrrnnu6quvzvulBAAASMXmuccee8wyMjKse/furi+TFClSxG699VZ7+OGH83oZAQAAUjM0FS1a1MaMGWPDhw+3r7/+2t2nkXMlS5bM6+UDAABI/cktf/jhB3erVauWC0yRSCTvlgwAACDVQ9N//vMfa926tZ122mnWoUMH+9e//uXuVz+nO+64I6+XEQAAIDVDk+ZpUh8mjaALN8mpg/iMGTPycvkAAABSt0/TzJkz7b333rMTTzwx5v5TTz3Vvvvuu7xaNgAAgNSuadq5c2fCTt/6OpVixYrlxXIBAACkfmg699xz7eWXX47+rukHDh48aCNGjLBWrVrl5fIBAACkbvOcwpE6guvrVPbu3eu+PmXVqlWupmnevHl5v5QAAACpWNNUr149+/LLL61FixbWqVMn11x3+eWX26effurmawIAAChoclXTpFFz1atXt8GDByd87KST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tGl26623ujCl0NWjRw+77777omU03YACkuZ8GjNmjJ144on23HPPuecCAACQjEgkEmFV/HwaaVemTBnXKTzd+jfVuIsauXTy7cMd83sRcAxxfKeXdDy+s3Lw+Z3UfZoAAACSBaEJAADAA6EJAADAA6EJAADAA6EJAADAA6EJAADAA6EJAADAA6EJAADAA6EJAADAA6EJAADAA6EJAADAA6EJAADAA6EJAADAA6EJAADAA6EJAADAA6EJAADAA6EJAADAA6EJAADAA6EJAADAA6EJAADAA6EJAADAA6EJAADAA6EJAADAA6EJAADAA6EJAADAA6EJAADAA6EJAADAA6EJAADAA6EJAADAA6EJAADAA6EJAADAA6EJAADAA6EJAADAA6EJAADAA6EJAADAA6EJAADAA6EJAADAA6EJAADAA6EJAADAA6EJAADAA6EJAADAA6EJAADAA6EJAADAA6EJAADAA6EJAADAA6EJAAAg1UPT8OHD7de//rUdf/zxVqlSJevcubOtXbs2pszu3butd+/eVqFCBTvuuOOsS5cutmnTppgy69evt44dO1rJkiXd8/z+97+3/fv3x5T58MMPrVGjRlasWDGrVauWvfjii8fkPQIAgNSQ1KHpo48+coHok08+sVmzZtm+ffusbdu2tnPnzmiZ/v3729tvv22TJ0925X/44Qe7/PLLo48fOHDABaa9e/fa/Pnz7aWXXnKBaMiQIdEy69atc2VatWply5cvt379+lmvXr3svffeO+bvGQAAJKeMSCQSsRTx448/upoihaOWLVva9u3b7YQTTrCJEyfaFVdc4cqsWbPG6tSpYwsWLLBmzZrZu+++axdffLELU5UrV3Zlxo8fb3/4wx/c8xUtWtT9f/r06fb5559HX6tr1662bds2mzFjhteyZWVlWZkyZdwylS5d2tJJjbum5/ci4Bj69uGO+b0IOIY4vtNLOh7fWTn4/E7qmqZ4ekNSvnx593Pp0qWu9qlNmzbRMrVr17aTTjrJhSbRz/r160cDk7Rr186tpFWrVkXLhJ8jKBM8RyJ79uxxzxG+AQCAgitlQtPBgwdds9k555xj9erVc/dt3LjR1RSVLVs2pqwCkh4LyoQDU/B48NjhyigI/fTTT9n2t1IyDW7Vq1fPw3cLAACSTcqEJvVtUvPZq6++aslg0KBBruYruG3YsCG/FwkAABxFmZYC+vTpY9OmTbO5c+faiSeeGL2/SpUqroO3+h6Fa5s0ek6PBWUWLVoU83zB6LpwmfgRd/pdbZslSpRIuEwaZacbAABID0ld06Q+6gpMU6ZMsTlz5ljNmjVjHm/cuLEVKVLEZs+eHb1PUxJoioHmzZu73/Vz5cqVtnnz5mgZjcRTIKpbt260TPg5gjLBcwAAAGQme5OcRsa9+eabbq6moA+S+hCpBkg/e/bsaQMGDHCdwxWEbr/9dhd2NHJONEWBwtF1111nI0aMcM9x9913u+cOaopuueUWe/LJJ23gwIF24403uoD22muvuRF1AAAASV/TNG7cONdf6Pzzz7eqVatGb5MmTYqWefzxx92UAprUUtMQqKntjTfeiD5euHBh17SnnwpT1157rXXv3t3uu+++aBnVYCkgqXapQYMGNnLkSHvuuefcCDoAAICUm6cpmTFPE9JFOs7jks44vtNLOh7fWQV1niYAAID8QmgCAADwQGgCAADwQGgCAADwQGgCAADwQGgCAADwQGgCAADwQGgCAADwQGgCAADwQGgCAADwQGgCAADwQGgCAADwQGgCAADwQGgCAADwQGgCAADwQGgCAADwQGgCAADwQGgCAADwQGgCAADwQGgCAADwQGgCAADwQGgCAADwQGgCAADwQGgCAADwQGgCAADwQGgCAADwQGgCAADwQGgCAADwQGgCAADwQGgCAADwQGgCAADwQGgCAADwQGgCAADwQGgCAADwQGgCAADwQGgCAADwQGgCAADwQGgCAADwQGgCAADwQGgCAADwQGgCAADwQGgCAADwQGgCAADwQGgCAADwQGgCAADwQGiK89RTT1mNGjWsePHi1rRpU1u0aFF+LxIAAEgChKaQSZMm2YABA+zee++1ZcuWWYMGDaxdu3a2efPm/F40AACQzwhNIaNGjbKbbrrJbrjhBqtbt66NHz/eSpYsac8//3x+LxoAAMhnmfm9AMli7969tnTpUhs0aFD0vkKFClmbNm1swYIFh5Tfs2ePuwW2b9/ufmZlZVm6ObhnV34vAo6hdNzH0xnHd3pJx+M763/vORKJHLEsoel//v3vf9uBAwescuXKMffr9zVr1hxSfvjw4TZs2LBD7q9evfpRXU4gv5UZnd9LAOBoSefj+7///a+VKVPmsGUITbmkGin1fwocPHjQtmzZYhUq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",
|
88 |
+
"text/plain": [
|
89 |
+
"<Figure size 640x480 with 1 Axes>"
|
90 |
+
]
|
91 |
+
},
|
92 |
+
"metadata": {},
|
93 |
+
"output_type": "display_data"
|
94 |
+
},
|
95 |
+
{
|
96 |
+
"data": {
|
97 |
+
"text/plain": [
|
98 |
+
"count 25000.00000\n",
|
99 |
+
"mean 1325.06964\n",
|
100 |
+
"std 1003.13367\n",
|
101 |
+
"min 52.00000\n",
|
102 |
+
"25% 702.00000\n",
|
103 |
+
"50% 979.00000\n",
|
104 |
+
"75% 1614.00000\n",
|
105 |
+
"max 13704.00000\n",
|
106 |
+
"Name: length, dtype: float64"
|
107 |
+
]
|
108 |
+
},
|
109 |
+
"metadata": {},
|
110 |
+
"output_type": "display_data"
|
111 |
+
},
|
112 |
+
{
|
113 |
+
"data": {
|
114 |
+
"image/png": "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hl3G3gYAAEDAJ03//Oc/zVQCP//8s5ky4PHHH5ewsDB5+umnJWfOnNKxY0fTTLZixQrTMfz55583yY52AlfaXKbJUbt27WTnzp1mGoGBAweauZ3smqIuXbrIoUOHpG/fvvL999/LuHHjTPOfTmcAAAAQFM1zv/zyi0mQ/vjjD8mXL5/UqVPHTCeg/1c6LUDGjBnNpJY6mk1HvWnSY9MEa968eWa0nCZT2bJlkw4dOsiQIUPcZXS6gfnz55skacyYMVKkSBGZOHEi0w0AAIDgSZpmzJhx2/U6DcHYsWPNLSHacTyxEWH16tWT7du3J3s/AQAAAqpPEwAAQKAiaQIAAHCApAkAAMABkiYAAAAHSJoAAAAcIGkCAABwgKQJAADAAZImAAAAB0iaAAAAHCBpAgAAcICkCQAAwAGSJgAAAAdImgAAABwgaQIAAHCApAkAAMABkiYAAAAHSJoAAAAcyCTJdOnSJVm1apUcPXpUrl696rWuR48eyd0sAABA6CRN27dvl+bNm0tMTIxJnnLnzi2///67ZM2aVfLnz0/SBAAAQk6ymud69eoljz32mJw5c0YiIyNl48aNcuTIEalevbq89957/t9LAACAYEyaduzYIa+++qpkzJhRwsLCJDY2VqKiomTkyJHy2muv+X8vAQAAgjFpCg8PNwmT0uY47dekcubMKceOHfPvHgIAAARrn6aqVavKli1b5N5775WHH35YBg0aZPo0/etf/5IKFSr4fy8BAACCsabp7bfflkKFCpn/Dxs2TO6++27p2rWr/PbbbzJhwgR/7yMAAEBw1jTVqFHD/X9tnlu4cKE/9wkAACDgMLklAACAP2uaqlWrJsuWLTNNcdqnKUOGDAmW/e6775xuFgAAILSSppYtW0pERIT5f6tWrVJynwAAAII3aXrzzTfj/T8AAEB6kKw+TTrdwKZNm+Is12Vbt271x34BAAAE/+i5bt26Sd++faVmzZpey3/99Vd555134k2oEBiK95+faJmfR7RIlX0BACDka5r27dtnOob70g7iug4AACDUJCtp0g7hp06dirP8xIkTkilTsiqvAAAAQi9patKkiQwYMEDOnTvnXnb27Flzsd7GjRv7c/8AAAACQrKqhd577z2pW7euFCtWzDTJqR07dkiBAgXM9ecAAABCTbKSpnvuuUd27dol06ZNk507d0pkZKQ8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Jij6hRwozp8/b157fZ9nyZLFvE46X43nl2IoxkHPzfg+DzSJTO1jnjVrlnXfffeZ94lO0zF//nwrEOKgSXRCn5v6d+klDk6TpkCKQwb9506q1wAAANID+jQBAAA4QNIEAADgAEkTAACAAyRNAAAADpA0AQAAOEDSBAAA4ABJEwAAgAMkTQDg4eeffzYXD9VLOqQE3fbcuXNTZNsAUhZJE4CA8txzz0mrVq3S7PmjoqLkxIkTUqFCBfN45cqVJtHxvdAygPQnU1rvAAAEEr2obiBcAR5A4KGmCUDQWLVqlTzwwAMSEREhhQoVkv79+8v169fd6+vVqyc9evSQvn37Su7cuU3yEx0d7bWN77//XurUqSNZsmSRcuXKmSvMezaZeTbP6f/r169vluvV0nW51oSp4sWLywcffOC17SpVqng9n17Bvm7duu7n0quqAwhe1DQBCAq//vqrNG/e3CQtX3zxhUl+OnfubBISz0Rl6tSp0rt3b9m0aZNs2LDBlH/wwQelcePGcuPGDdP0V7RoUbP+woUL8uqrr962qe5///uftGnTRg4cOCA5cuSQyMhIR/t78+ZNad26tRQoUMA817lz56Rnz55+iQWAtEHSBCAojBs3ziQxH3/8sanxKVOmjBw/flz69esngwYNkowZXRXnlSpVkjfffNP8/9577zXlly1bZpImren56aefTD8luwlu2LBhZl1CTXVaY6Xy588vuXLlcry/WoOlid2iRYukcOHCZtnbb78tzZo1u+NYAEgbNM8BCAr79++X2rVrm4TJpjVIFy9elF9++cW9TJMmT9qMd/r0afN/rS3SxMuzz5I296XU/upz2QmT0v0HELxImgCElPDwcK/HmmRpU5m/ac2WZVley65du+b35wEQOEiaAASFsmXLmj5KnonKunXr5K677pIiRYo42kbp0qXl2LFjcurUKfeyLVu23PZvMmfObO61P5SnfPnymakJbOfPn5fDhw977a8+l2eZjRs3OtpPAIGJpAlAwNFO0zp6zfP24osvmiTk5ZdfNn2FvvrqK9N3STt92/2ZEqN9l0qWLCkdOnSQXbt2maRr4MCBZp1ns5+nYsWKmXXz5s2T3377zTQHqgYNGsi//vUvWbNmjezevdtsU/tA2Ro1aiT33XefWb5z505T7vXXX/dLfACkDZImAAFHO2pXrVrV6zZ06FBZsGCBbN68WSpXrixdunSRjh07upMeJzSp0akFNPG5//77pVOnTu5ERkfhxeeee+6RwYMHm+kNdCRc9+7dzfIBAwbIww8/LI8++qi0aNHCjMrThMymidycOXPk8uXLpt+UPpd2OgcQvDJYvo3yAJCOaG2Tztv0448/eiU9AOCLpAlAuqK1P9mzZzfTEWii9Morr5iJK9euXZvWuwYgwDFPE4B0RSe01Lmdjh49Knnz5jV9j0aNGpXWuwUgCFDTBAAA4AAdwQEAABwgaQIAAHCApAkAAMABkiYAAAAHSJoAAAAcIGkCAABwgKQJAADAAZImAAAAB0iaAAAAJHH/D4JDW4LgRWJ/AAAAAElFTkSuQmCC",
|
115 |
+
"text/plain": [
|
116 |
+
"<Figure size 640x480 with 1 Axes>"
|
117 |
+
]
|
118 |
+
},
|
119 |
+
"metadata": {},
|
120 |
+
"output_type": "display_data"
|
121 |
+
},
|
122 |
+
{
|
123 |
+
"data": {
|
124 |
+
"text/html": [
|
125 |
+
"<div>\n",
|
126 |
+
"<style scoped>\n",
|
127 |
+
" .dataframe tbody tr th:only-of-type {\n",
|
128 |
+
" vertical-align: middle;\n",
|
129 |
+
" }\n",
|
130 |
+
"\n",
|
131 |
+
" .dataframe tbody tr th {\n",
|
132 |
+
" vertical-align: top;\n",
|
133 |
+
" }\n",
|
134 |
+
"\n",
|
135 |
+
" .dataframe thead th {\n",
|
136 |
+
" text-align: right;\n",
|
137 |
+
" }\n",
|
138 |
+
"</style>\n",
|
139 |
+
"<table border=\"1\" class=\"dataframe\">\n",
|
140 |
+
" <thead>\n",
|
141 |
+
" <tr style=\"text-align: right;\">\n",
|
142 |
+
" <th></th>\n",
|
143 |
+
" <th>palabra</th>\n",
|
144 |
+
" <th>conteo</th>\n",
|
145 |
+
" </tr>\n",
|
146 |
+
" </thead>\n",
|
147 |
+
" <tbody>\n",
|
148 |
+
" <tr>\n",
|
149 |
+
" <th>0</th>\n",
|
150 |
+
" <td>the</td>\n",
|
151 |
+
" <td>336749</td>\n",
|
152 |
+
" </tr>\n",
|
153 |
+
" <tr>\n",
|
154 |
+
" <th>1</th>\n",
|
155 |
+
" <td>and</td>\n",
|
156 |
+
" <td>164140</td>\n",
|
157 |
+
" </tr>\n",
|
158 |
+
" <tr>\n",
|
159 |
+
" <th>2</th>\n",
|
160 |
+
" <td>a</td>\n",
|
161 |
+
" <td>163123</td>\n",
|
162 |
+
" </tr>\n",
|
163 |
+
" <tr>\n",
|
164 |
+
" <th>3</th>\n",
|
165 |
+
" <td>of</td>\n",
|
166 |
+
" <td>145864</td>\n",
|
167 |
+
" </tr>\n",
|
168 |
+
" <tr>\n",
|
169 |
+
" <th>4</th>\n",
|
170 |
+
" <td>to</td>\n",
|
171 |
+
" <td>135724</td>\n",
|
172 |
+
" </tr>\n",
|
173 |
+
" <tr>\n",
|
174 |
+
" <th>5</th>\n",
|
175 |
+
" <td>is</td>\n",
|
176 |
+
" <td>107332</td>\n",
|
177 |
+
" </tr>\n",
|
178 |
+
" <tr>\n",
|
179 |
+
" <th>6</th>\n",
|
180 |
+
" <td>br</td>\n",
|
181 |
+
" <td>101871</td>\n",
|
182 |
+
" </tr>\n",
|
183 |
+
" <tr>\n",
|
184 |
+
" <th>7</th>\n",
|
185 |
+
" <td>it</td>\n",
|
186 |
+
" <td>96467</td>\n",
|
187 |
+
" </tr>\n",
|
188 |
+
" <tr>\n",
|
189 |
+
" <th>8</th>\n",
|
190 |
+
" <td>in</td>\n",
|
191 |
+
" <td>93976</td>\n",
|
192 |
+
" </tr>\n",
|
193 |
+
" <tr>\n",
|
194 |
+
" <th>9</th>\n",
|
195 |
+
" <td>i</td>\n",
|
196 |
+
" <td>87690</td>\n",
|
197 |
+
" </tr>\n",
|
198 |
+
" <tr>\n",
|
199 |
+
" <th>10</th>\n",
|
200 |
+
" <td>this</td>\n",
|
201 |
+
" <td>76007</td>\n",
|
202 |
+
" </tr>\n",
|
203 |
+
" <tr>\n",
|
204 |
+
" <th>11</th>\n",
|
205 |
+
" <td>that</td>\n",
|
206 |
+
" <td>73286</td>\n",
|
207 |
+
" </tr>\n",
|
208 |
+
" <tr>\n",
|
209 |
+
" <th>12</th>\n",
|
210 |
+
" <td>s</td>\n",
|
211 |
+
" <td>63602</td>\n",
|
212 |
+
" </tr>\n",
|
213 |
+
" <tr>\n",
|
214 |
+
" <th>13</th>\n",
|
215 |
+
" <td>was</td>\n",
|
216 |
+
" <td>48209</td>\n",
|
217 |
+
" </tr>\n",
|
218 |
+
" <tr>\n",
|
219 |
+
" <th>14</th>\n",
|
220 |
+
" <td>as</td>\n",
|
221 |
+
" <td>46935</td>\n",
|
222 |
+
" </tr>\n",
|
223 |
+
" <tr>\n",
|
224 |
+
" <th>15</th>\n",
|
225 |
+
" <td>for</td>\n",
|
226 |
+
" <td>44345</td>\n",
|
227 |
+
" </tr>\n",
|
228 |
+
" <tr>\n",
|
229 |
+
" <th>16</th>\n",
|
230 |
+
" <td>with</td>\n",
|
231 |
+
" <td>44130</td>\n",
|
232 |
+
" </tr>\n",
|
233 |
+
" <tr>\n",
|
234 |
+
" <th>17</th>\n",
|
235 |
+
" <td>movie</td>\n",
|
236 |
+
" <td>44047</td>\n",
|
237 |
+
" </tr>\n",
|
238 |
+
" <tr>\n",
|
239 |
+
" <th>18</th>\n",
|
240 |
+
" <td>but</td>\n",
|
241 |
+
" <td>42623</td>\n",
|
242 |
+
" </tr>\n",
|
243 |
+
" <tr>\n",
|
244 |
+
" <th>19</th>\n",
|
245 |
+
" <td>film</td>\n",
|
246 |
+
" <td>40159</td>\n",
|
247 |
+
" </tr>\n",
|
248 |
+
" </tbody>\n",
|
249 |
+
"</table>\n",
|
250 |
+
"</div>"
|
251 |
+
],
|
252 |
+
"text/plain": [
|
253 |
+
" palabra conteo\n",
|
254 |
+
"0 the 336749\n",
|
255 |
+
"1 and 164140\n",
|
256 |
+
"2 a 163123\n",
|
257 |
+
"3 of 145864\n",
|
258 |
+
"4 to 135724\n",
|
259 |
+
"5 is 107332\n",
|
260 |
+
"6 br 101871\n",
|
261 |
+
"7 it 96467\n",
|
262 |
+
"8 in 93976\n",
|
263 |
+
"9 i 87690\n",
|
264 |
+
"10 this 76007\n",
|
265 |
+
"11 that 73286\n",
|
266 |
+
"12 s 63602\n",
|
267 |
+
"13 was 48209\n",
|
268 |
+
"14 as 46935\n",
|
269 |
+
"15 for 44345\n",
|
270 |
+
"16 with 44130\n",
|
271 |
+
"17 movie 44047\n",
|
272 |
+
"18 but 42623\n",
|
273 |
+
"19 film 40159"
|
274 |
+
]
|
275 |
+
},
|
276 |
+
"metadata": {},
|
277 |
+
"output_type": "display_data"
|
278 |
+
}
|
279 |
+
],
|
280 |
+
"source": [
|
281 |
+
"# ---------------------------------------------\n",
|
282 |
+
"# CELDA 1: IMPORTACIONES Y CARGA DE DATOS (EDA)\n",
|
283 |
+
"# ---------------------------------------------\n",
|
284 |
+
"\n",
|
285 |
+
"# 1) Librerías de datos y visualización\n",
|
286 |
+
"from datasets import load_dataset\n",
|
287 |
+
"import pandas as pd\n",
|
288 |
+
"import matplotlib.pyplot as plt\n",
|
289 |
+
"from collections import Counter\n",
|
290 |
+
"import re\n",
|
291 |
+
"import warnings\n",
|
292 |
+
"warnings.filterwarnings(\"ignore\") # Ocultar warnings no críticos\n",
|
293 |
+
"\n",
|
294 |
+
"# 2) Carga del dataset IMDb\n",
|
295 |
+
"ds = load_dataset(\"imdb\") # Descarga y cachea automáticamente\n",
|
296 |
+
"train = ds[\"train\"].to_pandas() # Partición de entrenamiento\n",
|
297 |
+
"test = ds[\"test\"].to_pandas() # Partición de prueba\n",
|
298 |
+
"\n",
|
299 |
+
"# 3) Vistazo rápido a los datos\n",
|
300 |
+
"print(f\"Train set: {train.shape[0]} ejemplos\")\n",
|
301 |
+
"print(f\"Test set: {test.shape[0]} ejemplos\\n\")\n",
|
302 |
+
"display(train.head())\n",
|
303 |
+
"\n",
|
304 |
+
"# 4) Distribución de clases\n",
|
305 |
+
"train[\"label\"].value_counts().plot.bar()\n",
|
306 |
+
"plt.title(\"Distribución de etiquetas (0=negativo, 1=positivo)\")\n",
|
307 |
+
"plt.xlabel(\"Etiqueta\")\n",
|
308 |
+
"plt.ylabel(\"Conteo\")\n",
|
309 |
+
"plt.show()\n",
|
310 |
+
"\n",
|
311 |
+
"# 5) Análisis de longitud de reseñas\n",
|
312 |
+
"train[\"length\"] = train[\"text\"].str.len()\n",
|
313 |
+
"display(train[\"length\"].describe()) # Media, percentiles, etc.\n",
|
314 |
+
"train[\"length\"].hist(bins=50)\n",
|
315 |
+
"plt.title(\"Longitud de reseñas (nº caracteres)\")\n",
|
316 |
+
"plt.xlabel(\"Longitud\")\n",
|
317 |
+
"plt.ylabel(\"Frecuencia\")\n",
|
318 |
+
"plt.show()\n",
|
319 |
+
"\n",
|
320 |
+
"# 6) Top 20 palabras más frecuentes\n",
|
321 |
+
"all_words = Counter()\n",
|
322 |
+
"for t in train[\"text\"]:\n",
|
323 |
+
" tokens = re.findall(r\"\\w+\", t.lower()) # Solo palabras\n",
|
324 |
+
" all_words.update(tokens)\n",
|
325 |
+
"most_common = all_words.most_common(20)\n",
|
326 |
+
"display(pd.DataFrame(most_common, columns=[\"palabra\",\"conteo\"]))\n"
|
327 |
+
]
|
328 |
+
},
|
329 |
+
{
|
330 |
+
"cell_type": "code",
|
331 |
+
"execution_count": 2,
|
332 |
+
"id": "a6b2c3ea-1bce-4c70-a41e-5ea2ab43e641",
|
333 |
+
"metadata": {},
|
334 |
+
"outputs": [
|
335 |
+
{
|
336 |
+
"name": "stdout",
|
337 |
+
"output_type": "stream",
|
338 |
+
"text": [
|
339 |
+
"Tokenizer cargado: BertTokenizerFast\n",
|
340 |
+
"Batches de entrenamiento: 1563\n",
|
341 |
+
"Batches de validación: 1563\n",
|
342 |
+
"\n",
|
343 |
+
"Tamaños del batch de entrenamiento:\n",
|
344 |
+
" input_ids torch.Size([16, 128])\n",
|
345 |
+
" attention_mask torch.Size([16, 128])\n",
|
346 |
+
" labels torch.Size([16])\n"
|
347 |
+
]
|
348 |
+
}
|
349 |
+
],
|
350 |
+
"source": [
|
351 |
+
"# -------------------------------------------------------------\n",
|
352 |
+
"# CELDA 2: TOKENIZACIÓN Y CREACIÓN DE DATASETS & DATALOADERS\n",
|
353 |
+
"# -------------------------------------------------------------\n",
|
354 |
+
"\n",
|
355 |
+
"# 1) Importaciones necesarias\n",
|
356 |
+
"from transformers import AutoTokenizer\n",
|
357 |
+
"import torch\n",
|
358 |
+
"from torch.utils.data import Dataset, DataLoader\n",
|
359 |
+
"\n",
|
360 |
+
"# 2) Cargar tokenizer BERT\n",
|
361 |
+
"# - \"bert-base-uncased\" es un modelo preentrenado en inglés\n",
|
362 |
+
"tokenizer = AutoTokenizer.from_pretrained(\"bert-base-uncased\")\n",
|
363 |
+
"print(\"Tokenizer cargado:\", tokenizer.__class__.__name__)\n",
|
364 |
+
"\n",
|
365 |
+
"# 3) Definir clase Dataset para IMDb\n",
|
366 |
+
"class IMDbDataset(Dataset):\n",
|
367 |
+
" def __init__(self, texts, labels, tokenizer, max_len=128):\n",
|
368 |
+
" self.texts = texts\n",
|
369 |
+
" self.labels = labels\n",
|
370 |
+
" self.tokenizer = tokenizer\n",
|
371 |
+
" self.max_len = max_len\n",
|
372 |
+
"\n",
|
373 |
+
" def __len__(self):\n",
|
374 |
+
" return len(self.texts)\n",
|
375 |
+
"\n",
|
376 |
+
" def __getitem__(self, idx):\n",
|
377 |
+
" text = str(self.texts[idx])\n",
|
378 |
+
" label = int(self.labels[idx])\n",
|
379 |
+
" # Tokenización y padding/truncation\n",
|
380 |
+
" enc = self.tokenizer(\n",
|
381 |
+
" text,\n",
|
382 |
+
" add_special_tokens=True, # Añade [CLS] y [SEP]\n",
|
383 |
+
" max_length=self.max_len, # Longitud fija\n",
|
384 |
+
" truncation=True, # Trunca si es muy largo\n",
|
385 |
+
" padding=\"max_length\", # Rellena si es muy corto\n",
|
386 |
+
" return_attention_mask=True, # Máscara de atención\n",
|
387 |
+
" return_tensors=\"pt\" # Tensores PyTorch\n",
|
388 |
+
" )\n",
|
389 |
+
" return {\n",
|
390 |
+
" \"input_ids\": enc[\"input_ids\"].squeeze(), # Tensor [max_len]\n",
|
391 |
+
" \"attention_mask\": enc[\"attention_mask\"].squeeze(), # Tensor [max_len]\n",
|
392 |
+
" \"labels\": torch.tensor(label, dtype=torch.long)\n",
|
393 |
+
" }\n",
|
394 |
+
"\n",
|
395 |
+
"# 4) Instanciar los datasets de entrenamiento y prueba\n",
|
396 |
+
"train_dataset = IMDbDataset(\n",
|
397 |
+
" texts=train[\"text\"].tolist(),\n",
|
398 |
+
" labels=train[\"label\"].tolist(),\n",
|
399 |
+
" tokenizer=tokenizer,\n",
|
400 |
+
" max_len=128\n",
|
401 |
+
")\n",
|
402 |
+
"test_dataset = IMDbDataset(\n",
|
403 |
+
" texts=test[\"text\"].tolist(),\n",
|
404 |
+
" labels=test[\"label\"].tolist(),\n",
|
405 |
+
" tokenizer=tokenizer,\n",
|
406 |
+
" max_len=128\n",
|
407 |
+
")\n",
|
408 |
+
"\n",
|
409 |
+
"# 5) Crear DataLoaders para batching\n",
|
410 |
+
"train_loader = DataLoader(train_dataset, batch_size=16, shuffle=True)\n",
|
411 |
+
"test_loader = DataLoader(test_dataset, batch_size=16, shuffle=False)\n",
|
412 |
+
"\n",
|
413 |
+
"# 6) Verificar número de batches y un batch de ejemplo\n",
|
414 |
+
"print(f\"Batches de entrenamiento: {len(train_loader)}\")\n",
|
415 |
+
"print(f\"Batches de validación: {len(test_loader)}\\n\")\n",
|
416 |
+
"\n",
|
417 |
+
"# Obtener y mostrar dimensiones de un batch\n",
|
418 |
+
"batch = next(iter(train_loader))\n",
|
419 |
+
"print(\"Tamaños del batch de entrenamiento:\")\n",
|
420 |
+
"print(\" input_ids \", batch[\"input_ids\"].shape)\n",
|
421 |
+
"print(\" attention_mask\", batch[\"attention_mask\"].shape)\n",
|
422 |
+
"print(\" labels \", batch[\"labels\"].shape)\n"
|
423 |
+
]
|
424 |
+
},
|
425 |
+
{
|
426 |
+
"cell_type": "code",
|
427 |
+
"execution_count": 3,
|
428 |
+
"id": "377d78c7-1ee2-4059-bf7f-f441c837426e",
|
429 |
+
"metadata": {},
|
430 |
+
"outputs": [
|
431 |
+
{
|
432 |
+
"name": "stderr",
|
433 |
+
"output_type": "stream",
|
434 |
+
"text": [
|
435 |
+
"Some weights of BertForSequenceClassification were not initialized from the model checkpoint at bert-base-uncased and are newly initialized: ['classifier.bias', 'classifier.weight']\n",
|
436 |
+
"You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.\n"
|
437 |
+
]
|
438 |
+
},
|
439 |
+
{
|
440 |
+
"name": "stdout",
|
441 |
+
"output_type": "stream",
|
442 |
+
"text": [
|
443 |
+
"✔ TrainingArguments configurados\n",
|
444 |
+
"✔ Trainer instanciado\n",
|
445 |
+
"\n",
|
446 |
+
"→ Entrenamiento en curso… puede tardar varios minutos:\n"
|
447 |
+
]
|
448 |
+
},
|
449 |
+
{
|
450 |
+
"data": {
|
451 |
+
"text/html": [
|
452 |
+
"\n",
|
453 |
+
" <div>\n",
|
454 |
+
" \n",
|
455 |
+
" <progress value='4689' max='4689' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
|
456 |
+
" [4689/4689 16:50:50, Epoch 3/3]\n",
|
457 |
+
" </div>\n",
|
458 |
+
" <table border=\"1\" class=\"dataframe\">\n",
|
459 |
+
" <thead>\n",
|
460 |
+
" <tr style=\"text-align: left;\">\n",
|
461 |
+
" <th>Step</th>\n",
|
462 |
+
" <th>Training Loss</th>\n",
|
463 |
+
" </tr>\n",
|
464 |
+
" </thead>\n",
|
465 |
+
" <tbody>\n",
|
466 |
+
" <tr>\n",
|
467 |
+
" <td>100</td>\n",
|
468 |
+
" <td>0.516200</td>\n",
|
469 |
+
" </tr>\n",
|
470 |
+
" <tr>\n",
|
471 |
+
" <td>200</td>\n",
|
472 |
+
" <td>0.412300</td>\n",
|
473 |
+
" </tr>\n",
|
474 |
+
" <tr>\n",
|
475 |
+
" <td>300</td>\n",
|
476 |
+
" <td>0.410600</td>\n",
|
477 |
+
" </tr>\n",
|
478 |
+
" <tr>\n",
|
479 |
+
" <td>400</td>\n",
|
480 |
+
" <td>0.361900</td>\n",
|
481 |
+
" </tr>\n",
|
482 |
+
" <tr>\n",
|
483 |
+
" <td>500</td>\n",
|
484 |
+
" <td>0.372400</td>\n",
|
485 |
+
" </tr>\n",
|
486 |
+
" <tr>\n",
|
487 |
+
" <td>600</td>\n",
|
488 |
+
" <td>0.358200</td>\n",
|
489 |
+
" </tr>\n",
|
490 |
+
" <tr>\n",
|
491 |
+
" <td>700</td>\n",
|
492 |
+
" <td>0.351000</td>\n",
|
493 |
+
" </tr>\n",
|
494 |
+
" <tr>\n",
|
495 |
+
" <td>800</td>\n",
|
496 |
+
" <td>0.351700</td>\n",
|
497 |
+
" </tr>\n",
|
498 |
+
" <tr>\n",
|
499 |
+
" <td>900</td>\n",
|
500 |
+
" <td>0.319700</td>\n",
|
501 |
+
" </tr>\n",
|
502 |
+
" <tr>\n",
|
503 |
+
" <td>1000</td>\n",
|
504 |
+
" <td>0.345700</td>\n",
|
505 |
+
" </tr>\n",
|
506 |
+
" <tr>\n",
|
507 |
+
" <td>1100</td>\n",
|
508 |
+
" <td>0.315200</td>\n",
|
509 |
+
" </tr>\n",
|
510 |
+
" <tr>\n",
|
511 |
+
" <td>1200</td>\n",
|
512 |
+
" <td>0.331200</td>\n",
|
513 |
+
" </tr>\n",
|
514 |
+
" <tr>\n",
|
515 |
+
" <td>1300</td>\n",
|
516 |
+
" <td>0.309800</td>\n",
|
517 |
+
" </tr>\n",
|
518 |
+
" <tr>\n",
|
519 |
+
" <td>1400</td>\n",
|
520 |
+
" <td>0.305700</td>\n",
|
521 |
+
" </tr>\n",
|
522 |
+
" <tr>\n",
|
523 |
+
" <td>1500</td>\n",
|
524 |
+
" <td>0.299400</td>\n",
|
525 |
+
" </tr>\n",
|
526 |
+
" <tr>\n",
|
527 |
+
" <td>1600</td>\n",
|
528 |
+
" <td>0.294500</td>\n",
|
529 |
+
" </tr>\n",
|
530 |
+
" <tr>\n",
|
531 |
+
" <td>1700</td>\n",
|
532 |
+
" <td>0.207200</td>\n",
|
533 |
+
" </tr>\n",
|
534 |
+
" <tr>\n",
|
535 |
+
" <td>1800</td>\n",
|
536 |
+
" <td>0.191500</td>\n",
|
537 |
+
" </tr>\n",
|
538 |
+
" <tr>\n",
|
539 |
+
" <td>1900</td>\n",
|
540 |
+
" <td>0.226800</td>\n",
|
541 |
+
" </tr>\n",
|
542 |
+
" <tr>\n",
|
543 |
+
" <td>2000</td>\n",
|
544 |
+
" <td>0.163900</td>\n",
|
545 |
+
" </tr>\n",
|
546 |
+
" <tr>\n",
|
547 |
+
" <td>2100</td>\n",
|
548 |
+
" <td>0.186600</td>\n",
|
549 |
+
" </tr>\n",
|
550 |
+
" <tr>\n",
|
551 |
+
" <td>2200</td>\n",
|
552 |
+
" <td>0.217100</td>\n",
|
553 |
+
" </tr>\n",
|
554 |
+
" <tr>\n",
|
555 |
+
" <td>2300</td>\n",
|
556 |
+
" <td>0.179600</td>\n",
|
557 |
+
" </tr>\n",
|
558 |
+
" <tr>\n",
|
559 |
+
" <td>2400</td>\n",
|
560 |
+
" <td>0.187800</td>\n",
|
561 |
+
" </tr>\n",
|
562 |
+
" <tr>\n",
|
563 |
+
" <td>2500</td>\n",
|
564 |
+
" <td>0.167500</td>\n",
|
565 |
+
" </tr>\n",
|
566 |
+
" <tr>\n",
|
567 |
+
" <td>2600</td>\n",
|
568 |
+
" <td>0.204400</td>\n",
|
569 |
+
" </tr>\n",
|
570 |
+
" <tr>\n",
|
571 |
+
" <td>2700</td>\n",
|
572 |
+
" <td>0.182700</td>\n",
|
573 |
+
" </tr>\n",
|
574 |
+
" <tr>\n",
|
575 |
+
" <td>2800</td>\n",
|
576 |
+
" <td>0.195400</td>\n",
|
577 |
+
" </tr>\n",
|
578 |
+
" <tr>\n",
|
579 |
+
" <td>2900</td>\n",
|
580 |
+
" <td>0.183800</td>\n",
|
581 |
+
" </tr>\n",
|
582 |
+
" <tr>\n",
|
583 |
+
" <td>3000</td>\n",
|
584 |
+
" <td>0.184700</td>\n",
|
585 |
+
" </tr>\n",
|
586 |
+
" <tr>\n",
|
587 |
+
" <td>3100</td>\n",
|
588 |
+
" <td>0.181700</td>\n",
|
589 |
+
" </tr>\n",
|
590 |
+
" <tr>\n",
|
591 |
+
" <td>3200</td>\n",
|
592 |
+
" <td>0.110600</td>\n",
|
593 |
+
" </tr>\n",
|
594 |
+
" <tr>\n",
|
595 |
+
" <td>3300</td>\n",
|
596 |
+
" <td>0.071500</td>\n",
|
597 |
+
" </tr>\n",
|
598 |
+
" <tr>\n",
|
599 |
+
" <td>3400</td>\n",
|
600 |
+
" <td>0.098600</td>\n",
|
601 |
+
" </tr>\n",
|
602 |
+
" <tr>\n",
|
603 |
+
" <td>3500</td>\n",
|
604 |
+
" <td>0.084200</td>\n",
|
605 |
+
" </tr>\n",
|
606 |
+
" <tr>\n",
|
607 |
+
" <td>3600</td>\n",
|
608 |
+
" <td>0.085900</td>\n",
|
609 |
+
" </tr>\n",
|
610 |
+
" <tr>\n",
|
611 |
+
" <td>3700</td>\n",
|
612 |
+
" <td>0.083100</td>\n",
|
613 |
+
" </tr>\n",
|
614 |
+
" <tr>\n",
|
615 |
+
" <td>3800</td>\n",
|
616 |
+
" <td>0.085900</td>\n",
|
617 |
+
" </tr>\n",
|
618 |
+
" <tr>\n",
|
619 |
+
" <td>3900</td>\n",
|
620 |
+
" <td>0.097200</td>\n",
|
621 |
+
" </tr>\n",
|
622 |
+
" <tr>\n",
|
623 |
+
" <td>4000</td>\n",
|
624 |
+
" <td>0.077700</td>\n",
|
625 |
+
" </tr>\n",
|
626 |
+
" <tr>\n",
|
627 |
+
" <td>4100</td>\n",
|
628 |
+
" <td>0.089600</td>\n",
|
629 |
+
" </tr>\n",
|
630 |
+
" <tr>\n",
|
631 |
+
" <td>4200</td>\n",
|
632 |
+
" <td>0.096600</td>\n",
|
633 |
+
" </tr>\n",
|
634 |
+
" <tr>\n",
|
635 |
+
" <td>4300</td>\n",
|
636 |
+
" <td>0.073400</td>\n",
|
637 |
+
" </tr>\n",
|
638 |
+
" <tr>\n",
|
639 |
+
" <td>4400</td>\n",
|
640 |
+
" <td>0.086300</td>\n",
|
641 |
+
" </tr>\n",
|
642 |
+
" <tr>\n",
|
643 |
+
" <td>4500</td>\n",
|
644 |
+
" <td>0.060700</td>\n",
|
645 |
+
" </tr>\n",
|
646 |
+
" <tr>\n",
|
647 |
+
" <td>4600</td>\n",
|
648 |
+
" <td>0.059000</td>\n",
|
649 |
+
" </tr>\n",
|
650 |
+
" </tbody>\n",
|
651 |
+
"</table><p>"
|
652 |
+
],
|
653 |
+
"text/plain": [
|
654 |
+
"<IPython.core.display.HTML object>"
|
655 |
+
]
|
656 |
+
},
|
657 |
+
"metadata": {},
|
658 |
+
"output_type": "display_data"
|
659 |
+
},
|
660 |
+
{
|
661 |
+
"data": {
|
662 |
+
"text/html": [
|
663 |
+
"\n",
|
664 |
+
" <div>\n",
|
665 |
+
" \n",
|
666 |
+
" <progress value='1563' max='1563' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
|
667 |
+
" [1563/1563 2:00:59]\n",
|
668 |
+
" </div>\n",
|
669 |
+
" "
|
670 |
+
],
|
671 |
+
"text/plain": [
|
672 |
+
"<IPython.core.display.HTML object>"
|
673 |
+
]
|
674 |
+
},
|
675 |
+
"metadata": {},
|
676 |
+
"output_type": "display_data"
|
677 |
+
},
|
678 |
+
{
|
679 |
+
"name": "stdout",
|
680 |
+
"output_type": "stream",
|
681 |
+
"text": [
|
682 |
+
"\n",
|
683 |
+
"✔ Evaluación final en test:\n",
|
684 |
+
" eval_loss: 0.5139\n",
|
685 |
+
" eval_accuracy: 0.8884\n",
|
686 |
+
" eval_f1: 0.8883\n",
|
687 |
+
" eval_runtime: 7263.0685\n",
|
688 |
+
" eval_samples_per_second: 3.4420\n",
|
689 |
+
" eval_steps_per_second: 0.2150\n",
|
690 |
+
" epoch: 3.0000\n",
|
691 |
+
"\n",
|
692 |
+
"✔ Modelo y tokenizer guardados en 'sentiment-bert-model/'\n"
|
693 |
+
]
|
694 |
+
}
|
695 |
+
],
|
696 |
+
"source": [
|
697 |
+
"# -------------------------------------------------------------\n",
|
698 |
+
"# CELDA 3: DEFINICIÓN, ENTRENAMIENTO, EVALUACIÓN Y GUARDADO\n",
|
699 |
+
"# -------------------------------------------------------------\n",
|
700 |
+
"\n",
|
701 |
+
"# 1) Importaciones para el entrenamiento\n",
|
702 |
+
"from transformers import (\n",
|
703 |
+
" AutoModelForSequenceClassification,\n",
|
704 |
+
" TrainingArguments,\n",
|
705 |
+
" Trainer\n",
|
706 |
+
")\n",
|
707 |
+
"import numpy as np\n",
|
708 |
+
"from sklearn.metrics import accuracy_score, f1_score\n",
|
709 |
+
"\n",
|
710 |
+
"# 2) Carga del modelo BERT para clasificación binaria\n",
|
711 |
+
"# num_labels=2 porque tenemos dos clases: positiva y negativa\n",
|
712 |
+
"model = AutoModelForSequenceClassification.from_pretrained(\n",
|
713 |
+
" \"bert-base-uncased\",\n",
|
714 |
+
" num_labels=2\n",
|
715 |
+
")\n",
|
716 |
+
"\n",
|
717 |
+
"# 3) Definición de la función de métricas\n",
|
718 |
+
"def compute_metrics(eval_pred):\n",
|
719 |
+
" logits, labels = eval_pred\n",
|
720 |
+
" preds = np.argmax(logits, axis=1)\n",
|
721 |
+
" return {\n",
|
722 |
+
" \"accuracy\": accuracy_score(labels, preds),\n",
|
723 |
+
" \"f1\": f1_score(labels, preds)\n",
|
724 |
+
" }\n",
|
725 |
+
"\n",
|
726 |
+
"# 4) Configuración de los argumentos de entrenamiento\n",
|
727 |
+
"# Adaptado a transformers 4.51.3 con do_train y do_eval\n",
|
728 |
+
"training_args = TrainingArguments(\n",
|
729 |
+
" output_dir=\"./results\", # Carpeta donde guardar checkpoints\n",
|
730 |
+
" num_train_epochs=3, # Número de pasadas sobre el dataset\n",
|
731 |
+
" per_device_train_batch_size=16, # Tamaño de batch en entrenamiento\n",
|
732 |
+
" per_device_eval_batch_size=16, # Tamaño de batch en evaluación\n",
|
733 |
+
" do_train=True, # Ejecutar fase de entrenamiento\n",
|
734 |
+
" do_eval=True, # Ejecutar evaluación al final\n",
|
735 |
+
" logging_dir=\"./logs\", # Carpeta de logs para TensorBoard\n",
|
736 |
+
" logging_steps=100 # Cada cuántos pasos registrar métricas\n",
|
737 |
+
")\n",
|
738 |
+
"\n",
|
739 |
+
"print(\"✔ TrainingArguments configurados\")\n",
|
740 |
+
"\n",
|
741 |
+
"# 5) Creación del Trainer\n",
|
742 |
+
"trainer = Trainer(\n",
|
743 |
+
" model=model,\n",
|
744 |
+
" args=training_args,\n",
|
745 |
+
" train_dataset=train_dataset, # Viene de la celda 2\n",
|
746 |
+
" eval_dataset=test_dataset, # Viene de la celda 2\n",
|
747 |
+
" compute_metrics=compute_metrics\n",
|
748 |
+
")\n",
|
749 |
+
"\n",
|
750 |
+
"print(\"✔ Trainer instanciado\")\n",
|
751 |
+
"\n",
|
752 |
+
"# 6) Lanzar el entrenamiento\n",
|
753 |
+
"print(\"\\n→ Entrenamiento en curso… puede tardar varios minutos:\")\n",
|
754 |
+
"trainer.train()\n",
|
755 |
+
"\n",
|
756 |
+
"# 7) Evaluación final en test set\n",
|
757 |
+
"metrics = trainer.evaluate()\n",
|
758 |
+
"print(\"\\n✔ Evaluación final en test:\")\n",
|
759 |
+
"for name, value in metrics.items():\n",
|
760 |
+
" print(f\" {name}: {value:.4f}\")\n",
|
761 |
+
"\n",
|
762 |
+
"# 8) Guardar modelo y tokenizer para despliegue\n",
|
763 |
+
"trainer.save_model(\"sentiment-bert-model\") # Pesos y config\n",
|
764 |
+
"tokenizer.save_pretrained(\"sentiment-bert-model\") # Archivos del tokenizer\n",
|
765 |
+
"print(\"\\n✔ Modelo y tokenizer guardados en 'sentiment-bert-model/'\")\n",
|
766 |
+
"\n"
|
767 |
+
]
|
768 |
+
},
|
769 |
+
{
|
770 |
+
"cell_type": "code",
|
771 |
+
"execution_count": 14,
|
772 |
+
"id": "0db4d022-aa06-40e2-b4b8-ab6b1e226a16",
|
773 |
+
"metadata": {},
|
774 |
+
"outputs": [
|
775 |
+
{
|
776 |
+
"name": "stdout",
|
777 |
+
"output_type": "stream",
|
778 |
+
"text": [
|
779 |
+
"Requirement already satisfied: huggingface_hub in c:\\users\\light\\documents\\sentiment-analysis-bert\\venv\\lib\\site-packages (0.31.1)\n",
|
780 |
+
"Collecting huggingface_hub\n",
|
781 |
+
" Using cached huggingface_hub-0.32.0-py3-none-any.whl.metadata (14 kB)\n",
|
782 |
+
"Requirement already satisfied: filelock in c:\\users\\light\\documents\\sentiment-analysis-bert\\venv\\lib\\site-packages (from huggingface_hub) (3.18.0)\n",
|
783 |
+
"Requirement already satisfied: fsspec>=2023.5.0 in c:\\users\\light\\documents\\sentiment-analysis-bert\\venv\\lib\\site-packages (from huggingface_hub) (2025.3.0)\n",
|
784 |
+
"Requirement already satisfied: packaging>=20.9 in c:\\users\\light\\documents\\sentiment-analysis-bert\\venv\\lib\\site-packages (from huggingface_hub) (25.0)\n",
|
785 |
+
"Requirement already satisfied: pyyaml>=5.1 in c:\\users\\light\\documents\\sentiment-analysis-bert\\venv\\lib\\site-packages (from huggingface_hub) (6.0.2)\n",
|
786 |
+
"Requirement already satisfied: requests in c:\\users\\light\\documents\\sentiment-analysis-bert\\venv\\lib\\site-packages (from huggingface_hub) (2.32.3)\n",
|
787 |
+
"Requirement already satisfied: tqdm>=4.42.1 in c:\\users\\light\\documents\\sentiment-analysis-bert\\venv\\lib\\site-packages (from huggingface_hub) (4.67.1)\n",
|
788 |
+
"Requirement already satisfied: typing-extensions>=3.7.4.3 in c:\\users\\light\\documents\\sentiment-analysis-bert\\venv\\lib\\site-packages (from huggingface_hub) (4.13.2)\n",
|
789 |
+
"Requirement already satisfied: colorama in c:\\users\\light\\documents\\sentiment-analysis-bert\\venv\\lib\\site-packages (from tqdm>=4.42.1->huggingface_hub) (0.4.6)\n",
|
790 |
+
"Requirement already satisfied: charset-normalizer<4,>=2 in c:\\users\\light\\documents\\sentiment-analysis-bert\\venv\\lib\\site-packages (from requests->huggingface_hub) (3.4.2)\n",
|
791 |
+
"Requirement already satisfied: idna<4,>=2.5 in c:\\users\\light\\documents\\sentiment-analysis-bert\\venv\\lib\\site-packages (from requests->huggingface_hub) (3.10)\n",
|
792 |
+
"Requirement already satisfied: urllib3<3,>=1.21.1 in c:\\users\\light\\documents\\sentiment-analysis-bert\\venv\\lib\\site-packages (from requests->huggingface_hub) (2.4.0)\n",
|
793 |
+
"Requirement already satisfied: certifi>=2017.4.17 in c:\\users\\light\\documents\\sentiment-analysis-bert\\venv\\lib\\site-packages (from requests->huggingface_hub) (2025.4.26)\n",
|
794 |
+
"Using cached huggingface_hub-0.32.0-py3-none-any.whl (509 kB)\n",
|
795 |
+
"Installing collected packages: huggingface_hub\n",
|
796 |
+
" Attempting uninstall: huggingface_hub\n",
|
797 |
+
" Found existing installation: huggingface-hub 0.31.1\n",
|
798 |
+
" Uninstalling huggingface-hub-0.31.1:\n",
|
799 |
+
" Successfully uninstalled huggingface-hub-0.31.1\n",
|
800 |
+
"Successfully installed huggingface_hub-0.32.0\n",
|
801 |
+
"Note: you may need to restart the kernel to use updated packages.\n"
|
802 |
+
]
|
803 |
+
}
|
804 |
+
],
|
805 |
+
"source": [
|
806 |
+
"%pip install --upgrade huggingface_hub"
|
807 |
+
]
|
808 |
+
},
|
809 |
+
{
|
810 |
+
"cell_type": "code",
|
811 |
+
"execution_count": null,
|
812 |
+
"id": "031f4c70-5a75-4d89-9905-bbf8016b7b68",
|
813 |
+
"metadata": {},
|
814 |
+
"outputs": [],
|
815 |
+
"source": [
|
816 |
+
"import os\n",
|
817 |
+
"from huggingface_hub import HfApi, login, create_repo\n",
|
818 |
+
"\n",
|
819 |
+
"# --- CONFIGURACIÓN CRUCIAL ---\n",
|
820 |
+
"HF_USERNAME = \"Light-Dav\" # ¡Tu nombre de usuario correcto!\n",
|
821 |
+
"HF_TOKEN = \"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\" # ¡Tu token de Hugging Face!\n",
|
822 |
+
"\n",
|
823 |
+
"REPO_NAME = \"sentiment-analysis-full-project\" # <--- ¡Confirma que este es el nombre EXACTO del repo en HF Hub!\n",
|
824 |
+
"REPO_ID = f\"{HF_USERNAME}/{REPO_NAME}\"\n",
|
825 |
+
"\n",
|
826 |
+
"# --- AJUSTE DE LA RUTA DEL PROYECTO ---\n",
|
827 |
+
"# Esto asegurará que siempre suba la raíz de tu proyecto, sin importar dónde esté el notebook.\n",
|
828 |
+
"# Asumimos que tu carpeta principal es 'sentiment-analysis-bert'\n",
|
829 |
+
"# y que tu notebook está dentro de ella o en una subcarpeta (como 'notebooks').\n",
|
830 |
+
"# Puedes ajustar esta ruta si tu proyecto no está en C:\\Users\\Light\\Documents\\sentiment-analysis-bert\n",
|
831 |
+
"PROJECT_ROOT_DIR = \"C:\\\\Users\\\\Light\\\\Documents\\\\sentiment-analysis-bert\"\n",
|
832 |
+
"\n",
|
833 |
+
"\n",
|
834 |
+
"print(f\"La ruta del proyecto a subir es: {PROJECT_ROOT_DIR}\")\n",
|
835 |
+
"print(f\"El repositorio de destino será: {REPO_ID}\")\n",
|
836 |
+
"\n",
|
837 |
+
"# --- EJECUCIÓN ---\n",
|
838 |
+
"try:\n",
|
839 |
+
" print(\"\\n--- Paso 1: Iniciando sesión en Hugging Face Hub ---\")\n",
|
840 |
+
" login(token=HF_TOKEN)\n",
|
841 |
+
" print(\"Inicio de sesión exitoso en Hugging Face Hub.\")\n",
|
842 |
+
"\n",
|
843 |
+
" api = HfApi()\n",
|
844 |
+
"\n",
|
845 |
+
" print(f\"\\n--- Paso 2: Creando/Verificando el repositorio '{REPO_ID}' en Hugging Face Hub ---\")\n",
|
846 |
+
" create_repo(repo_id=REPO_ID, private=False, exist_ok=True, token=HF_TOKEN)\n",
|
847 |
+
" print(f\"Repositorio '{REPO_ID}' creado o ya existe en Hugging Face Hub.\")\n",
|
848 |
+
"\n",
|
849 |
+
" print(f\"\\n--- Paso 3: Subiendo el contenido de '{PROJECT_ROOT_DIR}' a '{REPO_ID}' ---\")\n",
|
850 |
+
" api.upload_folder(\n",
|
851 |
+
" folder_path=PROJECT_ROOT_DIR,\n",
|
852 |
+
" repo_id=REPO_ID,\n",
|
853 |
+
" repo_type=\"model\",\n",
|
854 |
+
" commit_message=\"Initial upload of full sentiment analysis project (code, notebooks, data)\",\n",
|
855 |
+
" # Ahora 'git_exclude' debería funcionar después de la actualización.\n",
|
856 |
+
" git_exclude=[\n",
|
857 |
+
" \"venv/\", # Excluye el entorno virtual\n",
|
858 |
+
" \"**/__pycache__/\", # Excluye archivos de caché de Python\n",
|
859 |
+
" \"*.ipynb_checkpoints/\", # Excluye checkpoints de Jupyter si están en la raíz\n",
|
860 |
+
" \"notebooks/.ipynb_checkpoints/\", # Excluye checkpoints específicos de notebooks\n",
|
861 |
+
" # Puedes añadir más exclusiones aquí, ej: \"data/raw_large_files/\"\n",
|
862 |
+
" # También podrías querer excluir tu modelo ya subido si ya está en otro repo:\n",
|
863 |
+
" # \"sentiment-bert-model/\"\n",
|
864 |
+
" ],\n",
|
865 |
+
" multi_commits=True # Útil para uploads grandes\n",
|
866 |
+
" )\n",
|
867 |
+
"\n",
|
868 |
+
" print(\"\\n¡Carga de todo el proyecto completada con éxito!\")\n",
|
869 |
+
" print(f\"Tu proyecto está ahora disponible en: https://huggingface.co/{REPO_ID}\")\n",
|
870 |
+
"\n",
|
871 |
+
"except Exception as e:\n",
|
872 |
+
" print(f\"\\nERROR al subir el proyecto a Hugging Face Hub: {e}\")\n",
|
873 |
+
" print(\"Verifica los siguientes puntos:\")\n",
|
874 |
+
" print(f\"- Tu nombre de usuario: '{HF_USERNAME}' y tu token son correctos y tienen permisos de escritura.\")\n",
|
875 |
+
" print(f\"- El nombre del repositorio: '{REPO_NAME}' es el que deseas.\")\n",
|
876 |
+
" print(f\"- La ruta local del proyecto: '{PROJECT_ROOT_DIR}' es la correcta y contiene todos tus archivos.\")\n",
|
877 |
+
" print(\"- Tienes conexión a internet.\")\n",
|
878 |
+
" print(\"- ¡MUY IMPORTANTE: Asegúrate de haber reiniciado el kernel de Jupyter después de actualizar la librería!\")"
|
879 |
+
]
|
880 |
+
}
|
881 |
+
],
|
882 |
+
"metadata": {
|
883 |
+
"kernelspec": {
|
884 |
+
"display_name": "Python 3 (ipykernel)",
|
885 |
+
"language": "python",
|
886 |
+
"name": "python3"
|
887 |
+
},
|
888 |
+
"language_info": {
|
889 |
+
"codemirror_mode": {
|
890 |
+
"name": "ipython",
|
891 |
+
"version": 3
|
892 |
+
},
|
893 |
+
"file_extension": ".py",
|
894 |
+
"mimetype": "text/x-python",
|
895 |
+
"name": "python",
|
896 |
+
"nbconvert_exporter": "python",
|
897 |
+
"pygments_lexer": "ipython3",
|
898 |
+
"version": "3.12.10"
|
899 |
+
}
|
900 |
+
},
|
901 |
+
"nbformat": 4,
|
902 |
+
"nbformat_minor": 5
|
903 |
+
}
|
notebooks/results/checkpoint-2000/rng_state.pth
CHANGED
Binary files a/notebooks/results/checkpoint-2000/rng_state.pth and b/notebooks/results/checkpoint-2000/rng_state.pth differ
|
|
notebooks/results/checkpoint-2000/scheduler.pt
CHANGED
Binary files a/notebooks/results/checkpoint-2000/scheduler.pt and b/notebooks/results/checkpoint-2000/scheduler.pt differ
|
|
notebooks/results/checkpoint-2000/training_args.bin
CHANGED
Binary files a/notebooks/results/checkpoint-2000/training_args.bin and b/notebooks/results/checkpoint-2000/training_args.bin differ
|
|
notebooks/results/checkpoint-2500/rng_state.pth
CHANGED
Binary files a/notebooks/results/checkpoint-2500/rng_state.pth and b/notebooks/results/checkpoint-2500/rng_state.pth differ
|
|
notebooks/results/checkpoint-2500/scheduler.pt
CHANGED
Binary files a/notebooks/results/checkpoint-2500/scheduler.pt and b/notebooks/results/checkpoint-2500/scheduler.pt differ
|
|
notebooks/sentiment-bert-model/training_args.bin
CHANGED
Binary files a/notebooks/sentiment-bert-model/training_args.bin and b/notebooks/sentiment-bert-model/training_args.bin differ
|
|
sentiment-bert-model/rng_state.pth
CHANGED
Binary files a/sentiment-bert-model/rng_state.pth and b/sentiment-bert-model/rng_state.pth differ
|
|
sentiment-bert-model/scheduler.pt
CHANGED
Binary files a/sentiment-bert-model/scheduler.pt and b/sentiment-bert-model/scheduler.pt differ
|
|
sentiment-bert-model/training_args.bin
CHANGED
Binary files a/sentiment-bert-model/training_args.bin and b/sentiment-bert-model/training_args.bin differ
|
|