Motores de Recomendación con Python (parte 2).

<  VOLVER
Por: Datahack
junio 15, 2022
Datahack
junio 15, 2022

Lee la parte 1 aquí.

En realidad, comparar el grado de similitud entre dos películas puede que no sea lo que más interese al usuario. Puede ser más valioso encontrar todas aquellas películas que son más parecidas a la que nos gusta. Para ello, seleccionaremos la columna de la película que nos gusta y la ordenaremos de mayor a menor. Así, Python nos mostrará en orden decreciente de similitud las películas.

Figura 13. Recomendar películas por grado de similitud con Python

3. Recomendaciones basadas en texto


Desafortunadamente, en el mundo real los problemas que tenemos que resolver no tienen etiquetas claras como los géneros para el caso particular de las películas. Por suerte, si hay texto relacionado con ese elemento entonces podemos hacer algo. Este texto puede ser un resumen, una descripción del elemento o la lista de contenidos de un libro. en estos casos usaremos "Term Frequency inverse Document Frequency" o TF-IDF para transformar el testo en información valiosa.


Estos algoritmos dividen el número de veces que una palabra aparece en un documento entre el ratio de documentos globales en que unes palabra aparece. De esta manera, se reduce la importancia de palabras comunes y se incrementa el peso de aquellas palabras que no aparecen en muchos documentos. Por ejemplo, si comparamos el texto de "Harry Potter y La Piedra Filosofal" con el resto de libros de la saga Harry Potter, la palabra Voldemort obtendrá una puntuación baja ya que aparece multitud de veces a lo largo de todos los libros. Por contra, la palabra elixir que está muy relacionada sólo al primer libro de la saga, obtendrá una puntuación alta.

Figura 14. Fórmula TF-IDF

Ahora vamos a trabajar con otro dataset de películas diferente. Este contiene los nombres de las películas y el resumen de las mismas que aparece en la página Wikipedia.

Figura 15. Cargamos el nuevo dataset con el resumen de las películas

La transformación de los datos se hace gracias a TfidfVectorizer de la biblioteca Scikit Learn. Porde efecto, esta herramienta genera una característica por cada palabra presente en un documento. Esto resulta en un gran número de características; por suerte, hay formas de reducir el número de características generador por el vectorizador.

Para ello incluiremos en primer lugar el argumento min_df y le daremos un valor de 2. De esta forma sólo se convertirán en características aquellas palabras que estén presentes en al menos dos documentos. Esto es muy útil ya que las palabras que sólo aparezcan en un documento no son muy importantes a la hora de encontrar similitudes.

Por otro lado, podemos incluir un segundo argumento max_df que elimine aquellas palabras que sean muy comunes. Si lo fijamos a 0.7, no se tendrán en cuenta aquellas palabras que aparecen en más de un 70% de los resúmenes.

Figura 16. inicializamos el vectorizador limitando el número de características a generar

Una vez iniciado el Vectorizer invocaremos al método fit_transform usando la columna resumen del dataframe. El método get_feature_names permite obtener las diferentes características. La matriz dispersa se almacena en un DataFrame que almacena por filas las películas y por columnas los nombres de las características.

Figura 17. Matriz de similitud coseno

Similitud Coseno

En este caso utilizaremos una métrica que cuantifica mejor la similitud entre elementos con mayor variabilidad. A esta métrica se la conoce como Cosine Similarity o Similitud Coseno. Sin entrar en los detalles matemáticos, se encarga de medir el ángulo entre dos documentos en el espacio métrico de multiples dimensiones. Mostramos un ejemplo de esta métrica trasladada al caso del espacio bidimensional. Toma valores entre 0 y 1, donde 1 representa similitud total.

Figura 18. Formula y representación gráfica de la similitud coseno

Esta función permite hacer el cálculo entre dos películas cualesquiera. La diferencia es que en este caso, será necesario hacer un reshape como se muestra a continuación. El grado de similitud entre los resúmenes de la primera y la segunda parte de la película Cars es de 0.38.

Figura 19. Similitud Coseno entre dos películas basado en su resumen

De forma similar y partiendo de un DataFrame, Scikit Learn es capaz de calcular de una vez la similitud coseno entre todas las filas.

