Base de Datos Facebook - Interbank
Datos colectados en el 2016, de la página pública Facebook -
Importar librerías necesarias
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
torch.manual_seed(1)
<torch._C.Generator at 0x7f38742d35f0>
Abrir archivo - Drive
from google.colab import drive
drive.mount('/content/drive')
Mounted at /content/drive
ruta ="/content/drive/MyDrive/Colab Notebooks/DiplomadoDataScienceV3/SentimentAnalysis/"
#ruta = "/content/drive/My Drive/Colab Notebooks/"
opiniones = pd.read_csv(ruta+'interbank_negativos_positivos.csv')
opiniones.head()
Comentario | Polaridad | |
---|---|---|
0 | #Interbank no juegues con nuestros sentimiento... | 0.0 |
1 | #Interbank podrían responder? O también se cay... | 0.0 |
2 | #indecopi!! | 0.0 |
3 | 1 hora en linea via telefonica y nadie contest... | 0.0 |
4 | 3 dias intentando desde el extrangero entrar e... | 0.0 |
opiniones.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 119 entries, 0 to 118 Data columns (total 2 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Comentario 118 non-null object 1 Polaridad 117 non-null float64 dtypes: float64(1), object(1) memory usage: 2.0+ KB
Pre-procesamiento
opiniones = opiniones.dropna()
Cantidad de instancias por clase
opiniones['Polaridad'].value_counts()
0.0 104 1.0 13 Name: Polaridad, dtype: int64
Descarga Stopwords
import string
import nltk
from nltk.corpus import stopwords
nltk.download('stopwords')
[nltk_data] Downloading package stopwords to /root/nltk_data... [nltk_data] Unzipping corpora/stopwords.zip.
True
Limpieza de Texto
def procesamiento_texto(msj):
"""
Dado un texto, realiza lo siguiente:
1. Remueve los signos de puntuación
2. Remueve los stopwords
3. Devuelve una lista de texto limpio
"""
# Verifica si hay signos de puntuación
nopuntuacion = [char for char in msj if char not in string.punctuation]
# Junta los caracteres nuevamente.
nopuntuacion = ''.join(nopuntuacion)
# remueve stopwords
#return [word for word in nopuntuacion.split() if word.lower() not in stopwords.words('spanish')] #stopword en español
return [word for word in nopuntuacion.split()] #stopword en español
Separación Datos
from sklearn.model_selection import train_test_split
msj_entrenamiento, msj_prueba, y_entrenamiento, y_prueba = train_test_split(opiniones['Comentario'], opiniones['Polaridad'], test_size=0.2, random_state=101)
print(len(msj_entrenamiento), len(msj_prueba), len(msj_entrenamiento) + len(msj_prueba))
93 24 117
Construcción del vocabulario y codificación en secuencia de números
# genera una secuencia de números (indices) a partir de un conjunto de palabras
def prepare_sequence(seq, to_ix):
idxs = [to_ix[w] if w in to_ix else 0 for w in seq] # UNKNOWN es 0
return torch.tensor(idxs, dtype=torch.long)
Devuelve tokens a partir de una oración
def procesar_mensajes(lista_mensajes):
procesado = [procesamiento_texto(w) for w in lista_mensajes]
procesado = [w for w in procesado if len(w)>0]
return procesado
msj_procesado = procesar_mensajes(msj_entrenamiento)
msj_procesado[0]
['Buenas', 'tardes', 'hay', 'problemas', 'para', 'hacer', 'compras', 'x', 'internet', 'no', 'reconocen', 'mi', 'tarjeta', 'cuando', 'estara', 'habilitado']
Construcción del vocabulario
# Construcción del diccionario de palabras de todos los datos de entrenamiento
# Cada palabra ahora tiene un índice asociado
word_to_ix = {}
word_to_ix['<UNK>'] = 0
for sent in msj_procesado:
for word in sent:
if word not in word_to_ix:
word_to_ix[word] = len(word_to_ix)
print(word_to_ix)
{'<UNK>': 0, 'Buenas': 1, 'tardes': 2, 'hay': 3, 'problemas': 4, 'para': 5, 'hacer': 6, 'compras': 7, 'x': 8, 'internet': 9, 'no': 10, 'reconocen': 11, 'mi': 12, 'tarjeta': 13, 'cuando': 14, 'estara': 15, 'habilitado': 16, 'fasjfsadnsdasda': 17, 'justo': 18, 'ahora': 19, 'S': 20, 'me': 21, 'acaba': 22, 'de': 23, 'pasar': 24, 'lo': 25, 'mismo': 26, 'noches': 27, 'nose': 28, 'porque': 29, 'puedo': 30, 'entrar': 31, 'a': 32, 'la': 33, 'app': 34, 'podrían': 35, 'apoyar': 36, 'soy': 37, 'cliente': 38, 'nuevo': 39, 'y': 40, 'afilie': 41, 'nada': 42, 'Ayer': 43, 'deposito': 44, '200': 45, 'soles': 46, 'sale': 47, '180': 48, 'que': 49, 'se': 50, 'debe': 51, 'eso': 52, 'Alguien': 53, 'puede': 54, 'decir': 55, 'si': 56, 'todas': 57, 'los': 58, 'bancos': 59, 'interbank': 60, 'sistema': 61, 'As': 62, 'tu': 63, 'denuncia': 64, 'correspondiente': 65, 'Ah': 66, 'hora': 67, 'estarán': 68, 'listo': 69, 'el': 70, 'Parece': 71, 'nueva': 72, 'experiencia': 73, 'es': 74, 'inhabilitar': 75, 'las': 76, 'tarjetas': 77, 'crédito': 78, 'Es': 79, 'muy': 80, 'incómodo': 81, 'llegar': 82, 'Caja': 83, 'te': 84, 'informen': 85, 'ser': 86, 'procesada': 87, 'Ni': 88, 'cajeros': 89, 'automáticos': 90, 'funcionan': 91, 'A': 92, 'partir': 93, '3': 94, 'pm': 95, 'acabo': 96, 'llamar': 97, 'Aun': 98, 'retirar': 99, 'remesas': 100, 'Hasta': 101, '1': 102, 'en': 103, 'linea': 104, 'via': 105, 'telefonica': 106, 'nadie': 107, 'contesta': 108, 'Amigos': 109, 'Interbank': 110, 'No': 111, 'funciona': 112, 'ni': 113, 'web': 114, 'Mis': 115, 'operaciones': 116, 'Un': 117, 'comunicado': 118, 'por': 119, 'favor': 120, 'ya': 121, 'parece': 122, 'un': 123, 'caso': 124, 'aislado': 125, 'falta': 126, 'tiempo': 127, 'ir': 128, 'una': 129, 'agencia': 130, 'consulto': 131, 'sgte': 132, 'Tengo': 133, 'préstamo': 134, 'pago': 135, 'puntual': 136, 'faln': 137, 'cuotas': 138, 'bueno': 139, 'dos': 140, 'pasado': 141, 'cuota': 142, '10': 143, 'consulta': 144, 'solicitar': 145, 'otro': 146, 'descuentan': 147, 'faltan': 148, 'DNI': 149, '09866506': 150, 'Cel': 151, '988895453': 152, 'Realmente': 153, 'yo': 154, 'opino': 155, 'ustedes': 156, 'El': 157, 'vale': 158, 'más': 159, 'dinero': 160, 'Por': 161, 'posible': 162, 'tengan': 163, 'plan': 164, 'contingencia': 165, 'inconveniente': 166, 'similar': 167, 'otra': 168, 'ocasión': 169, 'demasiado': 170, 'están': 171, 'tomando': 172, 'espero': 173, 'tengamos': 174, 'respuesta': 175, 'coherente': 176, 'parte': 177, 'retiro': 178, 'cajero': 179, 'Q': 180, 'mal': 181, 'D': 182, 'Bueno': 183, 'señores': 184, 'creo': 185, 'con': 186, 'estoy': 187, 'haciendo': 188, 'tendrás': 189, 'respeto': 190, 'hacia': 191, 'nosotros': 192, 'les': 193, 'comunique': 194, 'empresas': 195, 'televisora': 196, 'radio': 197, 'difunda': 198, 'esto': 199, 'siendo': 200, 'perjudicado': 201, 'Bloquearon': 202, 'clave': 203, 'ingresar': 204, 'banca': 205, 'móvil': 206, 'indecopi': 207, 'plaza': 208, 'vea': 209, 'tampoco': 210, 'Mi': 211, 'tarjeto': 212, 'pasó': 213, 'jacarandá': 214, 'Algún': 215, 'promotor': 216, 'créditos': 217, 'personales': 218, 'Arreglen': 219, 'su': 220, 'problema': 221, 'sacar': 222, 'agencias': 223, 'esta': 224, 'ciudad': 225, 'aun': 226, 'arreglen': 227, 'pagina': 228, 'Acabo': 229, 'd': 230, 'salir': 231, 'dl': 232, 'banco': 233, 'Ahora': 234, 'qué': 235, 'arreglarán': 236, 'Intebank': 237, 'Ventanillas': 238, 'Oficina': 239, 'Necesito': 240, 'depósito': 241, 'legalizar': 242, 'título': 243, 'Oficinas': 244, 'Relaciones': 245, 'Exteriores': 246, 'sólamente': 247, 'hasta': 248, '300': 249, 'Solucionenlo': 250, 'VamosInterbanck': 251, 'YoQuieroIr': 252, 'ConMyFriendDaniela': 253, 'nuestra': 254, 'cancion': 255, 'favorita': 256, 'QueBailesConmigo': 257, 'Ajajaj': 258, 'sigue': 259, 'saliendo': 260, 'monto': 261, 'hace': 262, 'días': 263, 'pero': 264, 'celebrar': 265, 'seguro': 266, 'cusndo': 267, 'regularice': 268, 'todo': 269, 'nos': 270, 'van': 271, 'descontar': 272, 'porrazo': 273, 'volverá': 274, 'Almenos': 275, 'respondan': 276, 'cuanto': 277, 'mas': 278, 'tendemos': 279, 'esperar': 280, 'desde': 281, 'ayer': 282, 'quiero': 283, 'del': 284, 'solo': 285, 'saben': 286, 'Así': 287, 'cuesta': 288, 'anuncio': 289, 'o': 290, 'publicación': 291, 'viendo': 292, 'comentarios': 293, 'son': 294, 'varios': 295, 'intentaron': 296, 'seguros': 297, 'bloqueó': 298, 'cuenta': 299, 'simplemente': 300, 'poner': 301, 'aviso': 302, 'X': 303, 'este': 304, 'motivo': 305, 'comer': 306, 'broster': 307, '5': 308, 'lukitas': 309, 'Diego': 310, 'Flores': 311, 'traime': 312, 'algooo': 313, 'Al': 314, 'menos': 315, 'hubieran': 316, 'enviado': 317, 'todos': 318, 'sus': 319, 'usuarios': 320, 'Y': 321, 'así': 322, 'evitarían': 323, 'tantos': 324, 'reclamos': 325, 'sobre': 326, 'pobres': 327, 'empleados': 328, 'La': 329, 'gente': 330, 'va': 331, 'encima': 332, 'sabe': 333, 'pagar': 334, 'mensualidad': 335, 'universidad': 336, 'como': 337, 'mandan': 338, 'correo': 339, 'global': 340, 'informar': 341, 'alza': 342, 'tarifias': 343, 'deberían': 344, 'hacerlo': 345, 'también': 346, 'tipo': 347, 'hubiese': 348, 'sido': 349, 'tan': 350, 'grave': 351, 'existiría': 352, 'cominicación': 353, 'Me': 354, 'bien': 355, 'SEÑOREES': 356, 'DE': 357, 'INTERBANK': 358, 'YA': 359, 'COMENZO': 360, 'FALLAR': 361, 'SU': 362, 'APP': 363, 'ME': 364, 'SALE': 365, 'CLAVE': 366, 'ERRADA': 367, 'HASTA': 368, 'EL': 369, 'DOMINGO': 370, 'NOV': 371, 'ESTABA': 372, 'MUY': 373, 'BIEN': 374, 'ARREGLENLOOOO': 375, 'feliz': 376, 'gracias': 377, 'Activen': 378, 'teléfonos': 379, 'empresa': 380, 'estima': 381, 'reestablecer': 382, 'Okass': 383, 'Muchas': 384, 'Llego': 385, 'paginadeberian': 386, 'causar': 387, 'tanto': 388, 'malestar': 389, 'clientes': 390, 'solucionan': 391, 'Sres': 392, 'Malazo': 393, 'atension': 394, 'vetanilla': 395, 'disculpa': 396, 'delcaso': 397, 'utilizar': 398, 'credito': 399, 'verguenza': 400, 'Deberian': 401, 'conpensarnos': 402, 'molestias': 403, 'han': 404, 'causado': 405, 'cobrar': 406, 'giros': 407, 'hahahaha': 408, 'q': 409, 'buena': 410, 'v': 411, 'mames': 412, 'Si': 413, 'fui': 414, 'fin': 415, 'usar': 416, 'tarjetasen': 417, 'verdad': 418, 'estamos': 419, 'cada': 420, 'vez': 421, 'dependientes': 422, 'tecnologia': 423, 'Alguna': 424, 'solucion': 425, 'Tambien': 426, 'bloqueo': 427, 'Solucion': 428, 'porfavor': 429, 'Avisen': 430, 'llegue': 431, 'al': 432, 'esperando': 433, '4': 434, 'horas': 435, 'pude': 436, 'hoy': 437, 'aéreo': 438, 'puerto': 439, 'Buen': 440, 'día': 441, 'semana': 442, 'pasada': 443, 'deposité': 444, 'través': 445, 'Intenté': 446, 'electrónica': 447, 'salía': 448, 'podía': 449, 'realizar': 450, 'supuse': 451, 'haría': 452, 'cobro': 453, 'automático': 454, 'sucede': 455, 'BCP': 456, 'llegó': 457, 'sms': 458, 'diciendo': 459, 'tenía': 460, 'revisé': 461, 'dejaba': 462, 'Como': 463, 'vi': 464, 'había': 465, 'cobrado': 466, 'total': 467, 'deuda': 468, 'personalmente': 469, 'tienda': 470, 'dijeron': 471, 'Seguía': 472, 'apareciendo': 473, 'Llamé': 474, 'Banca': 475, 'teléfono': 476, 'cifra': 477, 'variable': 478, 'what': 479, '¿y': 480, 'cobros': 481, 'recibos': 482, 'servicios': 483, 'mes': 484, 'traen': 485, 'acercara': 486, 'hecho': 487, 'volví': 488, 'Hablé': 489, 'personal': 490, 'plataforma': 491, 'según': 492, 'pagué': 493, 'debería': 494, 'haber': 495, 'ido': 496, 'tenían': 497, '¿quieren': 498, 'vuelva': 499, 'pierda': 500, 'nuevamente': 501, 'Muy': 502, 'mala': 503, 'atención': 504, 'capacitación': 505, 'MAL': 506, 'juegues': 507, 'nuestros': 508, 'sentimientos': 509, 'sin': 510, 'culpa': 511, 'sistemas': 512, 'asociar': 513, 'debito': 514, 'paypal': 515, 'cargo': 516, '15': 517, 'dolares': 518, 'necesito': 519, 'codigo': 520, 'digitos': 521, 'operacion': 522, 'figura': 523, 'movimiento': 524, 'saldo': 525, 'reducido': 526, 'quisiera': 527, 'saber': 528, 'accedo': 529, 'detalle': 530, 'completo': 531, 'piden': 532, 'cambia': 533, 'rato': 534, 'cierren': 535, 'funcionar': 536, '12': 537, 'funcione': 538, 'Breve': 539, 'piensa': 540, 'está': 541, 'pasando': 542, 'quien': 543, 'devolver': 544, 'enificas': 545, 'servicio': 546, 'Antes': 547, 'lanzar': 548, 'nuevos': 549, 'tecnologicos': 550, 'aseguren': 551, 'estan': 552, 'vigentes': 553, 'durante': 554, '24': 555, 'puedan': 556, 'compensarán': 557, 'alguna': 558, 'forma': 559, 'Mínimo': 560, 'Cuando': 561, 'podremos': 562, 'vamos': 563, 'Asi': 564, 'pagan': 565, 'fidelidad': 566, 'paso': 567, 'grifo': 568, 'nunca': 569, 'Se': 570, 'fue': 571, '2': 572, 'mayo': 573, 'San': 574, 'Isidro': 575, 'cerrado': 576, 'operativa': 577, 'Quien': 578, 'moras': 579, 'intereses': 580, 'generan': 581, 'Sophia': 582, 'Palacios': 583, 'xke': 584, 'eres': 585, 'mentirosa': 586, 'stado': 587, 'Aunque': 588, 'sea': 589, 'díganos': 590, 'aproximada': 591, 'NO': 592, 'ES': 593, 'CORRECTO': 594, 'le': 595, 'hagan': 596, 'Todo': 597, 'ha': 598, 'caido': 599, 'nivel': 600, 'nacional': 601, 'momento': 602, '714': 603, 'villa': 604, 'salvador': 605, 'dias': 606, 'intentando': 607, 'extrangero': 608, 'contancto': 609, 'den': 610, 'algo': 611, 'mismos': 612, 'generaron': 613, 'Amiga': 614, 'hicieron': 615, 'cosa': 616, 'fea': 617, 'mama': 618, 'quieren': 619, 'dsr': 620, 'cara': 621, 'decepcionada': 622, 'Sigo': 623, 'Paypal': 624, 'solicité': 625, 'noviembre': 626, '249': 627, 'tengo': 628, 'constancia': 629, 'pasaron': 630, 'hábiles': 631, 'normalmente': 632, 'demora': 633, 'estos': 634, 'hubieron': 635, 'perjudiquen': 636, 'Espero': 637, 'pronto': 638, 'digan': 639, 'demoran': 640, '430': 641, 'quise': 642, 'TT': 643, 'agentes': 644, 'tienen': 645, 'Justo': 646, 'uno': 647, 'encanta': 648, 'comentario': 649, 'Banco': 650, 'mrda': 651, 'sirve': 652, 'ojala': 653, 'ISIS': 654, 'meta': 655, 'avion': 656, 'edificio': 657, 'pidieron': 658, 'mis': 659, 'datos': 660, 'pasé': 661, 'sola': 662, 'aún': 663, 'recibo': 664, 'Eltiempovalemásqueeldinero': 665, 'acceder': 666, 'trabajando': 667, 'solucionar': 668, 'remesa': 669, 'supone': 670, 'aremos': 671, 'unirnos': 672, 'presentar': 673, 'video': 674, 'ante': 675, 'television': 676, 'casi': 677, 'tres': 678, 'Según': 679, 'prestigio': 680, 'tenemos': 681, 'mucho': 682}
msj_procesado[1]
['fasjfsadnsdasda', 'justo', 'ahora']
input = prepare_sequence(msj_procesado[1], word_to_ix)
print(input)
tensor([17, 18, 19])
Construcción del Vocabulario
# Embedding_dim: controla la codificación interna de las palabras (ya no one-hot encoddings sino embeddings)
# HIDDEN_DIM = dimensión de las unidades o estados ocultos (Hidden) de la RNN
EMBEDDING_DIM = 10
HIDDEN_DIM = 10
class LSTMSentiment(nn.Module):
def __init__(self, embedding_dim, hidden_dim, vocab_size, output_dim): # dimensión embedding, tamaño vocabulario, dimensión salida (rpta)
super(LSTMSentiment, self).__init__()
self.hidden_dim = hidden_dim # ejemplo 6 neuronas en estado oculto
self.word_embeddings = nn.Embedding(vocab_size, embedding_dim) ## (14,6) en el ejemplo
# un estado hidden LSTM toma word embeddings como entrada y retorna estados ocultos de dimensión: hidden_dim
# en el ejemplo el h_t resultante sería de dimensión (6)
self.lstm = nn.LSTM(embedding_dim, hidden_dim) # recibe (6,6) h_t = Tanh(W1*x_t + W2*h_t-1 + b_h) -> x_t (batch x 6), W1 (6x6), W2 (6x6) then h_t (batch, 6)
# Esta capa lineal conecta el estado oculto al resultado final
self.fc = nn.Linear(hidden_dim, output_dim) # (6, 2) y_t = RELU(h_t*W_3 +b_y) -> h_t (batch, 6), W_3 (6,2)-> y_t (batch, 2)
def forward(self, sentence): # entrada las oraciones codificadas en números
embeds = self.word_embeddings(sentence) # la oración es transformada en una matriz de embedding ejemplo (4, 6), 4 = 4 palabras o estados
output, hidden = self.lstm(embeds.view(len(sentence), 1, -1)) # 4 (tamaño oración), 1(batch), 6 dimensión embedding
# recibe un tensor, devuelve una RNN
last_h, last_c = hidden # se recupera el último estado oculto de dimensión (h_4 en el ejemplo ) (1, batch, hidden_dim) -> (1, 1, 6)
tag_space = self.fc(last_h.squeeze(0)) #Elimina a dimensión 1, de la posición 0-> resultado [batch_size, hidden dimension] -> (1, 6)
# En el ejemplo h_t(1, 6) * W (6, 2)-> y_t (1,2)
tag_scores = F.log_softmax(tag_space, dim=1) # aplicación de softmax para valores bajos-> scores
return tag_scores
Instanciación del Modelo
len(word_to_ix)
683
# Instanciación del modelo RNN
model = LSTMSentiment(EMBEDDING_DIM, HIDDEN_DIM, len(word_to_ix), 2) #10, 10, 683, 2 (# clases)
loss_function = nn.NLLLoss() # función costo
optimizer = optim.SGD(model.parameters(), lr=0.1) # otpimizador seleccionado
Antes de entrenar
# el resultado es el score de la tag i para la oración.
# No necesita entrenar, por torch.no_grad()
with torch.no_grad():
inputs = prepare_sequence(msj_procesado[0], word_to_ix)# primera oración del conjunto entrenamiento
tag_scores = model(inputs)
print(tag_scores)
print(torch.argmax(tag_scores)) # [0 negativo, 1 positivo]
tensor([[-0.7745, -0.6179]]) tensor(1)
Entrenamiento
y_entrenamiento_tensor = torch.tensor(y_entrenamiento, dtype=torch.long)
for epoch in range(200): # número de épocas
i = 0
for sentence in msj_procesado:
#Paso 1. Borrar gradientes anteriores
model.zero_grad()
# Paso 2. Transforma la oración en un tensor de índices de palabras.
sentence_in = prepare_sequence(sentence, word_to_ix)
targets = y_entrenamiento_tensor[i].unsqueeze(0)
i += 1
# Paso 3. Pasar la entrada por la red neuronal (forward). Devuelve scores
tag_scores = model(sentence_in)
# Paso 4. Calcular la función de pérdida, gradientes, y actualizar los parámetros
loss = loss_function(tag_scores, targets)
loss.backward()
optimizer.step()
Predicciones
# Ver los scores de las oraciones después del entrenamiento
with torch.no_grad():
for i in range(0, 5):
inputs = prepare_sequence(msj_procesado[i], word_to_ix)
print(msj_procesado[i])
tag_scores = model(inputs)
print(tag_scores)
print("predicción: ",torch.argmax(tag_scores).numpy()) # 0 = negativo, 1 = positivo
['Buenas', 'tardes', 'hay', 'problemas', 'para', 'hacer', 'compras', 'x', 'internet', 'no', 'reconocen', 'mi', 'tarjeta', 'cuando', 'estara', 'habilitado'] tensor([[-2.3842e-07, -1.5215e+01]]) predicción: 0 ['fasjfsadnsdasda', 'justo', 'ahora'] tensor([[-1.1921e-06, -1.3615e+01]]) predicción: 0 ['S', 'me', 'acaba', 'de', 'pasar', 'lo', 'mismo'] tensor([[-3.3379e-06, -1.2604e+01]]) predicción: 0 ['Buenas', 'noches', 'nose', 'porque', 'no', 'puedo', 'entrar', 'a', 'la', 'app', 'me', 'podrían', 'apoyar', 'soy', 'cliente', 'nuevo', 'y', 'me', 'afilie', 'y', 'nada'] tensor([[-1.1921e-07, -1.5890e+01]]) predicción: 0 ['Ayer', 'deposito', '200', 'soles', 'y', 'me', 'sale', '180', 'a', 'que', 'se', 'debe', 'eso'] tensor([[-1.1921e-07, -1.6188e+01]]) predicción: 0
Predicciones en el conjunto de prueba
predicciones = np.array([])
procesados_prueba = procesar_mensajes(msj_prueba)
with torch.no_grad():
for i in range(0, len(procesados_prueba)):
inputs = prepare_sequence(procesados_prueba[i], word_to_ix)
print(procesados_prueba[i])
tag_scores = model(inputs)
print(tag_scores)
print("predicción: ",torch.argmax(tag_scores).numpy()) # 0 = negativo, 1 = positivo
predicciones = np.append(predicciones , torch.argmax(tag_scores).numpy())
['A', 'mi', 'tambien', 'me', 'han', 'cobrado', '20', 'soles'] tensor([[-2.3842e-06, -1.2935e+01]]) predicción: 0 ['Aún', 'no', 'regresa'] tensor([[-3.0994e-06, -1.2687e+01]]) predicción: 0 ['Aun', 'no', 'hay', 'sistema', 'en', 'los', 'agentes', 'solucionen', 'lo', 'antes', 'posible', 'porfavor'] tensor([[-3.5763e-07, -1.4947e+01]]) predicción: 0 ['A', 'qué', 'hora', 'arreglan', 'la', 'aplicación', 'móvil', 'No', 'se', 'puede', 'hacer', 'nada'] tensor([[-1.1921e-07, -1.5743e+01]]) predicción: 0 ['Aún', 'no', 'hay', 'sistema'] tensor([[-2.8610e-06, -1.2758e+01]]) predicción: 0 ['Interbank', 'podrían', 'responder', 'O', 'también', 'se', 'cayo', 'el', 'sistema', 'en', 'redes', 'Pésimo', 'desde', 'el', 'asesor', 'que', 'me', 'dejo', 'esperando', 'y', 'la', 'gerente', 'que', 'hizo', 'lo', 'mismo', 'quizás', 'siguen', 'trabajando', '❌', 'Como', 'es', 'posible', 'que', 'no', 'den', 'solución', 'Felizmente', 'el', 'tiempo', 'vale', 'más', 'que', 'el', 'dinero'] tensor([[-3.5763e-07, -1.4762e+01]]) predicción: 0 ['Aun', 'no', 'hay', 'sistema', 'aun'] tensor([[-4.7684e-07, -1.4689e+01]]) predicción: 0 ['No', 'puedo', 'sacar', 'mis', '20', 'lucas', 'del', 'cajero', 'dice', 'q', 'no', 'tengo', 'saldo', 'suficiente', 'pero', 'si', 'lo', 'tengo'] tensor([[-1.1921e-07, -1.6134e+01]]) predicción: 0 ['Amigos', 'seguimos', 'esperando', 'que', 'se', 'solucione', 'el', 'problema', 'no', 'puedo', 'realizar', 'ninguna', 'transacción', 'de', 'ningún', 'tipo', 'ya', 'son', 'demasiadas', 'horas'] tensor([[-1.1921e-07, -1.6087e+01]]) predicción: 0 ['No', 'se', 'pudde', 'retirar', 'de', 'cajeros', 'y', 'monederos', 'Ya', 'probe', 'en', '3', 'y', 'nada', 'ahora', 'como', 'me', 'movilizooooo'] tensor([[-2.3842e-07, -1.5150e+01]]) predicción: 0 ['Aun', 'no', 'se', 'puede', 'entrar', 'al', 'app', 'Como', 'pueden', 'asegurar', 'un', 'servicio', 'que', 'aun', 'no', 'esta', 'habilitado', 'Es', 'un', 'desastre'] tensor([[-1.1921e-07, -1.5698e+01]]) predicción: 0 ['Ni', 'con', 'débito', 'o', 'crédito', 'llame', 'y', 'me', 'dijeron', 'algunos', 'si', 'han', 'tenido', 'suerte', 'pero', 'con', 'compras', 'menores', 'a', '200'] tensor([[-1.1921e-07, -1.6207e+01]]) predicción: 0 ['Ayer', 'pague', '200', 'por', 'safetypay', 'y', 'hasta', 'ahora', 'el', 'comercio', 'no', 'recibe', 'el', 'pago'] tensor([[-3.5763e-07, -1.4895e+01]]) predicción: 0 ['Arreglen', 'la', 'web', 'de', 'transferencias', 'para', 'empresas', 'desde', 'ayer', 'no', 'se', 'puede', 'hacer', 'nada'] tensor([[-1.1921e-07, -1.5836e+01]]) predicción: 0 ['A', 'que', 'hora', 'puedo', 'hacer', 'compras', 'por', 'internet'] tensor([[-7.1526e-07, -1.4118e+01]]) predicción: 0 ['América', 'Televisión', 'Latinape', 'ATVpe', 'deben', 'de', 'publicar', 'este', 'inconveniente', 'a', 'nivel', 'nacional', 'el', 'sistema', 'de', 'Interbank', 'se', 'ha', 'caído', 'por', 'completo', 'No', 'se', 'puede', 'realizar', 'cualquier', 'operación', 'por', 'ende', 'afecta', 'a', 'todos', 'los', 'clientes', 'Ni', 'siquiera', 'enviaron', 'mensajes', 'masivos', 'avisando', 'que', 'esto', 'iba', 'a', 'ocurrir', 'o', 'disculpándose', 'Interbank', 'debería', 'manifestarse', 'por', 'este', 'problema'] tensor([[-7.1526e-07, -1.4129e+01]]) predicción: 0 ['Aún', 'sigo', 'sin', 'poder', 'comprar', 'por', 'internet', 'o', 'retirar', 'en', 'efectivo', 'con', 'mi', 'tarjeta', 'de', 'crédito', 'A', 'que', 'hora', 'se', 'soluciona', 'esto'] tensor([[-1.1921e-07, -1.6173e+01]]) predicción: 0 ['muchas', 'gracias', 'buen', 'dia'] tensor([[-7.0212e-05, -9.5645e+00]]) predicción: 0 ['Quieren', 'pasar', 'piola'] tensor([[-1.3112e-04, -8.9392e+00]]) predicción: 0 ['Todo', 'el', 'día', 'sin', 'sistema'] tensor([[-4.7684e-07, -1.4672e+01]]) predicción: 0 ['Aver', 'señores', 'de', 'Interbank', 'llame', 'de', 'mi', 'celular', 'y', 'espere', 'como', 'más', 'de', '30', 'minutos', 'y', 'mi', 'saldo', 'de', 'mi', 'teléfono', 'celular', 'se', 'agotó', 'se', 'tiró', 'más', '20', 'soles', 'en', 'tratar', 'de', 'resivir', 'la', 'atención', 'al', 'cliente', 'y', 'no', 'respende', 'no', 'dice', 'su', 'eslogan', 'que', 'el', 'tiempo', 'vale', 'más', 'que', 'el', 'dinero', 'ahora', 'ps', 'espero', 'que', 'responda', 'y', 'a', 'ver', 'si', 'me', 'retribuyen', 'el', 'tiempo', 'y', 'dinero', 'perdido', 'por', 'intentar', 'llamar', 'sólo', 'para', 'pedir', 'que', 'desbloqueen', 'mi', 'aplicación', 'ya', 'que', 'no', 'podía', 'visualizar', 'mis', 'movimientos', 'o', 'mi', 'estado', 'de', 'cuenta', 'por', 'eso', 'es', 'que', 'llamaba', 'para', 'que', 'me', 'dieran', 'esa', 'solución', 'estoy', 'recontra', 'molesto', 'aver', 'espero', 'que', 'me', 'retribuyan', 'lo', 'perdido', 'en', 'saldo', 'de', 'mi', 'teléfono', 'y', 'tiempo', 'y', 'también', 'soluciones', 'lo', 'de', 'mi', 'aplicación', 'que', 'está', 'bloqueada'] tensor([[-1.1921e-07, -1.5582e+01]]) predicción: 0 ['Alex', 'nuestros', 'cajeros', 'y', 'monederos', 'ya', 'están', 'funcionando', 'con', 'normalidad'] tensor([[-2.3842e-07, -1.5119e+01]]) predicción: 0 ['Alguien', 'sabe', 'si', 'ya', 'hay', 'sistema', 'o', 'no'] tensor([[-4.0971, -0.0168]]) predicción: 1 ['Nos', 'alegra', 'Luis'] tensor([[-9.8943e-06, -1.1521e+01]]) predicción: 0
Métricas finales
from sklearn.metrics import classification_report
print(classification_report(predicciones,y_prueba))
precision recall f1-score support 0.0 0.95 0.87 0.91 23 1.0 0.00 0.00 0.00 1 accuracy 0.83 24 macro avg 0.48 0.43 0.45 24 weighted avg 0.91 0.83 0.87 24