Hace ya algún tiempo (casi 2 meses!) saqué showRSS junto con algunos amigos. Se trata de un servicio web que permite generar un feed completamente personalizable que contiene los torrents de las series seleccionadas por los usuarios, extrayendo los torrents (y por lo tanto, series cubiertas) de EZTV, con el objetivo de sustituir al difunto FeedMyTorrents. El servicio tuvo bastante éxito (portada en Digg, aparición en TorrentFreak, Lifehacker, AppleSfera, y de ahí bastantes más blogs de tamaño medio).
Pese a mis temores, aguantó demasiado bien el tirón, y lo mejor de todo, sin posteriores sorpresas (lecturas aleatorias que fallan, índices que revientan y demás marrones aleatorios que suelen surgir). De ahí (y después del «hype») me puse a ver qué cosas interesantes se podían hacer con toda la cantidad de información que mueve semejante monstruo (sobre todo ahora mismo, con unos 15000 usuarios activos y unas 160000 selecciones de series hechas por los usuarios).
Así que me puse manos a la obra y monté una especie de sistema que generase recomendaciones para series. Y menuda basura.
La idea es de generar una lista de series “similares” a las dadas anteriorente. Técnicamente, es poesía. Sin embargo soy incapaz de entender código un mes después de escribirlo (eso es un problemón), y los resultados no son tan precisos como deberían. Al fin y al cabo, funciona pero con sus detalles.
El principio técnico es … algo extraño. Primero se seleccionan los usuarios que ven alguna de las series seleccionadas. Esta lista se procesa de manera a posicionar a los usuarios que mayores coincidencias tienen, y calcular su afinidad. Por dar un ejemplo: si un usuario ve las 5 series que yo he seleccionado más una más, esa serie (y por lo tanto, ese usuario, que pasará con mayor peso a la segunda parte) será mucho más importante que cualquier otra serie que sea vista por un usuario que vea mis 5 series y otras 15 más.
Después de atribuir los puntos a los usuarios, y los bonus a las series, se aplican también una serie de penalizaciones (por ejemplo, en el caso de que un usuario vea mis 5 series escogidas más una, si esa serie es por ejemplo la más vista, no va a tener prácticamente peso en el cálculo final, o de manera opuesta va a tener mucho más peso si se trata de una serie en la larga cola que tiene especial relevancia entre los usuarios con gustos similares a los míos).
Pero ahí vuelve a destacarse otro gran problema: la larga cola. En las series, por ejemplo, Nurse Jackie es reciente y podría cubrir ciertas recomendaciones cuando el usuario por ejemplo ya ve House y Mental. Pero (y por pura estadística), Heroes (que es la serie más suscrita en la plataforma) va a tener mayor relevancia que Nurse Jackie, pese a todos los bonus, aunque sean negativos.
Un método alternativo sería el clustering y k-means (bueno, no voy a hablar demasiado, la explicación técnica induce al suicidio). A parte de que no comprendo la mitad, no contempla de la misma forma la cantidad de suscritos (y después de tantas pruebas puedo decir que algo sí que importa en este caso). El sistema de k-means (a parte de ser horriblemente complicado) se basa en crear “inicios” aleatorios, para crear unas especies de polos (sí, y esto sigue siendo complicado). Y es imprevisible.
Otro problema (y ya de la propia naturaleza del sistema): igual que te puede gustar House, puedes odiar a Mental y Pushing Daisies, y para más inri, estar enganchado a Big Brother. Digno de una muerte dolorosa, sí, pero ocurre… y es que el ser humano… es extraordinario (y en esto no pensé antes).
Hasta aquí, verborrea. Ahora pasemos a lo interesante y triples anidados de listas completamente innecesarios:
- Diferentes ejemplos de resultados:
- House, Mental, Nurse Jackie, Dexter, Bones
- Fringe
- Dollhouse
- Heroes
- Burn Notice
- Chuck
- Lie to me
- The Mentalist
- Eureka
- True Blood
- Lost
- NCIS, CSI: NY, Criminal Minds, Numb3rs, Cold Case
- CSI
- CSI: Miami
- Bones
- House
- The Mentalist
- Fringe
- Burn Notice
- Chuck
- Lie to me
- Heroes
Las dos “selecciones” son a grandes rasgos de dos temáticas diferentes. La primera, de medicina e investigación criminal, la segunda de investigación criminal y enigmas criminales, por decirlo de alguna forma. Por lo tanto, existe un ‘cruce’ entre las temáticas, aunque sus extremos están bastante alejados. Los elementos en itálica señalan coincidencias en ambas listas y los elementos en negrita señalan a series en el Top 10 de series más suscritas.
Las coincidencias son demasiado abundantes, ya que en ambos casos las series con mayor número de suscriptores ganan por encima de las series que realmente serían buenas sugerencias (por ejemplo, Dollhouse en la primera selección, pienso). Luego, las posibles selecciones (que se encontrarían a los “extremos” de ambas temáticas) en ciertos casos pueden no ser un reflejo de lo que el usuario espera.
El cruce entre las series también se reporta a cualquier otro set de sugerencias. Las series en sí también evolucionan y no siempre mantiene una temática definida (por ejemplo, Lost pasó de ser una serie intrigante a ser una mierda intrigante). En ocasiones los “grupos” de series se solapan entre sí, así que del momento en el cual se escogen series que podrían pertenecer a grupos distintos (Bones, Dexter, NCIS) el resultado de la sugerencia es completamente inútil y sin sentido.
Pero sigamos…
- El problema técnico:
- Lecturas a la base de datos: para calcular absolutamente todo se necesita recurrir a la base de datos, y eso hace una media de 3000 lecturas por recomendación.
- Cache: la solución al primer problema sería guardar el set cada lectura en memcache (el sistema de MySQL se revela inútil en estos casos). Sin embargo, debido a que se tratan de consultas muy precisas (y con muchos datos devueltos), por ejemplo, los shows de X usuario, el hit rate es bastante bajo (y a falta de RAM, termina siendo un mal amigo para un sistema como showRSS).
- La larga cola: esto sí que es un monstruo, y pura estadística. Cuanto más se ve una serie, más posibilidades hay de que se cuele en las sugerencias, y por mucha penalización que exista, es casi inevitable.
- La interfaz: no es realmente un problema técnico, pero si un verdadero marrón, a mitad entre diseño y técnica… por que cuando 150 líneas de JS dejan de funcionar sin motivo aparente bajo Internet Explorer, a uno le entran unos instintos asesinos bastante preocupantes.
A la larga, es muy difícil mantener un proyecto así funcionando. Requiere tener una máquina aislada (aunque se trate de un VPS, de lo contrario un pico de uso o simplemente un capullo abusón reventarían un servidor entero), suficiente RAM como para tener un cache funcional (y no un cache “peligroso”), y un programador que sepa interpretar su propio código (prometo no volver a usar nombres de variables abstractos sin documentar, lo prometo, por mi bien).
¿Y cual es la utilidad real? Posiblemente, ninguna. La información así es interesante para hacer tartitas y barritas, pero no para ayudar a descubrir nuevas cosas…
Concluyendo: Las sugerencias no funcionan… por ahora. Y es que el ser humano es imprevisible (y espero que nadie me pida nunca consejo sobre estos temas, al menos por ahora), por ahora tocará seguir encontrando series a la vieja usanza: amigos, zapping y EZTV.
¿Alguien dijo recomendaciones personalizadas? De moda, e inútil.