Una página importante es la que otras enlazan
El ranking por enlaces ordena las páginas según quién las enlaza: una página es importante si otras páginas importantes apuntan a ella. Funciona como un voto, y el voto de una página muy votada vale más.
Sirve cuando el texto no basta. Dos páginas pueden hablar de lo mismo con las mismas palabras, y los enlaces ayudan a decidir cuál merece el primer puesto.
Al final de esta lección
Nota
Puedo explicar cómo el rango de una página fluye por los enlaces hasta asentarse.
Palabras clave
| Palabra | Qué significa |
|---|---|
| Enlace de salida | un enlace que va de esta página a otra |
| Enlace de entrada | un enlace que llega a esta página desde otra |
| Rango | el número que dice cuánto pesa una página |
| Factor de amortiguación | la parte del rango que viaja por los enlaces |
| Iteración | repetir el mismo cálculo con el resultado anterior |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un enlace es un voto para otra página
Un enlace de salida de una página es un enlace de entrada de otra. Contar los enlaces de entrada da una primera idea de la importancia de una página.
Pero no todos los votos valen igual. Un enlace desde una página que todo el mundo enlaza pesa más que uno desde una página que nadie visita.
Ejemplo resuelto: cuatro páginas de una facultad
| Página | Enlaza a | Enlaces de entrada |
|---|---|---|
| inicio | becas, horarios | 3: becas, horarios, contacto |
| becas | inicio | 2: inicio, horarios |
| horarios | inicio, becas | 1: inicio |
| contacto | inicio | 0 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Cada página reparte su rango entre sus enlaces
Todas empiezan con el mismo rango: un cuarto cada una. En cada paso, una página reparte su rango a partes iguales entre sus enlaces de salida. Con dos enlaces, cada uno recibe la mitad.
Una página suma lo que recibe y lo multiplica por el factor de amortiguación, aquí 0,8. El 0,2 restante se reparte a partes iguales, como un lector que salta a una página al azar.
Ejemplo resuelto: el primer paso de «inicio»
| De quién recibe | Rango que tiene | Enlaces de salida | Recibe |
|---|---|---|---|
| becas | 0,25 | 1 | 0,25 |
| horarios | 0,25 | 2 | 0,125 |
| contacto | 0,25 | 1 | 0,25 |
| Suma recibida | 0,625 | ||
| Rango nuevo | 0,2 entre 4, más 0,8 por 0,625 | 0,55 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Comprueba la cuenta de «inicio»
docker exec jupyter python3 -c "print(round(0.2/4 + 0.8*(0.25/1 + 0.25/2 + 0.25/1), 4))"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Calcula un paso para las cuatro páginas
# Un paso: cada página reparte su rango entre sus enlaces de salida.
links = {
"inicio": ["becas", "horarios"],
"becas": ["inicio"],
"horarios": ["inicio", "becas"],
"contacto": ["inicio"],
}
rango = {}
for pagina in links:
rango[pagina] = 0.25
nuevo = {}
for pagina in links:
recibido = 0.0
for origen in links:
if pagina in links[origen]:
recibido = recibido + rango[origen] / len(links[origen])
nuevo[pagina] = 0.2 / 4 + 0.8 * recibido
for pagina in nuevo:
print(pagina, round(nuevo[pagina], 3))
# Añade "contacto" a los enlaces de "inicio" y ejecuta.
Se repite el cálculo hasta que se asienta
Un paso no basta: el rango que una página reparte ya ha cambiado. Se repite el paso con los rangos nuevos, una y otra vez. Cada repetición es una iteración.
Tras unas pocas, los rangos casi no cambian y el orden queda fijo. Entonces se dice que el cálculo se ha asentado. Los rangos de todas las páginas siguen sumando 1.
Ejemplo resuelto: los rangos paso a paso
| Paso | inicio | becas | horarios | contacto |
|---|---|---|---|---|
| 0 | 0,25 | 0,25 | 0,25 | 0,25 |
| 1 | 0,55 | 0,25 | 0,15 | 0,05 |
| 2 | 0,35 | 0,33 | 0,27 | 0,05 |
| 3 | 0,462 | 0,298 | 0,19 | 0,05 |
| 30 | 0,423 | 0,307 | 0,219 | 0,05 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Repite el paso treinta veces
# Repetir el paso hasta que los rangos se asientan.
links = {
"inicio": ["becas", "horarios"],
"becas": ["inicio"],
"horarios": ["inicio", "becas"],
"contacto": ["inicio"],
}
def one_step(rank):
new = {}
for page in links:
received = 0.0
for source in links:
if page in links[source]:
received = received + rank[source] / len(links[source])
new[page] = 0.2 / 4 + 0.8 * received
return new
rank = {}
for page in links:
rank[page] = 0.25
for step in range(30):
rank = one_step(rank)
for page in rank:
print(page, round(rank[page], 3))
# Cambia 30 por 2 y compara con la tabla.
Un error muy común
Advertencia
Mucha gente cree que gana la página con más enlaces de entrada. Cuenta también quién enlaza: un voto de una página importante vale más que varios de páginas que nadie enlaza. Además, el rango por enlaces se combina con el texto, no lo sustituye.
Para ir más lejos: tu propia web
Dibuja seis páginas con sus enlaces, de modo que cada una tenga al menos un enlace de salida. Calcula su rango con el código de arriba.
Predice antes quién gana. Después cambia un enlace y mira qué página gana o pierde puestos.