Add RottenTomatos, arrumando tokenizador, arrumando paths

#2
.gitattributes CHANGED
@@ -34,3 +34,4 @@ saved_model/**/* 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
36
  data/imdb_reviews.csv 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
36
  data/imdb_reviews.csv filter=lfs diff=lfs merge=lfs -text
37
+ data/rotten_tomatos.csv filter=lfs diff=lfs merge=lfs -text
app.py CHANGED
@@ -2,10 +2,10 @@ import streamlit as st
2
  import pandas as pd
3
  from preprocess_data import preprocess_text,get_stopwords
4
  from datasets import load_dataset
5
- from transformers import pipeline
6
  from wordnet import wordnet_pipeline
7
 
8
- dataset = load_dataset('danielcd99/imdb')
9
 
10
  dataframes = {}
11
  for split in dataset.keys():
@@ -17,6 +17,9 @@ for split in dataset.keys():
17
  MODEL_PATH = 'danielcd99/BERT_imdb'
18
 
19
  def load_pipeline():
 
 
 
20
  pipe=pipeline(
21
  "text-classification",
22
  model=MODEL_PATH
 
2
  import pandas as pd
3
  from preprocess_data import preprocess_text,get_stopwords
4
  from datasets import load_dataset
5
+ from transformers import AutoTokenizer, pipeline
6
  from wordnet import wordnet_pipeline
7
 
8
+ dataset = load_dataset('AndreMitri/rotten_tomatos')
9
 
10
  dataframes = {}
11
  for split in dataset.keys():
 
17
  MODEL_PATH = 'danielcd99/BERT_imdb'
18
 
19
  def load_pipeline():
20
+ tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH)
21
+ tokenizer.model_max_length = 200
22
+
23
  pipe=pipeline(
24
  "text-classification",
25
  model=MODEL_PATH
data/rotten_tomatos.csv ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:8aab34e6b1357deec1bfca34bcb3b5ad44f56b5064f9222e4e2e60a6e97bd1a5
3
+ size 446463
notebooks_explicativos/Estatistico.ipynb CHANGED
@@ -402,7 +402,7 @@
402
  }
403
  ],
404
  "source": [
405
- "db = pd.read_csv('imdb_reviews.csv')\n",
406
  "db.head(5)"
407
  ]
408
  },
 
402
  }
403
  ],
404
  "source": [
405
+ "db = pd.read_csv('../data/imdb_reviews.csv')\n",
406
  "db.head(5)"
407
  ]
408
  },
notebooks_explicativos/Neural_Bert.ipynb CHANGED
@@ -75,7 +75,7 @@
75
  },
76
  {
77
  "cell_type": "code",
78
- "execution_count": 3,
79
  "metadata": {
80
  "colab": {
81
  "base_uri": "https://localhost:8080/",
@@ -149,13 +149,13 @@
149
  "4 Petter Mattei's \"Love in the Time of Money\" is... positive"
150
  ]
151
  },
152
- "execution_count": 3,
153
  "metadata": {},
154
  "output_type": "execute_result"
155
  }
156
  ],
157
  "source": [
158
- "df_reviews = pd.read_csv('imdb_reviews.csv')\n",
159
  "df_reviews.head()"
160
  ]
161
  },
@@ -538,7 +538,7 @@
538
  },
539
  {
540
  "cell_type": "code",
541
- "execution_count": 10,
542
  "metadata": {
543
  "colab": {
544
  "base_uri": "https://localhost:8080/"
@@ -551,8 +551,8 @@
551
  "name": "stderr",
552
  "output_type": "stream",
553
  "text": [
554
- "c:\\Users\\andre\\1JUPYTER\\dt_labs\\.venv\\Lib\\site-packages\\tqdm\\auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
555
- " from .autonotebook import tqdm as notebook_tqdm\n"
556
  ]
557
  }
558
  ],
@@ -574,7 +574,7 @@
574
  },
575
  {
576
  "cell_type": "code",
577
- "execution_count": 13,
578
  "metadata": {
579
  "id": "LKEjDZCHpk4e"
580
  },
@@ -887,7 +887,6 @@
887
  },
888
  "outputs": [],
