Posts etiquetados ‘karma’

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

mayo 7, 2009

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.

Suele pasar porque hay parámetros que ajustan el valor del karma de la noticia y hay poca gente capaz o con tiempo para tomarse el trabajo de leer el código y  de seguir la evolución del karma de cada noticia. Para esas personas intentaré explicar el funcionamiento básico del promote, y porqué lo hemos implementado de esa forma.

Los parámetros que más afectan al karma son los siguientes, ordenados más o menos de los que más influyen a los que menos:

  1. Bonus temporal a las nuevas noticias
  2. Coeficiente por metacategorías
  3. Añejamiento de noticias antiguas
  4. Control de diversidad de votos (o de afinidad)
  5. Control de media de votos

(Recalco lo de “más o menos”, ya que depende de varios factores, por ejemplo si la media de votos de una noticia es muy baja, afectará más que los demás, pero está al último porque no se suele llegar a esos extremos, salvo casos de intento de spam con muchos usuarios nuevos o inactivos por mucho tiempo, por ejemplo)

1. Bonus temporal a las nuevas noticias

El objetivo es publicar rápidamente aquellas noticias que reciben muchos votos apenas se envió la noticia. Este algoritmo funciona desde el primer día. Básicamente multiplica el karma de la noticia por un coeficiente decreciente tempral entre 2 y 1 1.5 a 1. A las dos horas el coeficiente se hace igual a uno por lo que deja de influenciar. Este coeficiente es visible en el promote, la columna COEF. La explicación más completa.

2. Coeficiente por metacategorías

En Menéame hay cuatro metacategorías: ocio, cultura, actualidad y tecnología. El objetivo es intentar tender a un balance entre número de enviadas y publicadas en cada categoría. De esta forma también se evita que el Menéame sea monotemático –o dominado por unas pocas categorías–.

Basado en el número de enviadas / número de publicadas de cada metacategoría se calcula un coeficiente. Los coeficientes de cada una son visibles en el promote. Por ejemplo ahora mismo:

Karma coefficient for tecnología: 1.31632555175
Karma coefficient for cultura: 0.982548801982
Karma coefficient for actualidad: 0.93282154627
Karma coefficient for ocio: 0.872050062752

Los números anteriores significan que a las noticia de tecnología se multiplica por 1.31 mientras que a las de actualidad 0.92. Esos coeficientes son medias entre las enviadas y publicadas de cada una en los últimos 2 días. Están también disponibles justo arriba de los coeficientes anteriores:

2 days stats for tecnología (queued/published/total): 157/13/98 -> 0.0679107630313
2 days stats for cultura (queued/published/total): 175/19/98 -> 0.0905408163265
2 days stats for actualidad (queued/published/total): 455/44/98 -> 0.10136577708
2 days stats for ocio (queued/published/total): 176/22/98 -> 0.104336734694

Los tres números de cada meta significan respectivamente: número de enviadas, número de publicadas y publicadas totales.

3. Añejamiento de noticias antiguas

El objetivo del algoritmo es quitar progresivamente la relevancia de las noticias después de varias horas (nueve). Se hace así para evitar que salgan publicadas siempre noticias de hace varios días, ya que por razones lógicas –el tiempo que están en pendientes– las más antiguas tienen más posibilidades y probabilidad de tener más votos que una noticia reciente.

El coeficiente varía progresivamente desde 1 a 0.4 una vez que han pasado nueve horas desde que se envió la noticia. Este coeficiente es visible también en la columna COEF del promote.

La parte del código que lo calcula es:

// Aged karma
$diff = max(0, $now - ($link->date + 9*3600)); // 9 hours without decreasing
$oldd = 1 - $diff/(3600*60);
$oldd = max(0.4, $oldd);
$oldd = min(1, $oldd);
$link->new_coef = $oldd;

El añejamiento de cada noticia también funciona desde el principio del Menéame.

4. Control de diversidad de votos (o de afinidad)

El objetivo de este control es evitar que grupos de usuarios se voten las noticias entre ellos y logren publicarlas (eso que algunos dicen que existen y llaman “mafias”).

El algoritmo calcula un porcentaje de afinidad entre usuarios y decrementa el karma que “aportan” a la noticia dependiendo de la afinidad con el usuario que le envió: a mayor afinidad menor es su influencia final (aunque el voto siempre suma). Con esto se asegura que para que una noticia salga publicada tiene que haber un mínimo de diversidad de votos.

El algoritmo está explicado en detalle en otro apunte. Está activo desde principios de setiembre de este año (2008).

La parte esencial del código que calcula el coeficiente de afinidad es el siguiente:

