4 · Filtrado basado en contenido
Describe los ítems por sus características, promedia las características de lo que le gustó al usuario en un perfil de gustos y luego puntúa los ítems no vistos por cuán cerca están. Sin necesidad de otros usuarios — y el cold-start de ítems desaparece.
El filtrado basado en contenido recomienda ítems que se parecen — en sus propias características (género, etiquetas, texto) — a los que ya le gustaron al usuario. Construyes un perfil de usuario como el promedio ponderado por valoración de los vectores de características de los ítems que le gustaron, y luego ordenas los ítems no vistos por similitud coseno con ese perfil.
Sin esto:
Sin características de contenido, un ítem nuevo con cero valoraciones es invisible para el filtrado colaborativo. La puntuación basada en contenido usa características que existen desde el día uno, así que una película nueva puede recomendarse en cuanto llega — cold-start de ítems resuelto.
El filtrado colaborativo mira de lado — '¿qué les gustó a usuarios similares?'. El filtrado basado en contenido mira los ítems mismos — '¿cómo es este ítem y se parece a lo que ya disfrutaste?'. Nunca necesita a otro usuario, que es justamente por lo que cura el cold-start de ítems: una película nueva no tiene valoraciones, pero sí tiene un género, un reparto y una descripción desde el día uno.
La receta tiene tres pasos:
- Vectores de características del ítem. Describe cada ítem como un vector de características. El más simple es un one-hot de género: una fila con un 1 en cada género al que pertenece el ítem. (Los sistemas reales añaden reparto, director, etiquetas, TF-IDF de la sinopsis — próxima lección.)
- Perfil de usuario. Resume el gusto de un usuario como un único vector en el mismo espacio de características. La construcción clásica es el promedio ponderado por valoración de los vectores de características de los ítems que valoró. Crucialmente, primero centramos las valoraciones alrededor de la media del usuario, para que un ítem que gustó atraiga el perfil hacia sus características y un ítem que disgustó lo aleje — una valoración de 1 estrella a un romance debería hacer el romance negativo en el perfil, no solo débilmente positivo.
- Puntúa los ítems no vistos por similitud coseno entre el perfil y el vector de características de cada ítem no visto, y luego ordena. El coseno mide la dirección (qué géneros), ignorando la magnitud, así que un ítem cuyos géneros se alinean con el perfil puntúa alto sin importar cuántos géneros tenga.
Abajo hacemos exactamente esto para un usuario que ama la ciencia ficción y detesta el romance, y vemos caer las recomendaciones — sin un segundo usuario a la vista.
Python (in browser)
Construye un perfil de gustos desde one-hots de género y luego ordena por coseno los ítems no vistos. La ciencia ficción gana, el romance se vuelve negativo — todo desde el historial de un solo usuario.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
¿Por qué CENTRAMOS las valoraciones de un usuario (restando su media) antes de construir el perfil de contenido?
- El filtrado basado en contenido puntúa los ítems por sus propias características (one-hot de género, etiquetas, texto), sin necesitar a otros usuarios.
- Un perfil de usuario = el promedio ponderado por valoración (centrado en la media) de los vectores de los ítems que gustaron, así los desagrados obtienen peso negativo.
- Ordena los ítems no vistos por similitud coseno con el perfil; esto resuelve directamente el cold-start de ítems.
Las recomendaciones por características de audio de Spotify, los recomendadores de noticias/artículos y las filas de 'porque viste X' se apoyan en características de contenido para ítems frescos y de nicho.
Si lo quitas: Quita las características de contenido y tu sistema queda ciego ante cada estreno hasta que acumula valoraciones — una desventaja brutal para catálogos con llegadas nuevas constantes.