ANASS.

Algoritmo Page Rank de Google

Implementación del algoritmo PageRank de Google en Rust, demostrando como las cadenas de Markov y el modelo de teletransporte permiten clasificar páginas web según su relevancia.

stack tecnológico

Rust
Captura de pantalla de Algoritmo Page Rank de Google

Contexto y propósito

El contexto empezó al ver el video “Visitiuim cadena de Markov” donde se explica cómo las Cadenas de Markov permitieron a Google convertirse en el mejor buscador del mundo (PageRank): Ver video en YouTube.

A partir de esa inspiración, este proyecto nació como un ejercicio práctico para:


Desafíos Técnicos y Soluciones de Ingeniería

1) Tokenización y normalización robustas para español

2) Construcción segura de matrices de transición

3) Estrategias de generación: “greedy” no-reflexiva y muestreo ponderado

4) PageRank y modelo de teletransporte (eigenvector estacionario)


Organización del Proyecto


API de librería (ejemplo de uso)

use markov_chain::collections::MarkovChain;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let texto = "hola hola adios mundo adios hola mundo";
    let mut mc = MarkovChain::new();

    mc.fit(texto)?;
    let greedy = mc.generate_greedy_nonself("hola", 10).unwrap();
    let random = mc.generate("hola", 10).unwrap();

    println!("Greedy: {}", greedy);
    println!("Random: {}", random);
    Ok(())
}

Puntos clave:


Cómo funciona (alto nivel)

  1. Tokenización:
    • Minúsculas, filtrado de símbolos no alfabéticos y partición por espacios.
  2. Vocabulario e índices:
    • Con BTreeSet para orden determinista; mapeo palabra→índice con BTreeMap.
  3. Conteo y normalización:
    • Bigrama (w_i → w_{i+1}) incrementa M[i][j].
    • Cada fila se normaliza para que sume 1, formando una matriz estocástica fila.
  4. Generación:
    • Greedy no-reflexiva: evita quedarse en el mismo estado; en empate, el más “temprano” por índice.
    • Aleatoria: muestreo proporcional a M[i][*] (con rand); “fallback” si la fila efectiva queda sin masa.
  5. PageRank (demo):
    • Construye M_α = αM + (1-α)U (mezcla con distribución uniforme) y obtiene la distribución estacionaria por eigenvector.

Limitaciones y mejoras futuras


Bibliografía