karma, menéame, software

Explicación simple del algoritmo de promoción de noticias (promote)

Actualización noviembre 4, 2012: Se modifica el punto 4, con la explicación del nuevo algoritmo de afinidad.

Actualización mayo 7, 2009: En la pestaña log de cada noticia se puede observar en qué momento se hicieron los reajustes de karma y las notas informativas del algoritmo.

Siempre que una noticia controvertida con varios votos negativos  (y/o que algunos piensen que no “queremos que salga” aunque le hayamos votado positivo o dado publicidad en nuestros blogs) no sale publicada surgen sospechas o conspiranoias de que “hay manipulación”, aunque el algoritmo de promoción es público, como así también los cálculos que realiza. Leer Más

karma, menéame, novedades, software

Penalización de “endogamia de votos”

Desde hace unas horas está funcionando el nuevo “promote” (código fuente) que calcula y penaliza las “altas endogamias” (o afinidades) de votos entre usuarios. Así se evitarán que un grupo de usuarios se voten siempre entre ellos y puedan publicar las noticias más fácilmente.

La técnica es algo similar a la “diversidad” que usan en Digg –al menos así lo cuentan– pero en nuestro caso se usa directamente el karma que aporta cada usuario a una noticia y se aplicará a aquellos usuarios que votan a [casi] todos los envíos de otros usuarios.

La penalización consiste de un coeficiente entre 0 y <1  que se calcula al karma aportado por cada usuario. El coeficiente de afinidad representa el porcentaje de votos a los envíos de un usuario. Así en el último mes A votó un 30% de los envíos de B que obtuvieron muchos votos (aunque no haya salido publicada), los siguientes votos de A a B valdrán 0.7. Si en cambio votó al 90%, el voto valdrá 0.1 de su valor original –con un mínimo de 5–. Si en cambió no llegó a votar al 10% (por ahora, mientras está de pruebas) el voto no sufrirá penalización alguna.

Además de la ventaja fundamental de evitar “endogamias”, también penaliza a aquellos usuarios que votan “a lo loco” basado sólo en el título o autor del envío.

Pueden surgir problemas, como que requiera varias horas hasta que los coeficientes de cálculo se estabilicen, o que haya que hacer ajustes al promote por penalizaciones injustas. Estaremos muy pendientes de esto en los días siguientes.

Actualización (9/10 21 hs): Después de probar en parelelo durante casi 24 horas –casi no hay casos para comprobar–, lo mismo funciona para los votos negativos. El cálculo es similar pero negativos, es decir que el mínimo valor negativo que puede dar es -5.

Aclaración: No afecta al karma de los usuarios, sólo afecta al cálculo del karma total de las noticias. Aunque haya “afinidad” del 100% el voto siempre cuenta como positivo y suma karma según lo explicado arriba.

Nota: Para los que vayan a mirar el código fuente, la función que calcula la afinidad está al final, se llama check_affinity(). Puede verse como se aplica en el coeficiente un par de líneas más abajo desde donde es llamada la función (que devuelve un diccionario con los coeficientes para cada usuario).

[*] Sí, los hay, especialmente esos que usan foros –y mésenyers— para avisar que han subido noticias de sus sitios/foros/temáticas. Últimamente hemos detectado varios, es la motivación, para evitar estos “abusos” sin que nos obliguen a banear sitios o cuentas de usuarios.

hosting, menéame, novedades, software

Novedades: votos a comentarios, anotaciones, cálculo del karma, promote, Amazon EC2 y fútbol

Estos últimos días hemos hecho varias mejoras importantes (si fuésemos anglosajones diríamos algo como estamos realmente excitados). La principal es que los votos a comentarios son públicos desde hace unos días, se muestran en una ventana modal.

Votos de comentarios públicos

La idea de los votos a comentarios es para resaltar a los buenos comentarios y penalizar a aquellos que insultan o provocan gratuitamente. Al principio no pensábamos que hiciese falta hacer público los datos de estos votos, ya que hay suficientes controles para evitar los abusos de negativos y en general funcionan bastante bien.

Pero hay usuarios que abusan y votan negativo sólo para expresar su desconformidad con los argumentos expuestos, otros como “venganza”, esto generaba bastantes cabreos y consultas a los admins.

Así que habíamos decidido hace tiempo hacerlos públicos, sólo nos demoramos porque estábamos buscando la forma de hacerlo usable, simple y que no afecte la velocidad de todo el sitio. Creo que lo hemos logrado, so we are excited… 🙂

Servidor adicional en Amazon EC2

El otro cambio importante es más técnico y de las tripas del Menéame, pero casi obligaron a acelerar la implementación de las otras  características, tiene que ver con la avalancha de visitas que recibimos durantes las hora siguientes al partido contra Italia, tanto que la primera hora el sitio iba muy lento por llegar al límite de las 800 conexiones simultáneas.