Figura 20. Similitud coseno de todos los elementos

Una vez calculados esos valores construimos un nuevo DataFrame de similitudes coseno.

Figura 21. DataFrame de similitudes coseno

Esto nos permite saber qué películas son más parecidas a una en concreto basándonoslos en sus resúmenes. Si buscamos recomendaciones de películas similares a Harry Potter y el Cáliz de Fuego obtenemos sugerencias para visualizar el resto de la saga.

Figura 22. Recomendaciones de películas similares a Harry Potter y el Cáliz de Fuego

Si hacemos la consulta para el caso del Señor de los Anillos: La comunidad del anillo, vemos que nos recomienda las películas de la trilogía y el Hobbit. También nos recomienda Four Sisters and a Wedding debido a que el protagonista de la película se llama Frodo también.

Figura 23. Recomendaciones de películas similares a El Señor de los Anillos: La Comunidad del Anillo

Añadimos un último caso con la película Mary Poppins. El recomendador nos sugiere como segunda opción ver la película Saving Mr. Banks, que trata sobre la colaboración entre Walt Disney y la escritora de la novela Mary Poppins.

Figura 24. Recomendaciones de películas similares a Mary Poppins

Recomendar en base al perfil del usuario

Lo que no hemos tenido en cuenta hasta ahora es que los usuarios no son tan unidimensionales como para que les guste sólo un elemento. La realidad es que el usuario habrá visto una serie de películas y querrá que la recomendación proporcionada por los algoritmos esté alineada con su amplio gusto.

Consideremos el caso que acabamos de mencionar: un usuario que ha visto una serie de películas. La forma más directa de crear el perfil de usuario es inicialmente, creando un vector que contenga los títulos de dichas películas para conseguir a través del método .loc los vectores de características de las mismas.

Figura 25. creando el perfil del usuario

Para terminar de construir el perfil de este usuario es necesario representar todas las preferencias del usuario en una única serie. Eso lo conseguimos haciendo la media de cada característica con el método .mean.

Figura 26. Perfil del Usuario

Este perfil del usuario lo usaremos para encontrar las películas con mayor similitud que no haya visto todavía. En primer lugar, tendremos que determinar el subconjunto de películas que no ha visto todavía (eliminando del dataframe del vectorizer todas aquellas películas que están en la lista de vistas). El número de filas ha disminuido de 34886 a 34880 (6 filas).

Figura 27. resultado de eliminar las seis películas vistas por el usuario

Después calcularemos la similitud coseno entre el perfil de usuario que acabamos de crear y el DataFrame de películas que aún no ha visto el usuario. Después, almacenaremos la salida en un nuevo DataFrame y ordenaremos los resultados para poder acceder y ordenar los datos de forma sencilla.

Figura 28. Recomendación basada en el historial del usuario

Ahora si que el algoritmo ha sido capaz de recomendar en base al historial de películas vistas por nuestro usuario, y no sólo basándose en películas individuales. Los registros más arriba en la tabla son los más parecidos a los intereses del usuario en base al background de intereses que recoge su perfil.

Si quieres más información sobre nuestro master, puedes contactar con nosotros bien por teléfono al +34 910 91 28 42 o +34 630 88 13 53, por whatsapp directamente pinchando aquí o aquí, o mandando un mail con tus datos de contacto (nombre completo y teléfono) a: info@datahack.es

¡Que no se te pase una!

Recibe nuestra programación mensual de eventos online y la apertura de nuevas convocatorias de cursos




    En Datahack Consulting SL trataremos los datos que nos facilites con la finalidad de enviarte información relacionada con tu solicitud sobre nuestros servicios, así como enviarte comunicaciones informativas sobre nuestra actividad. Podrás ejercer los derechos de acceso, rectificación, limitación, oposición, portabilidad, o retirar el consentimiento enviando un email a administracion@datahack.es. También puedes solicitar la tutela de derechos ante la Autoridad de Control (AEPD). Puedes consultar información adicional y detallada sobre protección de datos en nuestra Política de Privacidad.

    Estamos para ayudarte con cualquier duda, pequeña o grande

    Llámanos, escríbenos al email o por WhatsApp o inicia un chat en la web y hablamos

    chevron-down