Light-Dav commited on
Commit
c5f71db
·
verified ·
1 Parent(s): bbf10f2

Add files using upload-large-folder tool

Browse files
.gitattributes CHANGED
@@ -87,3 +87,8 @@ venv/Scripts/pywin32_postinstall.exe filter=lfs diff=lfs merge=lfs -text
87
  venv/Scripts/pywin32_testall.exe filter=lfs diff=lfs merge=lfs -text
88
  venv/Scripts/send2trash.exe filter=lfs diff=lfs merge=lfs -text
89
  venv/Scripts/tiny-agents.exe filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
87
  venv/Scripts/pywin32_testall.exe filter=lfs diff=lfs merge=lfs -text
88
  venv/Scripts/send2trash.exe filter=lfs diff=lfs merge=lfs -text
89
  venv/Scripts/tiny-agents.exe filter=lfs diff=lfs merge=lfs -text
90
+ notebooks/results/checkpoint-3000/optimizer.pt filter=lfs diff=lfs merge=lfs -text
91
+ notebooks/results/checkpoint-3500/rng_state.pth filter=lfs diff=lfs merge=lfs -text
92
+ notebooks/results/checkpoint-3500/scheduler.pt filter=lfs diff=lfs merge=lfs -text
93
+ notebooks/results/checkpoint-3500/training_args.bin filter=lfs diff=lfs merge=lfs -text
94
+ notebooks/results/checkpoint-4000/rng_state.pth filter=lfs diff=lfs merge=lfs -text
notebooks/eda.ipynb ADDED
@@ -0,0 +1,799 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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+HCj6ILRYm+++aarBcgNXV0lqoLPjq50jj/++OjvupJRk9o777yT49dWLUrFihVdTVC87NrWdSWvGiDVwoSrqrUM11xzjasF0RVemK7gws+nq0Y9j67QsqP+FKo969GjR8zVqa4YVfMUpqtqldFj//73v6M3XcFpG37wwQfZvo6aVVT785vf/MZt6+BvVaulGoWvvvrKNffklLaH1om2T0C1OMHVbG7ofaq2onbt2jHvU83Jcrj3GQjXRqpGR+9TTX3al3VFHtDvusLX+88JPZ+oZjFMtSHB/h5PTSnB46KmJdV2+twSNSHdcsstMb9rf1NNUE73F9XAqnZMzZlhiY4Xva+gxkv7ttZD0FwfXq85oe2q4zNcI6vmQ71v1XqE9zWth6uvvjp6n2pjgpGJqo05mlT747OtVOOXqFkrqGmRk046yTp16uSasbUec3K+ye0+6ytoclUt9P9lvv+j7dOsWTO37BKci+P7e6rGSaZPn37Ic+t40T6YymiegzvhqC9KdnTieu6551xVrJp11Byj/kD6oAw3GRyOmoRy0olY7fVhCiP60MvNMHj1W9JJPSed29UXSZ3V9Xfx9IGu8Kg+VuorEghOJoHgA/Vw/Y2CQBX/fiX+g0gnSTXnZLet1IyZHTVp6ASoPmy6Zff38Z2aj0TLr+0SHz4TrTdfep+q3lc/neyW80gUTtRMoM7aCoPhk3+4SUzNSPrwUl83NZOoyURN1mqK9hF+3nBYS9SnQ0074TCn/SO+T5QvBbD49aPnC+9rvvtLsA9qO8Y3CcaHQu33Y8aMcc1LauoL96FS35rc0HGp5umJEye69aZgpuY6hd1waNJy6jiJP+cETceHuzjJC7qIib+Q8ZXo+NY+p3NM0O/R93zzc/dZH1rvah5dsGCBa1bVOVRN0qNHj46W0frWtojfbxRsFewSbQ8dL6ncCVwITWlOnXh1Yo3f8cN0olenRV2Z6upBHWB11aErRF0d+Yy8yGk/JB+HqyU62qNBEsnuNeM/WHNLJ059AKpDaSLZhYzgb0WdalWzlMjh9oFjub20rOpoPGrUqITl1Sn8SFRLosDUr18/d5WvGhe9vvrHhGtL1YdLHwiqRdW+rIsD9Z0aP368u0jIThAQFFLCfc9UMxDUIMbTferzE1CfKNUA+tC2Da8jn/375+wvh5vrR6H7xhtvdB2Ag75WWs+5rYUWbRf139E8aKptUS2HahpVG5csdJ4M1xRmRxeHWi9HS2732ZxQ3zbVGGs7KDTpp7bzlf8bJBKWkxCkvmeqVUxlhKY0pw6Ckt0HaUAHjGqYdNOHmU6egwcPdkFKV8t5ffUQX/Ws4KHakvDVlK6CdRDG0xVOuIpbHR7VQVFXrr7DnfWBopPG2rVrE45A0/rw+fA+kpNPPtn9TFTVHv/aeh/q8KvO3DkNocH60Ps/Uu1GTralll+d6eOvIBOtt5xsL3VE1r52pGXJ7nHNKK8mz3BTiWp6Er1+MHpLN9W66kNJnW0P9wGkD3RRbYsCXkBX/qo5UcdcNYWGA5KaYcP3qaO6Rqn50OvkdBZt3/0l2Ad1fKlzdUBNb/G1pFqvWuY///nPh/0wzOn5QOtcgVMXYxoJpqZknV/il3PFihUunIVrm3Q8ht/H0aKO5j4j9dQpPjxqNLvjW4MadI4JwmtOzje52Wdzsk00SESDZ9TEq/O9touaf6uFQr/Wt7aF3lt4oIgGB2h/iN8eqvHVcZDdoJJUQZ+mNKYTk64WdaLs1q1btuUSXQ1rJFC4GUIHmST6UMoNzecR7melk7Wu1NXWHv5Q0GgOHYiBadOmHTI1gar+1Y6uUUO+tUC6ktd8OrqaCzcJ6oSgZgSd2MNDynNLHxRalzoZh5uN1DdCo5HC9IGrWhlts3jqk3K4da8aB43C0dV8olqQ8NQIOdmWHTp0cLM/h7/2Rs0MzzzzzCFlfbeX3qdOsM8+++whz6ErfQ2dDi9rouXU9ovftk888cQhQ/KDvkkB9c9RjVui5rUw9U9RjYLCUZhqtBRKNYVHeP/VxYk+3MJX6j+3T9OR+O4vCqcKehpdGJboeEm0XvXBGt8fLqfng2Aen7ffftutKy1fuGku2Nc0o3S475PKabtquymsJGufJjVzhZvatc/r3KJzTDBPku/5Jrf7bHbHSna0/nVsqyZLFzGJtoeEm+wkqCHu2LFjzP1q3stuFGUqoaYpTajaW1csOsnoQFRg0gGuqwHN05PdxI6iNnQ1z+kgUHn1hVCfBjVL6GAOPhDVjq0qYnXg1gGqIbLhK9ec0JWUnltXUlpeHZg6MYSnRdBVlT6s1aavDwhVWevDKn4orTqVK4Spw6KG+OqKSR+8ugpX51f1D0jkgQceiM5PpXL6YFHo0MlJw7PzivreaN3qddTsoZCqDwL1Xwh/9YY+FDSEXOVVa6GTrGqOdKWnDy71NQl3yI6nrzHQa6hmROtRtTtatzqhq5k2mGtHIU4n8UceecQFOfUxUVNsor4xeh59uGod66SoEKgPvWBIf5jv9lL/DDUHqKOzajJVU6IPf+2/ul+dZ4Mh/Qov2o46UesqWPub9jtdJWs5FGLUD0XvUeXi+93oMYVJPY/2OYUgLaOGtB+Ojhetfz2njo/46TL0waDtpQ7xWrf6IFV5vfe86NPkw3d/0fQfqkXRMmqqBy2j9gWdM1R7FK6h0HrV+9VxqfeoKRbU/Bc/r09uzgf6UNZ+ryk7tI/G10hoXer40xQD2tdU86ZtpSHsOj+EB46ojC5EfGrotP8qTCggiIKbtlnQzBsM0Pg5fZpUA6na/PCUA6L5lnJ6vsntPpvdsZIdhSKtUzXp63ygi88whX7V5uoCSetP+5vOr1rvamKNr0XVe1O/z5SebkDye/gejq5gOGlw05BPDXu+8MIL3fD9RMN044erzp49O9KpU6dItWrV3N/r59VXXx358ssvY/7uzTffjNStW9cNXw4P3dUQ3DPOOCPh8mU35cArr7wSGTRoUKRSpUqREiVKuCG2wVDXMH29iaYn0BDZc845xw3rjX/OYAi6vs6iZs2akSJFirh1cMUVV8QM742fckCWLVsWadeunRvSXLJkyUirVq0i8+fP95rWIXgviYbux/vb3/4WqVOnjnsfWodvvPFGtl+j8swzz7ih5VovGo6saQQGDhzohicfid5v9+7d3fvXetC6u/jiiyOvv/56TLlnn33WDffWlAnh95Bo3Wq7XHrppW79VKxYMdK3b9/osPb49+67vTSU/JFHHnH7jcqWK1fOvedhw4a5IdGBNWvWuOHYWhfh4fFbt26N3HDDDW55tO20DVU2ftqDBx54IHLWWWdFypYt656jdu3akQcffNC9/pFoG2kI9vr16w95TMP9NZWDhpWfcMIJkd69e//sIfEBLb+Gj/sMM/fdX/RVGvqKC+0XKnfBBRdEVq9eHalQoULklltuiZlyQEPRNUWGymkbaiqHRNswu/NBdvu1pr+oXr26K6vtksimTZui21XnIr2XRFMEdOnSxS2f9oMj0bL4TPWQW3oebX9NlaCpPbQ/a3qIROcFn/ONzz6baF/I7liJn3IgrFu3btHpVLL7upZhw4ZFz6vafjpvx39Njqap0D5z9913R1Jdhv7J7+AGoGBRnw5daaqmKNGM7wWBar901a9as0RNYKlOtQeqDVMNSHz/omSn2jPVfoYnYswvqqnr3bt3wubOdDF16lQ3dYJql4PBEqmKPk0AkAtqslBTlZo9w82oqSjRqLCgr0qqhV7NYaT3o28TQHJ45JFHXPNhqgcmoU8TAOSS+uHEd5BNRepcra9bUT8WdSzWZIqvvPKK6welPmWpRH0B4yeeRf5asGCBFRSEJgBIc5rKQx2P1eFYgSPoHK6mOQD/H32aAAAAPNCnCQAAwAOhCQAAwAN9mvKIppPX5GiaDCzVv5AQAIB0EYlE3Az+mvTzSF9CT2jKIwpMefFdZAAA4NjT19uEv4A7EUJTHgmm8NdKz4vvJAMAAEefRoyq0iP8VTzZITTlkaBJToGJ0AQAQGrx6VpDR3AAAAAPhCYAAAAPhCYAAAAPhCYAAAAPhCYAAAAPhCYAAAAPhCYAAAAPhCYAAAAPhCYAAAAPhCYAAAAPhCYAAAAPhCYAAAAPhCYAAAAPhCYAAAAPhCYAAAAPmT6FgMOpcdf0/F4EHEPfPtwxvxcBxxDHd3rh+D48apoAAAA8EJoAAAA8EJoAAAA8EJoAAAA8EJoAAAA8EJoAAAA8EJoAAAA8EJoAAAA8EJoAAACSPTTNnTvXLrnkEqtWrZplZGTY1KlTo4/t27fP/vCHP1j9+vWtVKlSrkz37t3thx9+iHmOLVu2WLdu3ax06dJWtmxZ69mzp+3YsSOmzIoVK+zcc8+14sWLW/Xq1W3EiBGHLMvkyZOtdu3aroxe85133jmK7xwAAKSafA1NO3futAYNGthTTz11yGO7du2yZcuW2T333ON+vvHGG7Z27Vq79NJLY8opMK1atcpmzZpl06ZNc0Hs5ptvjj6elZVlbdu2tZNPPtmWLl1qjz76qA0dOtSeeeaZaJn58+fb1Vdf7QLXp59+ap07d3a3zz///CivAQAAkCoyIpFIxJKAapqmTJniwkp2Fi9ebGeddZZ99913dtJJJ9nq1autbt267v4mTZq4MjNmzLAOHTrY999/72qnxo0bZ4MHD7aNGzda0aJFXZm77rrL1WqtWbPG/X7VVVe5AKfQFWjWrJk1bNjQxo8f77X8CmdlypSx7du3u1qvdMJ3U6UXvpsqvXB8p5d0PL6zcvD5nVJ9mvSGFK7UDCcLFixw/w8Ck7Rp08YKFSpkCxcujJZp2bJlNDBJu3btXK3V1q1bo2X0d2Eqo/uzs2fPHreiwzcAAFBwpUxo2r17t+vjpGa0IAmq9qhSpUox5TIzM618+fLusaBM5cqVY8oEvx+pTPB4IsOHD3fJNLiprxQAACi4UiI0qVP4b37zG1NLoprbksGgQYNczVdw27BhQ34vEgAAOIoyLUUCk/oxzZkzJ6a9sUqVKrZ58+aY8vv373cj6vRYUGbTpk0xZYLfj1QmeDyRYsWKuRsAAEgPhVIhMH311Vf2/vvvW4UKFWIeb968uW3bts2NigsoWB08eNCaNm0aLaMRdXqugEbanX766VauXLlomdmzZ8c8t8rofgAAgHwPTZpPafny5e4m69atc/9fv369CzlXXHGFLVmyxCZMmGAHDhxwfYx027t3rytfp04da9++vd100022aNEimzdvnvXp08e6du3qRs7JNddc4zqBazoBTU0wadIkGzNmjA0YMCC6HH379nWj7kaOHOlG1GlKAr2ungsAACDfQ5OCyZlnnuluoiCj/w8ZMsT++c9/2ltvveWmDtDQ/6pVq0ZvmlcpoEClSSlbt27tphpo0aJFzBxM6qQ9c+ZMF8gaN25sd9xxh3v+8FxOZ599tk2cONH9neaNev31192UBPXq1TvGawQAACSrpJmnKdUxTxPSRTrO45LOOL7TSzoe31kFdZ4mAACA/EJoAgAA8EBoAgAA8EBoAgAA8EBoAgAA8EBoAgAA8EBoAgAA8EBoAgAA8EBoAgAA8EBoAgAA8EBoAgAA8EBoAgAA8EBoAgAA8EBoAgAA8EBoAgAA8EBoAgAA8EBoAgAA8EBoAgAA8EBoAgAA8EBoAgAA8EBoAgAA8EBoAgAA8EBoAgAA8EBoAgAA8EBoAgAA8EBoAgAA8EBoAgAA8EBoAgAA8EBoAgAA8EBoAgAA8EBoAgAA8EBoAgAA8EBoAgAA8EBoAgAA8EBoAgAA8EBoAgAA8EBoAgAA8EBoAgAA8EBoAgAA8EBoAgAA8EBoAgAA8EBoAgAA8EBoAgAA8EBoAgAA8EBoAgAASPbQNHfuXLvkkkusWrVqlpGRYVOnTo15PBKJ2JAhQ6xq1apWokQJa9OmjX311VcxZbZs2WLdunWz0qVLW9myZa1nz562Y8eOmDIrVqywc88914oXL27Vq1e3ESNGHLIskydPttq1a7sy9evXt3feeecovWsAAJCK8jU07dy50xo0aGBPPfVUwscVbsaOHWvjx4+3hQsXWqlSpaxdu3a2e/fuaBkFplWrVtmsWbNs2rRpLojdfPPN0cezsrKsbdu2dvLJJ9vSpUvt0UcftaFDh9ozzzwTLTN//ny7+uqrXeD69NNPrXPnzu72+eefH+U1AAAAUkVGRNU5SUA1TVOmTHFhRbRYqoG644477M4773T3bd++3SpXrmwvvviide3a1VavXm1169a1xYsXW5MmTVyZGTNmWIcOHez77793fz9u3DgbPHiwbdy40YoWLerK3HXXXa5Wa82aNe73q666ygU4ha5As2bNrGHDhi6w+VA4K1OmjFtG1Xqlkxp3Tc/vRcAx9O3DHfN7EXAMcXynl3Q8vrNy8PmdtH2a1q1b54KOmuQCelNNmza1BQsWuN/1U01yQWASlS9UqJCrmQrKtGzZMhqYRLVVa9euta1bt0bLhF8nKBO8TiJ79uxxKzp8AwAABVfShiYFJlHNUph+Dx7Tz0qVKsU8npmZaeXLl48pk+g5wq+RXZng8USGDx/uQlxwU18pAABQcCVtaEp2gwYNclV5wW3Dhg35vUgAACAdQ1OVKlXcz02bNsXcr9+Dx/Rz8+bNMY/v37/fjagLl0n0HOHXyK5M8HgixYoVc22f4RsAACi4kjY01axZ04WW2bNnR+9TvyH1VWrevLn7XT+3bdvmRsUF5syZYwcPHnR9n4IyGlG3b9++aBmNtDv99NOtXLly0TLh1wnKBK8DAACQr6FJ8yktX77c3YLO3/r/+vXr3Wi6fv362QMPPGBvvfWWrVy50rp37+5GxAUj7OrUqWPt27e3m266yRYtWmTz5s2zPn36uJF1KifXXHON6wSu6QQ0NcGkSZNszJgxNmDAgOhy9O3b1426GzlypBtRpykJlixZ4p4LAABAMvNzNSiYtGrVKvp7EGR69OjhphUYOHCgmwpA8y6pRqlFixYu3GgCysCECRNcuGndurUbNdelSxc3t1NAnbRnzpxpvXv3tsaNG1vFihXdhJnhuZzOPvtsmzhxot199932xz/+0U499VQ3JUG9evWO2boAAADJLWnmaUp1zNOEdJGO87ikM47v9JKOx3dWQZinCQAAIJkQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAADwQmgAAAFI9NB04cMDuueceq1mzppUoUcJOOeUUu//++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": null,
772
+ "id": "60de9c27-1830-4a3a-af8f-c367ca77f93b",
773
+ "metadata": {},
774
+ "outputs": [],
775
+ "source": []
776
+ }
777
+ ],
778
+ "metadata": {
779
+ "kernelspec": {
780
+ "display_name": "Python 3 (ipykernel)",
781
+ "language": "python",
782
+ "name": "python3"
783
+ },
784
+ "language_info": {
785
+ "codemirror_mode": {
786
+ "name": "ipython",
787
+ "version": 3
788
+ },
789
+ "file_extension": ".py",
790
+ "mimetype": "text/x-python",
791
+ "name": "python",
792
+ "nbconvert_exporter": "python",
793
+ "pygments_lexer": "ipython3",
794
+ "version": "3.12.10"
795
+ }
796
+ },
797
+ "nbformat": 4,
798
+ "nbformat_minor": 5
799
+ }
notebooks/results/checkpoint-1000/config.json ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "architectures": [
3
+ "BertForSequenceClassification"
4
+ ],
5
+ "attention_probs_dropout_prob": 0.1,
6
+ "classifier_dropout": null,
7
+ "gradient_checkpointing": false,
8
+ "hidden_act": "gelu",
9
+ "hidden_dropout_prob": 0.1,
10
+ "hidden_size": 768,
11
+ "initializer_range": 0.02,
12
+ "intermediate_size": 3072,
13
+ "layer_norm_eps": 1e-12,
14
+ "max_position_embeddings": 512,
15
+ "model_type": "bert",
16
+ "num_attention_heads": 12,
17
+ "num_hidden_layers": 12,
18
+ "pad_token_id": 0,
19
+ "position_embedding_type": "absolute",
20
+ "problem_type": "single_label_classification",
21
+ "torch_dtype": "float32",
22
+ "transformers_version": "4.51.3",
23
+ "type_vocab_size": 2,
24
+ "use_cache": true,
25
+ "vocab_size": 30522
26
+ }
notebooks/results/checkpoint-1000/trainer_state.json ADDED
@@ -0,0 +1,104 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "best_global_step": null,
3
+ "best_metric": null,
4
+ "best_model_checkpoint": null,
5
+ "epoch": 0.6397952655150352,
6
+ "eval_steps": 500,
7
+ "global_step": 1000,
8
+ "is_hyper_param_search": false,
9
+ "is_local_process_zero": true,
10
+ "is_world_process_zero": true,
11
+ "log_history": [
12
+ {
13
+ "epoch": 0.06397952655150352,
14
+ "grad_norm": 5.188015460968018,
15
+ "learning_rate": 4.8944337811900195e-05,
16
+ "loss": 0.5162,
17
+ "step": 100
18
+ },
19
+ {
20
+ "epoch": 0.12795905310300704,
21
+ "grad_norm": 8.62886905670166,
22
+ "learning_rate": 4.7878012369375135e-05,
23
+ "loss": 0.4123,
24
+ "step": 200
25
+ },
26
+ {
27
+ "epoch": 0.19193857965451055,
28
+ "grad_norm": 6.661285877227783,
29
+ "learning_rate": 4.681168692685008e-05,
30
+ "loss": 0.4106,
31
+ "step": 300
32
+ },
33
+ {
34
+ "epoch": 0.2559181062060141,
35
+ "grad_norm": 7.992310523986816,
36
+ "learning_rate": 4.5745361484325014e-05,
37
+ "loss": 0.3619,
38
+ "step": 400
39
+ },
40
+ {
41
+ "epoch": 0.3198976327575176,
42
+ "grad_norm": 8.48903751373291,
43
+ "learning_rate": 4.467903604179996e-05,
44
+ "loss": 0.3724,
45
+ "step": 500
46
+ },
47
+ {
48
+ "epoch": 0.3838771593090211,
49
+ "grad_norm": 7.3620219230651855,
50
+ "learning_rate": 4.3612710599274906e-05,
51
+ "loss": 0.3582,
52
+ "step": 600
53
+ },
54
+ {
55
+ "epoch": 0.44785668586052463,
56
+ "grad_norm": 7.127757549285889,
57
+ "learning_rate": 4.254638515674984e-05,
58
+ "loss": 0.351,
59
+ "step": 700
60
+ },
61
+ {
62
+ "epoch": 0.5118362124120281,
63
+ "grad_norm": 8.284778594970703,
64
+ "learning_rate": 4.1480059714224785e-05,
65
+ "loss": 0.3517,
66
+ "step": 800
67
+ },
68
+ {
69
+ "epoch": 0.5758157389635317,
70
+ "grad_norm": 6.389641284942627,
71
+ "learning_rate": 4.0413734271699725e-05,
72
+ "loss": 0.3197,
73
+ "step": 900
74
+ },
75
+ {
76
+ "epoch": 0.6397952655150352,
77
+ "grad_norm": 8.652924537658691,
78
+ "learning_rate": 3.9347408829174664e-05,
79
+ "loss": 0.3457,
80
+ "step": 1000
81
+ }
82
+ ],
83
+ "logging_steps": 100,
84
+ "max_steps": 4689,
85
+ "num_input_tokens_seen": 0,
86
+ "num_train_epochs": 3,
87
+ "save_steps": 500,
88
+ "stateful_callbacks": {
89
+ "TrainerControl": {
90
+ "args": {
91
+ "should_epoch_stop": false,
92
+ "should_evaluate": false,
93
+ "should_log": false,
94
+ "should_save": true,
95
+ "should_training_stop": false
96
+ },
97
+ "attributes": {}
98
+ }
99
+ },
100
+ "total_flos": 1052444221440000.0,
101
+ "train_batch_size": 16,
102
+ "trial_name": null,
103
+ "trial_params": null
104
+ }
notebooks/results/checkpoint-1500/config.json ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "architectures": [
3
+ "BertForSequenceClassification"
4
+ ],
5
+ "attention_probs_dropout_prob": 0.1,
6
+ "classifier_dropout": null,
7
+ "gradient_checkpointing": false,
8
+ "hidden_act": "gelu",
9
+ "hidden_dropout_prob": 0.1,
10
+ "hidden_size": 768,
11
+ "initializer_range": 0.02,
12
+ "intermediate_size": 3072,
13
+ "layer_norm_eps": 1e-12,
14
+ "max_position_embeddings": 512,
15
+ "model_type": "bert",
16
+ "num_attention_heads": 12,
17
+ "num_hidden_layers": 12,
18
+ "pad_token_id": 0,
19
+ "position_embedding_type": "absolute",
20
+ "problem_type": "single_label_classification",
21
+ "torch_dtype": "float32",
22
+ "transformers_version": "4.51.3",
23
+ "type_vocab_size": 2,
24
+ "use_cache": true,
25
+ "vocab_size": 30522
26
+ }
notebooks/results/checkpoint-3000/optimizer.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:75736e2ba2162852c73349ceb752973159b4069393e549036b59e847e55c6fbf
3
+ size 876033163
notebooks/results/checkpoint-3500/rng_state.pth ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:e3bf6300f3caa045eccb95509bf4a036de9c3e71a91b5d5b8c00c2143dfdc843
3
+ size 14455
notebooks/results/checkpoint-3500/scheduler.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:82a66e583f9a7441d21dc4c3cffabb1809ecf79a90ab64095d3a1e97bd8d2fe2
3
+ size 1465
notebooks/results/checkpoint-3500/training_args.bin ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:0b158a7fd39c76db160cbdea68fa9ea7ba8a3a1d5a835ed6d7fc5813cda06fee
3
+ size 5649
notebooks/results/checkpoint-4000/model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:58a6e4c1d04411d94ac46f52ff66fbfc6c7ee95b369c0fa11a664c032239d03e
3
+ size 437958648
notebooks/results/checkpoint-4000/rng_state.pth ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:f21eb8ced92a717a931b46f2bf6498830d90d8d0de428ff7c16d719b3d71247e
3
+ size 14455
notebooks/sentiment-bert-model/config.json ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "architectures": [
3
+ "BertForSequenceClassification"
4
+ ],
5
+ "attention_probs_dropout_prob": 0.1,
6
+ "classifier_dropout": null,
7
+ "gradient_checkpointing": false,
8
+ "hidden_act": "gelu",
9
+ "hidden_dropout_prob": 0.1,
10
+ "hidden_size": 768,
11
+ "initializer_range": 0.02,
12
+ "intermediate_size": 3072,
13
+ "layer_norm_eps": 1e-12,
14
+ "max_position_embeddings": 512,
15
+ "model_type": "bert",
16
+ "num_attention_heads": 12,
17
+ "num_hidden_layers": 12,
18
+ "pad_token_id": 0,
19
+ "position_embedding_type": "absolute",
20
+ "problem_type": "single_label_classification",
21
+ "torch_dtype": "float32",
22
+ "transformers_version": "4.51.3",
23
+ "type_vocab_size": 2,
24
+ "use_cache": true,
25
+ "vocab_size": 30522
26
+ }
notebooks/sentiment-bert-model/special_tokens_map.json ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ {
2
+ "cls_token": "[CLS]",
3
+ "mask_token": "[MASK]",
4
+ "pad_token": "[PAD]",
5
+ "sep_token": "[SEP]",
6
+ "unk_token": "[UNK]"
7
+ }
notebooks/sentiment-bert-model/tokenizer.json ADDED
The diff for this file is too large to render. See raw diff
 