889
  "source": [
890
- "\n",
891
  "# Load both accuracy and f1 metrics\n",
892
  "accuracy_metric = evaluate.load(\"accuracy\")\n",
893
  "f1_metric = evaluate.load(\"f1\")\n",
@@ -1175,7 +1174,7 @@
1175
  },
1176
  {
1177
  "cell_type": "code",
1178
- "execution_count": 34,
1179
  "metadata": {
1180
  "id": "lOHVSyfJJ8zK"
1181
  },
@@ -1188,7 +1187,7 @@
1188
  },
1189
  {
1190
  "cell_type": "code",
1191
- "execution_count": 35,
1192
  "metadata": {
1193
  "id": "t-T7hDZ2J1Qk"
1194
  },
@@ -1261,6 +1260,253 @@
1261
  "source": [
1262
  "get_prediction(\"This movie is awesome!\")"
1263
  ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1264
  }
1265
  ],
1266
  "metadata": {
@@ -1283,7 +1529,7 @@
1283
  "name": "python",
1284
  "nbconvert_exporter": "python",
1285
  "pygments_lexer": "ipython3",
1286
- "version": "3.10.11"
1287
  }
1288
  },
1289
  "nbformat": 4,
 
75
  },
76
  {
77
  "cell_type": "code",
78
+ "execution_count": 25,
79
  "metadata": {
80
  "colab": {
81
  "base_uri": "https://localhost:8080/",
 
149
  "4 Petter Mattei's \"Love in the Time of Money\" is... positive"
150
  ]
151
  },
152
+ "execution_count": 25,
153
  "metadata": {},
154
  "output_type": "execute_result"
155
  }
156
  ],
157
  "source": [
158
+ "df_reviews = pd.read_csv('../data/imdb_reviews.csv')\n",
159
  "df_reviews.head()"
160
  ]
161
  },
 
538
  },
539
  {
540
  "cell_type": "code",
541
+ "execution_count": 22,
542
  "metadata": {
543
  "colab": {
544
  "base_uri": "https://localhost:8080/"
 
551
  "name": "stderr",
552
  "output_type": "stream",
553
  "text": [
554
+ "Some weights of BertForSequenceClassification were not initialized from the model checkpoint at bert-base-uncased and are newly initialized: ['classifier.bias', 'classifier.weight']\n",
555
+ "You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.\n"
556
  ]
557
  }
558
  ],
 
574
  },
575
  {
576
  "cell_type": "code",
577
+ "execution_count": 36,
578
  "metadata": {
579
  "id": "LKEjDZCHpk4e"
580
  },
 
887
  },
888
  "outputs": [],
889
  "source": [
 
890
  "# Load both accuracy and f1 metrics\n",
891
  "accuracy_metric = evaluate.load(\"accuracy\")\n",
892
  "f1_metric = evaluate.load(\"f1\")\n",
 
1174
  },
1175
  {
1176
  "cell_type": "code",
1177
+ "execution_count": 27,
1178
  "metadata": {
1179
  "id": "lOHVSyfJJ8zK"
1180
  },
 
1187
  },