foreach ($votes as $vote) {
	if ($vote->id > 0 &&
			$vote->id != $uid &&
			abs($vote->count) > max(1, $nlinks/10) ) {
		$c = $vote->count/$nlinks * 0.75;
		if ($vote->count > 0) {
			$affinity[$vote->id] = round((1 - $c)*100);
		} else {
			$affinity[$vote->id] = round((-1 - $c)*100);
		}
	}
}

5. Control de media de votos

El objetivo de este control es evitar que se creen usuarios nuevos –o se tengan usuarios “inactivos”– con el único objetivo de publicar noticias de un determinado sitio. Por ejemplo que se pongan de acuerdo en un foro, o que haya grupos o empresas con muchos usuarios los intenten “vender” para promocionar sitios.

El promote analiza las medias de votos en los últimos días y usa esa media para controlar que no haya desvíos importantes. La media es visible en el promote:

Karma average for each link: 9.15856554197

Esto significar que la media ponderada de los votos a cada noticia en los últimos días es igual a 9.16.

Para cada noticia se calcula cuál es la media de sus votos. Si la diferencia de la media de un enlace es inferior al 3% de la global –para permitir variaciones hacia abajo–, entonces no toma en cuenta votos inferiores a la media para hacerla como mínimo igual a 9.16 * 0.97 (el -3%) aproximadamente.

Este control funciona desde el primer semestre de 2007.

Tuvimos que hacerlo cuando empezamos a detectar los intentos de spams mediante la creación de decenas de usuarios, especialmente cuando se acercaban fechas electorales o campus parties (ademas incluimos más controles de frecuencia de registros que se pueden hacer por IP y subred).

// Make sure we don't deviate too much from the average
// (it avoids vote spams and abuses)
// Allowed difference up to 3%
$karma_pos_user = (int) $karma_pos_user_high +
                  (int) min($karma_pos_user_high * 1.07, $karma_pos_user_low);

El karma es fundamental

Espero que esta breve explicación elimine algunas dudas sobre el funcionamiento del algoritmo de promoción y que de más tranquilidad, ya que está claro que se intenta asegurar que no haya abusos y grupos que tengan más influencia –llámese mafias o fanboys– capaces de publicar noticias sólo con sus votos.

En toda la explicación de las diferentes técnicas, el parámetro fundamental que evoluciona con el tiempo es el karma –en este caso el de las noticias, pero también el de cada usuario–. Ojalá que aclare mejor lo que comentábamos hace tiempo sobre la potencia y utilidad de ese numerito que llamamos “karma” [*]:

Lo anterior creo que explica más o menos los fundamentos de tener un karma: es un sistema básico de protección “anti abusos” que evita tener que tomar medidas más “drásticas”, además hace posible el voto anónimo.

[...]

Sí, admitimos que no es perfecto, ni de lejos, pero el karma ha sido fundamental para controlar y evitar abusos sin tener que recurrir a medidas extremas y un coste de administración que hubiese sido prohibitivo para nosotros.

(y permite publicar todo, el algoritmo y sus cálculos)

[*] Es decir, la potencia de las matemáticas de nivel de ESO para hacer cálculos y controles complejos y a la vez resumirlos en un número que todos podemos entender para darnos una idea de la “situación” :-)

El problema al final de los partidos: disculpas y criterio que seguiremos desde ahora

junio 23, 2008

Cada vez que hay algún partido de fútbol importante se repite el siguiente problema:

  • Antes que acabe el partido ya hay varios usuarios con el borrador preparado para enviar.
  • Al no poder enlazar a noticias ya redactadas enlazan habitualmente a páginas webs que transmiten o actualizan en tiempo real (“marcadores”).
  • Pocos segundos antes o después del pitido final envían la noticia, casi todos simultáneamente.
  • Se produce una saturación de noticias sobre lo mismo en la cola de pendientes, con votos por erróneas, duplicadas más los ya infaltables irrelevantes.
  • Durante varios minutos se siguen enviando noticias de lo mismo, a veces por no darse cuenta, otras por simple cachondeo o para molestar.
  • Con todo ese cruce de votos negativos al final terminan tardando mucho tiempo en salir o en casos extremos –como la del Madrid cuando ganó la liga– acaba no saliendo la noticia publicada.

Resultado: Acusaciones de mafia o que desde el Menéame censuramos esas noticias. No sé que sentido tendría censurar algo que es harto conocido y que al fin y al cabo es una tontería. Pero desde lo del Madrid, ese tema ha sido el centro de muchos flames e incluso de preguntas en alguna conferencia.