notebooks/sentiment-bert-model/tokenizer_config.json ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "added_tokens_decoder": {
3
+ "0": {
4
+ "content": "[PAD]",
5
+ "lstrip": false,
6
+ "normalized": false,
7
+ "rstrip": false,
8
+ "single_word": false,
9
+ "special": true
10
+ },
11
+ "100": {
12
+ "content": "[UNK]",
13
+ "lstrip": false,
14
+ "normalized": false,
15
+ "rstrip": false,
16
+ "single_word": false,
17
+ "special": true
18
+ },
19
+ "101": {
20
+ "content": "[CLS]",
21
+ "lstrip": false,
22
+ "normalized": false,
23
+ "rstrip": false,
24
+ "single_word": false,
25
+ "special": true
26
+ },
27
+ "102": {
28
+ "content": "[SEP]",
29
+ "lstrip": false,
30
+ "normalized": false,
31
+ "rstrip": false,
32
+ "single_word": false,
33
+ "special": true
34
+ },
35
+ "103": {
36
+ "content": "[MASK]",
37
+ "lstrip": false,
38
+ "normalized": false,
39
+ "rstrip": false,
40
+ "single_word": false,
41
+ "special": true
42
+ }
43
+ },
44
+ "clean_up_tokenization_spaces": false,
45
+ "cls_token": "[CLS]",
46
+ "do_lower_case": true,
47
+ "extra_special_tokens": {},
48
+ "mask_token": "[MASK]",
49
+ "model_max_length": 512,
50
+ "pad_token": "[PAD]",
51
+ "sep_token": "[SEP]",
52
+ "strip_accents": null,
53
+ "tokenize_chinese_chars": true,
54
+ "tokenizer_class": "BertTokenizer",
55
+ "unk_token": "[UNK]"
56
+ }
notebooks/sentiment-bert-model/vocab.txt ADDED
The diff for this file is too large to render. See raw diff
 
