Spaces:
Sleeping
Add RottenTomatos, arrumando tokenizador, arrumando paths (#2)
Browse files- New test dataset RottenTomatos (38e8124e601981c9365e270f4280be3a1c3c8ad4)
- Fix df path (e8eb8f6f97767645897831d4af668d4d110896f9)
- Fix df path (80007d324957c1861539cf7e02e19a09d587249a)
- Fix dataset, removing NaN (0242ff9ad7ce675cc230718cb5094560340c93c5)
- Add 200 token limit to pipeline (46d3e20480dc07e8b5f7560a567f0d14ed58baa4)
- Metricas de avaliacao do bert (f9d1d3a7273e5ec1316359f57e7bec256bc87807)
- Update file sample of 3000 (8589dd2e12c4325a0b60c6915a49eeaed0eff88c)
- Changed APP dataset from IMDB to ROTTEN TOMATOS (2fc85f6b2905ce73c89f09387ea3bd06fd90078f)
- Remove large files and add to .gitignore (20e262b9fe79e080909f81114b3faf2ab5d672d0)
- Track data/rotten_tomatos.csv with Git LFS (a35354d8c54380430e3b9ee13609f8744953784f)
Co-authored-by: Andre Guarnier De Mitri <AndreMitri@users.noreply.huggingface.co>
- .gitattributes +1 -0
- app.py +5 -2
- data/rotten_tomatos.csv +3 -0
- notebooks_explicativos/Estatistico.ipynb +1 -1
- notebooks_explicativos/Neural_Bert.ipynb +257 -11
- notebooks_explicativos/Simbolico.ipynb +1 -1
@@ -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
|
@@ -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('
|
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
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:8aab34e6b1357deec1bfca34bcb3b5ad44f56b5064f9222e4e2e60a6e97bd1a5
|
3 |
+
size 446463
|
@@ -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 |
},
|
@@ -75,7 +75,7 @@
|
|
75 |
},
|
76 |
{
|
77 |
"cell_type": "code",
|
78 |
-
"execution_count":
|
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":
|
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":
|
542 |
"metadata": {
|
543 |
"colab": {
|
544 |
"base_uri": "https://localhost:8080/"
|
@@ -551,8 +551,8 @@
|
|
551 |
"name": "stderr",
|
552 |
"output_type": "stream",
|
553 |
"text": [
|
554 |
-
"
|
555 |
-
"
|
556 |
]
|
557 |
}
|
558 |
],
|
@@ -574,7 +574,7 @@
|
|
574 |
},
|
575 |
{
|
576 |
"cell_type": "code",
|
577 |
-
"execution_count":
|
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":
|
1179 |
"metadata": {
|
1180 |
"id": "lOHVSyfJJ8zK"
|
1181 |
},
|
@@ -1188,7 +1187,7 @@
|
|
1188 |
},
|
1189 |
{
|
1190 |
"cell_type": "code",
|
1191 |
-
"execution_count":
|
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.
|
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>&#91;Has&#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 [Has] 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,
|
@@ -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 |
},
|