Para prepararnos para el partido contra Rusia tuvimos que hacer modificaciones importantes al código del Menéame –pre-diseñada, pero pendientes de implementar– para permitir agregar servidores y réplicas remotas temporales de la base de datos.

Así fue que implementamos esta característica y ya está funcionan en un servidor alquilado en Amazon EC2 (amazon1.meneame.net). Si esta noche se produce otra vez la saturación lo habilitaremos para que también sirva al dominio meneame.net.

Sólo tiene un problema importante.

Los tiempos de latencias entre los centros de datos de Amazon en EEUU y nuestros servidores de Ferca en Madrid son muy elevados. Cuando un usuario modifica algo –comentario, voto, chat en la fisgona–, el servidor de Amazon tiene que enviar sincrónicamente los datos al de Madrid para que la visualización sea consistente. Así que en estos casos mencionados veréis –si lo habilitamos para después del partido– que la respuesta es lenta [*]. Pero compensa con la velocidad de navegación que aportará.

[*] No habría este problema si tuviésemos todos los servidores en Amazon EC2, pero los tiempos de ping de estos con Europa son muy malos.

Anotaciones

Al permitir tener varios servidores distribuidos y con altas latencias  ya no podíamos usar ficheros estáticos (compartidos vía NFS). Eso nos generó problemas con los logs públicos del promote y del karma que son visibles en el perfil de usuarios. Para solucionarlo hemos implementado un sistema de “anotaciones” de texto que permiten guardar los logs en la base de datos y así ser accesibles desde cualquier servidor.

Está diseñado para ser muy rápida y de uso genérico. En el futuro seguramente usaremos esta característica para otros tipos de avisos.

Cálculo del karma

En el perfil de cada usuario se puede consultar los resultados del karma. Al mismo tiempo que implementamos la visualización de votos comentarios hicimos algo similar para visualizar el log del cálculo.

Al tener las anotaciones hicimos los cambios para adaptarla y además tradujimos todo el texto al castellano, con mensajes más comprensibles.

Además aprovechando las características de las anotaciones, también se añaden en “tiempo real” los registros de cambios en el karma, por ejemplo con registros de incremento de karma por publicación de una noticia, las penalizaciones por votos cowboys, el descarte de noticias, comentarios con spam, etc. Esta información adicional al usuario ayudará a mejorar todavía más la “transparencia” del Menéame.

Promote

Al igual que tuvimos que adaptar el karma, también el log del promote donde se muestra el ajuste de karma que se hace a cada noticia (cada cinco minutos), o cuándo son seleccionadas para publicarse. Ahora tiene una nueva dirección meneame.net/promote.php.

Fútbol

Algunos dicen que el fútbol es pan y circo. Otros lo defienden. A otros les es indiferente (¿recordáis que podéis seleccionar o “anular” categorías en vuestro perfil?).

En cambio a nosotros nos da no sólo problemas y flames, también mucho trabajo de programación… y algo de gastos adicionales. But, it was quite exciting. 😉

karma, menéame

Bonus temporal de las noticias

Casi desde el primer día del menéame, el programa que selecciona la noticia a publicar aplica un bonus a las noticias más recientes. El único objetivo de dichos bonus es publicar rápidamente las noticias que captan el interés de los que votan, en son aquellas que impactan más o que se refieren a un suceso importante.

Obviamente, una noticia que sale publicada en poco tiempo gracias a ese bonus tiene menos votos que las “normales”. Así, cada vez que se publica una noticia gracias a su bonus surgen comentarios conspiranoicos de que hay manipulación o que existe una “mafia” que hace que ocurra esto. Nada más lejos de la realidad, es así como funciona el algoritmo y se puede verificar en los resultados del cálculo: la columna BONUS indica el coeficiente que se le aplica, normalmente vale uno, pero en caso de noticias recientes se observará que el coeficiente es mayor que uno.

Cómo funciona

La parte fundamental del código es el siguiente

// BONUS
// Give more karma to news voted very fast during the first two hours (ish)
if ($link->content_type != 'image'
		&& $link->negatives < ($link->votes/10)
		&& $now - $link->date < 7200
		&& $now - $link->date > 600) {
	$link->new_coef = 2 - ($now-$link->date)/7200;
	// if it's has bonus and therefore time-related, use the base min_karma
	if ($decay > 1)
		$karma_threshold = $past_karma;
	else
		$karma_threshold = $min_karma;
} else {
	// Otherwise use normal decayed min_karma
	$karma_threshold = $min_karma;
	$link->new_coef = 1;
}

Lo que hace es muy sencillo. Si una noticia fue enviada hace menos de 2 horas y más de 10 minutos –para evitar que salga demasiado rápido sin que otros tengan oportunidad de votar– su karma se verá multiplicado por un coeficente mayor que  1 y menor 2. Este es el valor que se puede ver en la columna BONUS explicada anteriormente.

El valor del coeficiente depende del tiempo que ha pasado –decae proporcionalmente–, es lo que se hace la primera línea resaltada.  Valdrá casi 2 a los pocos minutos de haber sido enviada y decaerá proporcionalmente a 1 al llegar a las 2 horas

