El presente proyecto generaremos una matriz de markov para calcular mediante el uso de probabilidades quien es la actriz mas relevante segun el internet. Usando el listado de actriz de la wikipedia (el cual puede ver aqui), y procederemos a implementar el primer algoritmo que desarrollo google para establecer la relevancia de las paginas web.
Para ello comenzaremos utiliznado la libreria rvest y stringr para desde R poder hacer request a la wikipedia visitando el link del listado de las actices de hollywood desde al anio 1900. para ello implementamos la siguiente porcion de codigo:
links3<-
read_html("https://en.wikipedia.org/wiki/List_of_American_film_actresses") %>%
html_nodes("a") %>%
html_attr('href') %>%
tibble() %>%
rename(links='.') %>%
filter(str_detect(links,"/wiki/")) %>%
filter(!str_detect(links,"#")) %>%
filter(!str_detect(links,"image")) %>%
filter(!str_detect(tolower(links),"file"))%>%
filter(!str_detect(links,"https:")) %>%
filter(!str_detect(links,"foundation")) %>%
filter(!str_detect(links,":"))
links3
La porcion anterior de codigo primero realiza un request a link de las actrices, recibe el HTML y procede buscar unicamente los links (esto se hace buscando las tags <a href='' />) y luego procedemos a buscar las urls de los links, ojo, debemos excluir las imagenes, archivos y otros tipos de links que no sean paginas web. Finalmente obtenemos solo los links los cuales tienen el nombre de las actrices registradas en Hollywood.
La idea es visitar cada uno de los links de las actrices y buscar las referencias que existan a otras actrices para crear una matriz de markov que tenga la siguiente estructura:
data <- c( 1, 0,1,
0, 0, 1,
1, 1, 1)
names <- c("actriz 1", "actriz 2", "actriz 3")
t <- data.frame(matrix(data, byrow=TRUE, nrow=3))
actrices <- c("actriz 1", "actriz 2", "actriz 3")
rownames(t) <- actrices
colnames(t) <- names
t
Con dicha matriz construida generaremos las probabilidades al dividir cada fila por la suma total de sus valores para obtener una matriz de probabilidades de la siguiente forma:
t["actriz 1", "actriz 1"] <- 1/2
t["actriz 1", "actriz 3"] <- 1/2
t["actriz 3", "actriz 1"] <- 1/3
t["actriz 3", "actriz 2"] <- 1/3
t["actriz 3", "actriz 3"] <- 1/3
t
De ahi procedemos a utilizar la formula para calcular la relevancia Q <- m*p+(1-m)*S donde p es la matriz de conexiones de actrices que calculamos, S es una matriz de probabilidades normalizada de tamanio n y m sera una constante de 0.85 y con eso calculamos Q:
m <- 0.85
p <- t
s <- matrix(rep(1/3, 9), nrow=3)
q <- m*p+(1-m)*s
q
Luego vemos la siguiente validacion:
rowSums(q)
actriz 1 actriz 2 actriz 3
1 1 1
Y vemos la estabilizacion:
data.matrix(q)%^%50
actriz 1 actriz 2 actriz 3
actriz 1 0.3263974 0.1876785 0.4859241
actriz 2 0.3263974 0.1876785 0.4859241
actriz 3 0.3263974 0.1876785 0.4859241
Una vez definida la estrategia manos a la obra, primero haremos una funcion para poder invocar a la wikipedia y descargar los links:
scrap <- function(url = "/wiki/List_of_American_film_actresses"){
links3<-
read_html(paste("https://en.wikipedia.org", url, sep="")) %>%
html_nodes("a") %>%
html_attr('href') %>%
tibble() %>%
rename(links='.') %>%
filter(str_detect(links,"/wiki/")) %>%
filter(!str_detect(links,"#")) %>%
filter(!str_detect(links,"image")) %>%
filter(!str_detect(tolower(links),"file"))%>%
filter(!str_detect(links,"https:")) %>%
filter(!str_detect(links,"foundation")) %>%
filter(!str_detect(links,":"))
print(url)
return(links3)
}
list_original <- scrap() %>% unique()
[1] "/wiki/List_of_American_film_actresses"
list_original
Con este listado vamos a generar una matriz populada con zeros:
P <<- data.frame(matrix(rep(0, length(list_original$links)*length(list_original$links)), nrow=length(list_original$links)))
colnames(P) <- t(list_original)
rownames(P) <- t(list_original)
P