requirements.txt ADDED
Binary file (5.26 kB). View file
 
sentiment-analysis-bert-model/.gitattributes ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ *.model filter=lfs diff=lfs merge=lfs -text
13
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ *.npy filter=lfs diff=lfs merge=lfs -text
15
+ *.npz filter=lfs diff=lfs merge=lfs -text
16
+ *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ *.ot filter=lfs diff=lfs merge=lfs -text
18
+ *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ *.pt filter=lfs diff=lfs merge=lfs -text
23
+ *.pth filter=lfs diff=lfs merge=lfs -text
24
+ *.rar filter=lfs diff=lfs merge=lfs -text
25
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ *.tar filter=lfs diff=lfs merge=lfs -text
29
+ *.tflite filter=lfs diff=lfs merge=lfs -text
30
+ *.tgz filter=lfs diff=lfs merge=lfs -text
31
+ *.wasm filter=lfs diff=lfs merge=lfs -text
32
+ *.xz filter=lfs diff=lfs merge=lfs -text
33
+ *.zip filter=lfs diff=lfs merge=lfs -text
34
+ *.zst filter=lfs diff=lfs merge=lfs -text
35
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
sentiment-bert-model/config.json ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "architectures": [
3
+ "BertForSequenceClassification"
4
+ ],
5
+ "attention_probs_dropout_prob": 0.1,
6
+ "classifier_dropout": null,
7
+ "gradient_checkpointing": false,
8
+ "hidden_act": "gelu",
9
+ "hidden_dropout_prob": 0.1,
10
+ "hidden_size": 768,
11
+ "initializer_range": 0.02,
12
+ "intermediate_size": 3072,
13
+ "layer_norm_eps": 1e-12,
14
+ "max_position_embeddings": 512,
15
+ "model_type": "bert",
16
+ "num_attention_heads": 12,
17
+ "num_hidden_layers": 12,
18
+ "pad_token_id": 0,
19
+ "position_embedding_type": "absolute",
20
+ "problem_type": "single_label_classification",
21
+ "torch_dtype": "float32",
22
+ "transformers_version": "4.51.3",
23
+ "type_vocab_size": 2,
24
+ "use_cache": true,
25
+ "vocab_size": 30522
26
+ }
sentiment-bert-model/trainer_state.json ADDED
@@ -0,0 +1,174 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "best_global_step": null,
3
+ "best_metric": null,
4
+ "best_model_checkpoint": null,
5
+ "epoch": 1.2795905310300704,
6
+ "eval_steps": 500,
7
+ "global_step": 2000,
8
+ "is_hyper_param_search": false,
9
+ "is_local_process_zero": true,
10
+ "is_world_process_zero": true,
11
+ "log_history": [
12
+ {
13
+ "epoch": 0.06397952655150352,
14
+ "grad_norm": 5.188015460968018,
15
+ "learning_rate": 4.8944337811900195e-05,
16
+ "loss": 0.5162,
17
+ "step": 100
18
+ },
19
+ {
20
+ "epoch": 0.12795905310300704,
21
+ "grad_norm": 8.62886905670166,
22
+ "learning_rate": 4.7878012369375135e-05,
23
+ "loss": 0.4123,
24
+ "step": 200
25
+ },
26
+ {
27
+ "epoch": 0.19193857965451055,
28
+ "grad_norm": 6.661285877227783,
29
+ "learning_rate": 4.681168692685008e-05,
30
+ "loss": 0.4106,
31
+ "step": 300
32
+ },
33
+ {
34
+ "epoch": 0.2559181062060141,
35
+ "grad_norm": 7.992310523986816,
36
+ "learning_rate": 4.5745361484325014e-05,
37
+ "loss": 0.3619,
38
+ "step": 400
39
+ },
40
+ {
41
+ "epoch": 0.3198976327575176,
42
+ "grad_norm": 8.48903751373291,
43
+ "learning_rate": 4.467903604179996e-05,
44
+ "loss": 0.3724,
45
+ "step": 500
46
+ },
47
+ {
48
+ "epoch": 0.3838771593090211,
49
+ "grad_norm": 7.3620219230651855,
50
+ "learning_rate": 4.3612710599274906e-05,
51
+ "loss": 0.3582,
52
+ "step": 600
53
+ },
54
+ {
55
+ "epoch": 0.44785668586052463,
56
+ "grad_norm": 7.127757549285889,
57
+ "learning_rate": 4.254638515674984e-05,
58
+ "loss": 0.351,
59
+ "step": 700
60
+ },
61
+ {
62
+ "epoch": 0.5118362124120281,
63
+ "grad_norm": 8.284778594970703,
64
+ "learning_rate": 4.1480059714224785e-05,
65
+ "loss": 0.3517,
66
+ "step": 800
67
+ },
68
+ {
69
+ "epoch": 0.5758157389635317,
70
+ "grad_norm": 6.389641284942627,
71
+ "learning_rate": 4.0413734271699725e-05,
72
+ "loss": 0.3197,
73
+ "step": 900
74
+ },
75
+ {
76
+ "epoch": 0.6397952655150352,
77
+ "grad_norm": 8.652924537658691,
78
+ "learning_rate": 3.9347408829174664e-05,
79
+ "loss": 0.3457,
80
+ "step": 1000
81
+ },
82
+ {
83
+ "epoch": 0.7037747920665387,
84
+ "grad_norm": 9.87730598449707,
85
+ "learning_rate": 3.828108338664961e-05,
86
+ "loss": 0.3152,
87
+ "step": 1100
88
+ },
89
+ {
90
+ "epoch": 0.7677543186180422,
91
+ "grad_norm": 9.235931396484375,
92
+ "learning_rate": 3.721475794412455e-05,
93
+ "loss": 0.3312,
94
+ "step": 1200
95
+ },
96
+ {
97
+ "epoch": 0.8317338451695457,
98
+ "grad_norm": 8.75272274017334,
99
+ "learning_rate": 3.614843250159949e-05,
100
+ "loss": 0.3098,
101
+ "step": 1300
102
+ },
103
+ {
104
+ "epoch": 0.8957133717210493,
105
+ "grad_norm": 3.6930184364318848,
106
+ "learning_rate": 3.508210705907443e-05,
107
+ "loss": 0.3057,
108
+ "step": 1400
109
+ },
110
+ {
111
+ "epoch": 0.9596928982725528,
112
+ "grad_norm": 15.71256160736084,
113
+ "learning_rate": 3.4015781616549375e-05,
114
+ "loss": 0.2994,
115
+ "step": 1500
116
+ },
117
+ {
118
+ "epoch": 1.0236724248240563,
119
+ "grad_norm": 10.11008071899414,
120
+ "learning_rate": 3.2949456174024315e-05,
121
+ "loss": 0.2945,
122
+ "step": 1600
123
+ },
124
+ {
125
+ "epoch": 1.0876519513755598,
126
+ "grad_norm": 1.052371859550476,
127
+ "learning_rate": 3.1883130731499254e-05,
128
+ "loss": 0.2072,
129
+ "step": 1700
130
+ },
131
+ {
132
+ "epoch": 1.1516314779270633,
133
+ "grad_norm": 0.17214666306972504,
134
+ "learning_rate": 3.08168052889742e-05,
135
+ "loss": 0.1915,
136
+ "step": 1800
137
+ },
138
+ {
139
+ "epoch": 1.2156110044785668,
140
+ "grad_norm": 3.5573925971984863,
141
+ "learning_rate": 2.9750479846449137e-05,
142
+ "loss": 0.2268,
143
+ "step": 1900
144
+ },
145
+ {
146
+ "epoch": 1.2795905310300704,
147
+ "grad_norm": 12.984672546386719,
148
+ "learning_rate": 2.868415440392408e-05,
149
+ "loss": 0.1639,
150
+ "step": 2000
151
+ }
152
+ ],
153
+ "logging_steps": 100,
154
+ "max_steps": 4689,
155
+ "num_input_tokens_seen": 0,
156
+ "num_train_epochs": 3,
157
+ "save_steps": 500,
158
+ "stateful_callbacks": {
159
+ "TrainerControl": {
160
+ "args": {
161
+ "should_epoch_stop": false,
162
+ "should_evaluate": false,
163
+ "should_log": false,
164
+ "should_save": true,
165
+ "should_training_stop": false
166
+ },
167
+ "attributes": {}
168
+ }
169
+ },
170
+ "total_flos": 2104362220769280.0,
171
+ "train_batch_size": 16,
172
+ "trial_name": null,
173
+ "trial_params": null
174
+ }
venv/pyvenv.cfg ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ home = C:\Users\Light\AppData\Local\Programs\Python\Python312
2
+ include-system-site-packages = false
3
+ version = 3.12.10
4
+ executable = C:\Users\Light\Documents\sentiment-analysis-bert\venv\Scripts\python.exe
5
+ command = C:\Users\Light\Documents\sentiment-analysis-bert\venv\Scripts\python.exe -m venv C:\Users\Light\Documents\sentiment-analysis-bert\venv