Además hay otra restricción. El bonus no se aplica si la noticia tiene más de un 10% de votos negativos.

No hay magia, no hay manipulación. Es un algoritmo que está implementado desde el principio y que funcionó en general muy bien para publicar rápidamente aquellas noticias que los votantes consideran muy relevantes.

karma, menéame

Mitos del karma: votar a las más votadas da más karma

Parece que uno de los mitos sobre el karma es que si se votan las noticias con más votos o que están en el promote o en las populares de pendientes el karma sube mucho. Es absolutamente falso, el voto positivo a las noticias influye muy poco, y en muchos casos puede afectar negativamente.

Los votos positivos cuentan más para el karma cuanto más temprano se vote,  aún así la influencia es muy pequeña. La media del último cálculo es exactamente 0.175577 puntos, el máximo que dio es 4.733 y el mínimo  -4.167.

En pocas palabras, aporta muy poco de media y el máximo sólo lo pueden tener muy pocas personas (las que siguieron durante tiempo las pendientes y votaron “bien” rápidamente, a los pocos minutos que hayan sido enviadas).

La mejor forma de conseguir karma es enviando noticias y haciendo buenos comentarios. Voy a coger por ejemplo el “log” (lo puede ver cada usuario en su perfil) del usuario utah (sólo porque fue uno de los que me preguntó por la fisgona). Este usuario no publicó ninguna noticia en los últimos días, pero envió varias y sin embargo su karma actual es 13.53.

Su log es el siguiente:

1. events: votes: 209, logs: 60
2. Links karma positive average: 110, negative average: 0.71428571428571, karma1: 3.7283950617284
3. Votes to links: votes to published: 10, to non published: 24 to discarded: 0
4. points to published: 5, point average: 0.5, karma2: 0.43047619047619
5. Comment votes received: votes: 34, votes karma: 256, karma4: 4.5176470588235
6. Utah Karma base: 6.0303616184678
7. Final karma: average: 13.525375985899, calculated karma: 14.706879929496, increasing (status: normal)

Línea por línea:

  1. En total tiene 209 votos y 60 eventos de comentarios, notas o envíos.
  2. La media del karma que recibió de votos en sus noticias es de 110, los negativos 0.71, por lo que le otorga 3.73 puntos.
  3. Votó a 10 noticias que luego salieron publicadas y 24 a no publicadas. No votó negativa a ninguna noticia que luego haya sido descartada.
  4. Los “puntos” totales a noticias publicadas es 5, la mitad de los votos, eso es porque su “coeficiente temporal” es de 0.5, es decir que de media votó las noticias prácticamente a la mitad del tiempo entre que fueron enviadas y salió publicada. Es un buen número, sin embargo sólo le otorga 0.43 puntos de karma.
  5. Los votos que recibieron sus comentarios, en total 34 votos con un karma total de 256, se le otorgan 4.52 puntos de karma.
  6. El karma base por su antigüedad ( 6 + 0.03), 6.03
  7. El karma final calculado del período es 14.71, que resulta de sumar 3.73 + 0.43 + 4.52 + 6.03. Luego se hace la media ponderada con el karma anterior (alfa = 0.8 cuando se incrementa), que es igual a 14.71 * 0.8 + karma anterior * 0.2. Ese es el resultado final de 13.53.

O sea, si lo que se pretende es incrementar karma, es mejor enviar noticias razonables y hacer buenos comentarios. El votar “desesperado” a las noticias no sirve de nada, sólo sirve votar bien “temprano”. Si se espera a ver las noticias más votadas o las que aparecen en las populares, lo más probable es que sea penalizado. Esta penalización es justamente para minimizar  el karmawhorismo y los bots.

Conclusión: Vota lo que te venga en ganas, no busques el karma votando a las noticias con más votos o karma. No servirá de nada, a menos que tengas un ojo muy bueno y estés mucho tiempo en el Menéame mirando cuáles son las buenas noticias que entran y votarlas inmediatamente. En todo caso, mirar las populares sirve fundamentalmente para votar negativo a aquellas que no te parece que deban ir a portada, o darle un pequeño empujon a aquellas que te parezcan buenas. Pero nada más [*].

PS: también penaliza votar negativo en exceso a comentarios y noticias, pero sólo en “exceso”. En el caso de noticias es más o menos si la proporción de negativos de noticias no descartadas es muy alta (la penalización sale con el comentario Unfair negative votes to non discarded). En el caso de comentarios si votas negativos a muchos comentarios que acaban con un karma positivo (el aviso que sale en estos casos es Unfair negative comments votes).

[*] El objetivo fundamental del promote es poder verificar o controlar cómo se hacen los ajustes de karma para cada noticia. Es decir una herramienta para despejar dudas y un control al propio menéame. Algunos dicen que haber publicado el código no garantiza que sea el mismo que hace los cálculos. Por eso también publicamos los cálculos en “tiempo real”.