Con la Eurocopa el problema se agravó aún más y entre los admins estábamos discutiendo cómo solucionar el problema. Habíamos visto que el mayor problema eran los envíos precipitados de esos sitios de “marcadores” que muchas veces no están actualizados al momento del envío a la cola, y otras –como me pasó a mí– muestran información desactualizada.

La opción que discutimos es la de no permitir el envío de esos “marcadores” para así premiar al que envíe ya un artículo redactado –los periódicos deportivos los suelen publicar muy rápido–. Fue una opción discutida pero no decidida… y de aquí vino el error que cometimos. Con toda la buena voluntad pero fue un error.

Al momento que terminó el partido de España contra Italia se envió esta noticia de un “marcador”. Varios admins que estaban presentes recordaron la discusión anterior y además vieron que el marcador no estaba actualizado con el resultado final de los penaltis. Eso, junto con el nerviosismo porque el servidor estaba saturado –teníamos el límite de conexiones simultáneas, 800, un record nunca alcanzado– llevó a cometer el error de descartarla cuando no habíamos avisado claramente que seguiríamos esa política ni tan siquiera la habíamos aplicado en casos anteriores.

Aunque le decisión al final tuvo tuvo un buen resultado –se publicó una que sí era completa–, fue un claro error. Así que disculpas nuevamente, la intención era buena pero cometimos tres errores: exceso de celo, no avisar antes, falta de “mano izquierda” al tomar una decisión en principio sin demasiada importancia pero que generó malentendidos y discusiones.

Desde anoche que estamos discutiendo cómo mejorar y evitar estos problemas y flames. Había varias opciones que se discutieron (copia literal):

1) dejar hacer y listo

2) lo de hoy (pero previo aviso en el blog oficial)

3.a) avisar en el blog de los marcadores no darán karma y aplicar un
SDK al día siguiente al afortunado que consiga portada
3.b) lo mismo que 3) pero editando el meneo en portada para poner una
URL decente.

Después de decenas de intercambio de correos y ante la difícil de rebatir las siguientes dos opiniones de dos admins diferentes (copia literal):

Al fin y al cabo, no vamos a conseguir evitar que la gente mande los resultados en seguida. Ni aunque mandar noticias deportivas reste karma [...] Creo que debemos tener presente, en la medida de lo posible, la opinión de los usuarios. Y en este caso, claramente se prefiere inmediatez sobre calidad del artículo.

En principio las normas “de calidad” son para que el usuario esté contento… y aquí el usuario objetivo de esas noticias se contenta con un marcador o cualquier cosa, ¿así que por qué preocuparnos? No es contenido chungo, porno ni similar [...] Si están contentos con un marcador, pues ya está, que ellos lo disfruten.

Después de escuchar las opiniones y alternativas hemos decidido con Benjamí que la criterio para estos casos será la siguiente.

Reglas y recomendaciones para el envío de noticias de “eventos singulares”

  1. Se permitirá el envío de “marcadores” siempre y cuando se haga al final del evento y el enlace sea correcto y con datos actualizados. No se considerarán “marcadores” válidos artículos sin casi texto ni explicaciones  y envíados con el único objetivo de autobombo o spam comercial.
  2. El envío de noticias similares, ya sea en forma masiva o para entorpecer el voto a las anteriores será considerado un abuso (por lo que se descartaría la noticia y quizás anulación de la cuenta del que la envía).
  3. Si vemos que hay muchas noticias sobre lo mismo que entorpece la votación de la/s primera/s las descartaremos.
  4. Nos reservamos el derecho a descartar todas las otras duplicadas una vez que haya salido publicada una de ellas, o que esté a punto de salir publicada (se puede controlar en el promote –atención que es una direción nueva–).
  5. Antes de enviar una noticia sobre el evento mira que no haya sido enviada, seguramente ya está en la cola.
  6. Si envías una noticia y te das cuenta que está duplicada, edítala y ponla en autodescartada. Así no afecta el karma de nadie y permite que la primera enviada tenga más votos de los interesados.
  7. Antes de votar a una noticia sobre el evento, busca cuál es la primera y vota a ella. Así ayudarás a que sea publicada más rápidamente.

Inmediatamente después que publique este apunte lo enviaré al Menéame, para informar a sus usuarios y sobre todo para que den sus sugerencias en los comentarios, por lo que cerraré los comentarios aquí y así centralizar la discusión en el sitio donde más interesa.

De nuevo, disculpas por los malentendidos, sobre todo al usuario new y a los que votaron ese primer envío.

Discusión en Menéame.

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

mayo 21, 2008

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”.


Seguir

Get every new post delivered to your Inbox.

Únete a otros 26 seguidores