GMARTINEZMILLA commited on
Commit
d837b5d
·
verified ·
1 Parent(s): cf71bb0

Upload utils.py

Browse files
Files changed (1) hide show
  1. utils.py +81 -0
utils.py ADDED
@@ -0,0 +1,81 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ import pandas as pd
3
+ import numpy as np
4
+ import warnings
5
+ warnings.filterwarnings('ignore')
6
+ from sklearn.feature_extraction.text import TfidfVectorizer
7
+ from sklearn.metrics.pairwise import cosine_similarity
8
+ from joblib import dump, load
9
+
10
+
11
+
12
+
13
+ def recomienda_tfid(new_basket):
14
+
15
+ cestas = pd.read_csv('../data/processed/cestas.csv')
16
+ productos = pd.read_csv('../data/processed/productos.csv')
17
+
18
+ # Cargar la matriz TF-IDF y el modelo
19
+ tfidf_matrix = load('../models/tfidf_matrix.joblib')
20
+ # MAtriz que tienen cada columna los diferentes artículos y las diferentes cestas en las filas
21
+ # Los valores son la importancia de cada artículo en la cesta según las veces que aparece en la misma y el total de artículos
22
+ tfidf = load('../models/tfidf_model.joblib')
23
+
24
+ # Convertir la nueva cesta en formato TF-IDF
25
+ new_basket_str = ' '.join(new_basket)
26
+ new_basket_tfidf = tfidf.transform([new_basket_str])
27
+
28
+ # Comparar la nueva cesta con las anteriores
29
+ # Calculando la distancia coseoidal, distancia entre rectas
30
+ similarities = cosine_similarity(new_basket_tfidf, tfidf_matrix)
31
+ # La similitud coseno devuelve un valor entre 0 y 1, donde 1 significa
32
+ # que las cestas son idénticas en términos de productos y 0 que no comparten ningún producto.
33
+
34
+ # Obtener los índices de las cestas más similares
35
+ # Muestra los índices de Las 3 cestas más parecidas atendiendo a la distancia calculada anteriormente
36
+ similar_indices = similarities.argsort()[0][-4:] # Las 3 más similares
37
+
38
+ # Crear un diccionario para contar las recomendaciones
39
+ recommendations_count = {}
40
+ total_similarity = 0
41
+
42
+ # Recomendar productos de cestas similares
43
+ for idx in similar_indices:
44
+ sim_score = similarities[0][idx]
45
+ # sim_score es el valor de similitud de la cesta actual con la cesta similar.
46
+ total_similarity += sim_score # Suma de las similitudes entre 0 y el nº de cestas similares
47
+ products = cestas.iloc[idx]['Cestas'].split()
48
+
49
+ for product in products:
50
+ if product.strip() not in new_basket: # Evitar recomendar lo que ya está en la cesta
51
+ recommendations_count[product.strip()] = recommendations_count.get(product.strip(), 0) + sim_score
52
+ # se utiliza para incrementar el conteo del producto en recommendations_count.
53
+ # almacena el conteo de la relevancia de cada producto basado en cuántas veces aparece en las cestas similares, ponderado por la similitud de cada cesta.
54
+ # sumandole sim_score se incrementa el score cuando la cesta es mas similar
55
+
56
+ # Calcular la probabilidad relativa de cada producto recomendado
57
+ recommendations_with_prob = []
58
+ if total_similarity > 0: # Verificar que total_similarity no sea cero
59
+ recommendations_with_prob = [(product, score / total_similarity) for product, score in recommendations_count.items()]
60
+ # Se guarda cada producto junto su score calculada
61
+ else:
62
+ print("No se encontraron similitudes suficientes para calcular probabilidades.")
63
+
64
+ recommendations_with_prob.sort(key=lambda x: x[1], reverse=True) # Ordenar por puntuación
65
+
66
+ # Crear un nuevo DataFrame para almacenar las recomendaciones
67
+ recommendations_data = []
68
+
69
+ for product, score in recommendations_with_prob:
70
+ # Buscar la descripción en el DataFrame de productos
71
+ description = productos.loc[productos['ARTICULO'] == product, 'DESCRIPCION']
72
+ if not description.empty:
73
+ recommendations_data.append({
74
+ 'ARTICULO': product,
75
+ 'DESCRIPCION': description.values[0], # Obtener el primer valor encontrado
76
+ 'RELEVANCIA': score
77
+ })
78
+
79
+ recommendations_df = pd.DataFrame(recommendations_data)
80
+
81
+ return recommendations_df