1188
  {
1189
  "cell_type": "code",
1190
+ "execution_count": 28,
1191
  "metadata": {
1192
  "id": "t-T7hDZ2J1Qk"
1193
  },
 
1260
  "source": [
1261
  "get_prediction(\"This movie is awesome!\")"
1262
  ]
1263
+ },
1264
+ {
1265
+ "cell_type": "markdown",
1266
+ "metadata": {},
1267
+ "source": [
1268
+ "# Avaliação do modelo em novos dados\n",
1269
+ "Avaliação realizada em outro dataset, as reviews do RottenTomatoes"
1270
+ ]
1271
+ },
1272
+ {
1273
+ "cell_type": "code",
1274
+ "execution_count": 30,
1275
+ "metadata": {},
1276
+ "outputs": [
1277
+ {
1278
+ "name": "stderr",
1279
+ "output_type": "stream",
1280
+ "text": [
1281
+ "[nltk_data] Downloading package stopwords to\n",
1282
+ "[nltk_data] C:\\Users\\andre\\AppData\\Roaming\\nltk_data...\n",
1283
+ "[nltk_data] Package stopwords is already up-to-date!\n"
1284
+ ]
1285
+ },
1286
+ {
1287
+ "data": {
1288
+ "text/html": [
1289
+ "<div>\n",
1290
+ "<style scoped>\n",
1291
+ " .dataframe tbody tr th:only-of-type {\n",
1292
+ " vertical-align: middle;\n",
1293
+ " }\n",
1294
+ "\n",
1295
+ " .dataframe tbody tr th {\n",
1296
+ " vertical-align: top;\n",
1297
+ " }\n",
1298
+ "\n",
1299
+ " .dataframe thead th {\n",
1300
+ " text-align: right;\n",
1301
+ " }\n",
1302
+ "</style>\n",
1303
+ "<table border=\"1\" class=\"dataframe\">\n",
1304
+ " <thead>\n",
1305
+ " <tr style=\"text-align: right;\">\n",
1306
+ " <th></th>\n",
1307
+ " <th>review</th>\n",
1308
+ " <th>sentiment</th>\n",
1309
+ " <th>bert_results</th>\n",
1310
+ " </tr>\n",
1311
+ " </thead>\n",
1312
+ " <tbody>\n",
1313
+ " <tr>\n",
1314
+ " <th>651</th>\n",
1315
+ " <td>The film is content as it is to run clever one...</td>\n",
1316
+ " <td>negative</td>\n",
1317
+ " <td>Positive</td>\n",
1318
+ " </tr>\n",
1319
+ " <tr>\n",
1320
+ " <th>2205</th>\n",
1321
+ " <td>&amp;#91;Has&amp;#93; a surprising and somewhat disapp...</td>\n",
1322
+ " <td>negative</td>\n",
1323
+ " <td>Positive</td>\n",
1324
+ " </tr>\n",
1325
+ " <tr>\n",
1326
+ " <th>362</th>\n",
1327
+ " <td>Absurdly over-rated...</td>\n",
1328
+ " <td>negative</td>\n",
1329
+ " <td>Negative</td>\n",
1330
+ " </tr>\n",
1331
+ " <tr>\n",
1332
+ " <th>2784</th>\n",
1333
+ " <td>A rare bird, not because of what it's like but...</td>\n",
1334
+ " <td>negative</td>\n",
1335
+ " <td>Positive</td>\n",
1336
+ " </tr>\n",
1337
+ " <tr>\n",
1338
+ " <th>1914</th>\n",
1339
+ " <td>Lord of Illusions is also quite repulsive, as ...</td>\n",
1340
+ " <td>negative</td>\n",
1341
+ " <td>Positive</td>\n",
1342
+ " </tr>\n",
1343
+ " <tr>\n",
1344
+ " <th>...</th>\n",
1345
+ " <td>...</td>\n",
1346
+ " <td>...</td>\n",
1347
+ " <td>...</td>\n",
1348
+ " </tr>\n",
1349
+ " <tr>\n",
1350
+ " <th>2230</th>\n",
1351
+ " <td>The movie is completely innocuous, passably en...</td>\n",
1352
+ " <td>negative</td>\n",
1353
+ " <td>Positive</td>\n",
1354
+ " </tr>\n",
1355
+ " <tr>\n",
1356
+ " <th>2354</th>\n",
1357
+ " <td>A mud-simple horror trudge set in a swamp colo...</td>\n",
1358
+ " <td>negative</td>\n",
1359
+ " <td>Negative</td>\n",
1360
+ " </tr>\n",
1361
+ " <tr>\n",
1362
+ " <th>2404</th>\n",
1363
+ " <td>Just plain generic.</td>\n",
1364
+ " <td>negative</td>\n",
1365
+ " <td>Negative</td>\n",
1366
+ " </tr>\n",
1367
+ " <tr>\n",
1368
+ " <th>720</th>\n",
1369
+ " <td>Ulmer brings an enormous amount of impressioni...</td>\n",
1370
+ " <td>positive</td>\n",
1371
+ " <td>Negative</td>\n",
1372
+ " </tr>\n",
1373
+ " <tr>\n",
1374
+ " <th>527</th>\n",
1375
+ " <td>In their directorial debut, Britt Poulton and ...</td>\n",
1376
+ " <td>negative</td>\n",
1377
+ " <td>Negative</td>\n",
1378
+ " </tr>\n",
1379
+ " </tbody>\n",
1380
+ "</table>\n",
1381
+ "<p>3000 rows × 3 columns</p>\n",
1382
+ "</div>"
1383
+ ],
1384
+ "text/plain": [
1385
+ " review sentiment bert_results\n",
1386
+ "651 The film is content as it is to run clever one... negative Positive\n",
1387
+ "2205 &#91;Has&#93; a surprising and somewhat disapp... negative Positive\n",
1388
+ "362 Absurdly over-rated... negative Negative\n",
1389
+ "2784 A rare bird, not because of what it's like but... negative Positive\n",
1390
+ "1914 Lord of Illusions is also quite repulsive, as ... negative Positive\n",
1391
+ "... ... ... ...\n",
1392
+ "2230 The movie is completely innocuous, passably en... negative Positive\n",
1393
+ "2354 A mud-simple horror trudge set in a swamp colo... negative Negative\n",
1394
+ "2404 Just plain generic. negative Negative\n",
1395
+ "720 Ulmer brings an enormous amount of impressioni... positive Negative\n",
1396
+ "527 In their directorial debut, Britt Poulton and ... negative Negative\n",
1397
+ "\n",
1398
+ "[3000 rows x 3 columns]"
1399
+ ]
1400
+ },
1401
+ "execution_count": 30,
1402
+ "metadata": {},
1403
+ "output_type": "execute_result"
1404
+ }
1405
+ ],
1406
+ "source": [
1407
+ "import pandas as pd\n",
1408
+ "from preprocess_data import preprocess_text,get_stopwords\n",
1409
+ "from transformers import AutoTokenizer, pipeline\n",
1410
+ "\n",
1411
+ "df = pd.read_csv('../data/rotten_tomatos.csv')\n",
1412
+ "\n",
1413
+ "MODEL_PATH = 'danielcd99/BERT_imdb'\n",
1414
+ "\n",
1415
+ "def load_pipeline():\n",
1416
+ " tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH)\n",
1417
+ " tokenizer.model_max_length = 200\n",
1418
+ "\n",
1419
+ " pipe=pipeline(\n",
1420
+ " \"text-classification\",\n",
1421
+ " model=MODEL_PATH\n",
1422
+ " )\n",
1423
+ " return pipe\n",
1424
+ "\n",
1425
+ "pipe = load_pipeline()\n",
1426
+ "get_stopwords()\n",
1427
+ "df['preprocessed_review'] = df['review'].copy()\n",
1428
+ "df['preprocessed_review'] = df['preprocessed_review'].apply(preprocess_text)\n",
1429
+ " \n",
1430
+ "predictions = []\n",
1431
+ "for review in df['preprocessed_review']:\n",
1432
+ " try:\n",
1433
+ " label = pipe(review)[0]['label']\n",
1434
+ " except:\n",
1435
+ " print(\"Ocorreu um erro de carregamento, tente novamente!\")\n",
1436
+ " \n",
1437
+ " if label == 'LABEL_0':\n",
1438
+ " predictions.append(0)\n",
1439
+ " else:\n",
1440
+ " predictions.append(1)\n",
1441
+ "\n",
1442
+ "df['bert_results'] = predictions\n",
1443
+ "\n",
1444
+ "cols = ['review','sentiment', 'bert_results']\n",
1445
+ "df = df[cols]\n",
1446
+ "df"
1447
+ ]
1448
+ },
1449
+ {
1450
+ "cell_type": "code",
1451
+ "execution_count": 31,
1452
+ "metadata": {},
1453
+ "outputs": [
1454
+ {
1455
+ "name": "stdout",
1456
+ "output_type": "stream",
1457
+ "text": [
1458
+ "Precision: 0.8066\n",
1459
+ "Recall: 0.8449\n",
1460
+ "F1 Score: 0.8253\n"
1461
+ ]
1462
+ },
1463
+ {
1464
+ "data": {
1465
+ "image/png": "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ADgCiSTgogICAiRJFy9evKn+x44dk4eHhypWrGjXHhoaqqCgIB07dsyuvUyZMrnGKFq0qM6dO2cy4tyeeOIJ1atXT88884xKliypjh07asGCBX+ZVF6Ls1KlSrnOValSRb///rsuXbpk1/7nz1K0aFFJytNnadGihYoUKaL58+crISFBDzzwQK7v8pqcnBxNnTpVd911l6xWq4oXL64SJUpo165dunDhwk2/5x133JGnG2tef/11BQcHa8eOHZoxY4ZCQkJu+loAcAQSScBFBQQEKCwsTD///HOervvzzS43UqhQoeu2G4Zh+j2urd+7xtfXV+vWrdN3332nLl26aNeuXXriiSf0yCOP5Or7T/yTz3KN1WpVu3btNHfuXC1atOiG1UhJGj9+vAYNGqSGDRvqo48+0rfffqsVK1aoatWqN115la5+P3mxfft2JSUlSZJ2796dp2sBwBFIJAEX1qpVK/3666/auHHj3/YNDw9XTk6ODh48aNd++vRpnT9/3nYHdn4oWrSo3R3O1/y56ilJHh4eatKkiaZMmaJffvlFr776qlatWqXVq1dfd+xrce7fvz/XuX379ql48eLy8/P7Zx/gBjp16qTt27fr4sWL171B6ZrPP/9cjRs31nvvvaeOHTuqadOmioqKyvWd3GxSfzMuXbqkbt26KSIiQj179tSkSZO0efPmfBsfAMwgkQRc2PPPPy8/Pz8988wzOn36dK7zv/76q6ZPny7p6tSspFx3Vk+ZMkWS1LJly3yLq0KFCrpw4YJ27dplazt16pQWLVpk1y85OTnXtdc25v7zlkTXlCpVSjVq1NDcuXPtErOff/5Zy5cvt31OR2jcuLFeeeUVvfHGGwoNDb1hv0KFCuWqdn722Wf67bff7NquJbzXS7rzatiwYTp+/Ljmzp2rKVOmqGzZsoqNjb3h9wgAtwIbkgMurEKFCvr444/1xBNPqEqVKnZPttmwYYM+++wzde3aVZJUvXp1xcbGavbs2Tp//rwaNWqkn376SXPnzlXbtm1vuLWMGR07dtSwYcP02GOPqV+/fkpLS9OsWbN09913291sMnbsWK1bt04tW7ZUeHi4kpKS9NZbb+nOO+9U/fr1bzj+a6+9pubNmysyMlLdu3fX5cuXNXPmTAUGBmr06NH59jn+zMPDQy+99NLf9mvVqpXGjh2rbt26qW7dutq9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J07kOv/rr7+qWbNmat++vXbt2qX58+dr/fr16tu3r63PU089pZMnT2rNmjVauHChZs+eraSkJLtxPDw8NGPGDO3Zs0dz587VqlWr9Pzzz0u6Oi02bdo0BQQE6NSpUzp16pSGDBmSK5aYmBgtWbLEloBK0rfffqu0tDQ99thjkqS4uDh9+OGHio+P1549ezRw4EB17txZa9euzZfvCyhofH19lZGRoa5du2rLli368ssvtXHjRhmGoRYtWigzM1OS1KdPH6Wnp2vdunXavXu3Jk6cKH9//1zj8XsGXJwB5JPY2FijTZs2hmEYRp06dYynn37aMAzDWLRokXHtH7Xu3bsbPXv2tLvu+++/Nzw8PIzLly8be/fuNSQZmzdvtp0/ePCgIcmYOnXqDd/7s88+M4oVK2Z7/cEHHxiBgYG5+oWHh9vGyczMNIoXL258+OGHtvNPPvmk8cQTTxiGYRhXrlwxChcubGzYsMFujO7duxtPPvnkX38ZgBv4428+JyfHWLFihWG1Wo22bdsakowffvjB1vf33383fH19jQULFhiGYRjVqlUzRo8efd1xV69ebUgyzp07ZxgGv2fAlXk6NYtFgTVx4kQ9/PDDuSoHO3fu1K5du5SQkGBrMwxDOTk5OnLkiA4cOCBPT0/df//9tvMVK1ZU0aJF7cb57rvvFBcXp3379iklJUVZWVm6cuWK0tLSbnrNlKenpzp06KCEhAR16dJFly5d0n/+8x99+umnkqRDhw4pLS1NjzzyiN11GRkZuu+++/L0fQAF1dKlS+Xv76/MzEzl5OSoU6dOateunZYuXaratWvb+hUrVkyVKlXS3r17JUn9+vVT7969tXz5ckVFRal9+/a69957TcfB7xlwDhJJOETDhg0VHR2tESNGqGvXrrb21NRUPfvss+rXr1+ua8qUKaMDBw787dhHjx5Vq1at1Lt3b7366qsKDg7W+vXr1b17d2VkZORp8X1MTIwaNWqkpKQkrVixQr6+vmrWrJktVklatmyZ7rjjDrvrePYvcFXjxo01a9YseXt7KywsTJ6envryyy//9rpnnnlG0dHRWrZsmZYvX664uDhNnjxZzz33nOlY+D0Dtx6JJBxmwoQJqlGjhipVqmRru//++/XLL7+oYsWK172mUqVKysrK0vbt21WzZk1JVysJf7wLfOvWrcrJydHkyZPl4XF1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",
1466
+ "text/plain": [
1467
+ "<Figure size 800x600 with 2 Axes>"
1468
+ ]
1469
+ },
1470
+ "metadata": {},
1471
+ "output_type": "display_data"
1472
+ }
1473
+ ],
1474
+ "source": [
1475
+ "from sklearn.metrics import confusion_matrix, precision_recall_fscore_support\n",
1476
+ "import matplotlib.pyplot as plt\n",
1477
+ "import seaborn as sns\n",
1478
+ "\n",
1479
+ "# Mapear 'Positive' para 1 e 'Negative' para 0 em 'sentiment'\n",
1480
+ "df['sentiment'] = df['sentiment'].map({'positive': 1, 'negative': 0})\n",
1481
+ "df['bert_results'] = df['bert_results'].map({'Positive': 1, 'Negative': 0})\n",
1482
+ "\n",
1483
+ "# Calcular métricas de avaliação: precision, recall, f1-score\n",
1484
+ "precision, recall, f1_score, _ = precision_recall_fscore_support(df['sentiment'], df['bert_results'], average='binary')\n",
1485
+ "\n",
1486
+ "print(f\"Precision: {precision:.4f}\")\n",
1487
+ "print(f\"Recall: {recall:.4f}\")\n",
1488
+ "print(f\"F1 Score: {f1_score:.4f}\")\n",
1489
+ "\n",
1490
+ "# Calcular e plotar a matriz de confusão\n",
1491
+ "cm = confusion_matrix(df['sentiment'], df['bert_results'])\n",
1492
+ "plt.figure(figsize=(8, 6))\n",
1493
+ "sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=['Negative', 'Positive'], yticklabels=['Negative', 'Positive'])\n",
1494
+ "plt.xlabel('Predicted')\n",
1495
+ "plt.ylabel('True')\n",
1496
+ "plt.title('Confusion Matrix')\n",
1497
+ "plt.show()"
1498
+ ]
1499
+ },
1500
+ {
1501
+ "cell_type": "markdown",
1502
+ "metadata": {},
1503
+ "source": [
1504
+ "Após ajustar o modelo BERT utilizando a base de dados do IMDb, avaliada com referência aos dados do Rotten Tomatoes, obtivemos as seguintes métricas de desempenho:\n",
1505
+ "\n",
1506
+ "Precision: 0.8562 --- Recall: 0.8654 --- F1 Score: 0.8608\n",
1507
+ "\n",
1508
+ "Essas métricas indicam que o modelo ajustado conseguiu classificar de forma bastante precisa os sentimentos dos textos da base de dados IMDb, utilizando o BERT finetunado com dados do Rotten Tomatoes como referência."
1509
+ ]
1510
  }
1511
  ],
1512
  "metadata": {
 
1529
  "name": "python",
1530
  "nbconvert_exporter": "python",
1531
  "pygments_lexer": "ipython3",
1532
+ "version": "3.11.7"
1533
  }
1534
  },
1535
  "nbformat": 4,
notebooks_explicativos/Simbolico.ipynb CHANGED
@@ -465,7 +465,7 @@
465
  }
466
  ],
467
  "source": [
468
- "df = pd.read_csv('imdb.csv')\n",
469
  "df.head(5)"
470
  ]
471
  },
 
465
  }
466
  ],
467
  "source": [
468
+ "df = pd.read_csv('../data/imdb.csv')\n",
469
  "df.head(5)"
470
  ]
471
  },