Cargando las librerias necesarias:
library(tm)
library(dplyr)
library(tidyr)
library(parallel)
Cargando el libro el quijote y la biblia:
quijote <- file("quijote.txt", encoding = "UTF-8")
biblia <- file("biblia.txt", encoding = "UTF-8")
Leyendo las lineas del libro del Quijote, luego por medio de la funcion “paste” se concatenan todos los vectores, o sea todas las lineas. Y por ultimo se separa cada elemento en substring.
quijote_lines <- readLines(quijote)
quijote_words <- paste(quijote_lines,collapse=" ")
quijote_words <- strsplit(quijote_words, split = " ") %>% unlist()
head(quijote_words)
[1] "EL" "INGENIOSO" "HIDALGO" "DON" "QUIJOTE" "DE"
Ahora haremos lo mismo pero con el libro de la biblia:
biblia_lines <- readLines(biblia)
biblia_words <- paste(biblia_lines,collapse=" ")
biblia_words <- strsplit(biblia_words, split = " ") %>% unlist()
head(biblia_words)
[1] "LA" "SANTA" "BIBLIA," "ANTIGUO" "TESTAMENTO," "VERSIÓN"
A cada uno de los libros se le quitaran los signos de puntuacion, los numeros, las mayusculas y todos los pronombres personales o articulos
quijote_words <- sapply(quijote_words,"removePunctuation",USE.NAMES = FALSE)
quijote_words <- sapply(quijote_words,"tolower",USE.NAMES = FALSE)
quijote_words <- sapply(quijote_words,"stripWhitespace",USE.NAMES = FALSE)
quijote_words <- sapply(quijote_words,"removeNumbers",USE.NAMES = FALSE)
quijote_words <- sapply(quijote_words,"removeWords",
words=stopwords('spanish'),
USE.NAMES = FALSE)
quijote_words <- quijote_words[quijote_words!=""]
quijote_words <- quijote_words[quijote_words!=" "]
biblia_words <- sapply(biblia_words,"removePunctuation",USE.NAMES = FALSE)
biblia_words <- sapply(biblia_words,"tolower",USE.NAMES = FALSE)
biblia_words <- sapply(biblia_words,"stripWhitespace",USE.NAMES = FALSE)
biblia_words <- sapply(biblia_words,"removeNumbers",USE.NAMES = FALSE)
biblia_words <- sapply(biblia_words,"removeWords",
words=stopwords('spanish'),
USE.NAMES = FALSE)
biblia_words <- biblia_words[biblia_words!=""]
biblia_words <- biblia_words[biblia_words!=" "]
Reduciendo el tamanio del libro del Quijote:
quijote_words2 <- quijote_words[1:1000]
Reduciento del tamanio del libro de la Biblia:
biblia_words2 <- biblia_words[1:1000]
Ahora uniremos todas las palabras de cada libro en uno solo:
libro_completo <- c(quijote_words2, biblia_words2)
head(libro_completo)
[1] "ingenioso" "hidalgo" "don" "quijote" "mancha" "miguel"
Vamos a obtener la cantidad palabras unicas que hay en el vector:
length(unique(libro_completo))
[1] 995
La funcion ngrams crea un vector de caracteres con palabras en secuencia:
bigrams <-
lapply(ngrams(libro_completo,2), paste, collapse=" ") %>% unlist()
head(bigrams)
[1] "ingenioso hidalgo" "hidalgo don" "don quijote" "quijote mancha" "mancha miguel" "miguel cervantes"
Convertiremos la tabla de characters en un dataframe:
bigrams <-
table(bigrams) %>% as.data.frame()
head(bigrams)
Separando cada vector con dos palabras dentro del dataframe, se nombran por word1 y word2:
bigrams <- bigrams %>%
separate(bigrams,into=c("word1","word2"),sep=" ")
Mostrando una muestra de los bigramas, donde la Frecuencia sea mayor a 5.
Se colocan cada una de las word2 en las columnas y en las filas y se cuenta la frecuencia:
cadena_markov<-
bigrams %>%
spread(key = word2,value = Freq,fill = 0)
head(cadena_markov)
Convirtiendo la cadena de markov a una matriz:
mm_chain<-
as.matrix(cadena_markov[,-1])
Cambiando las filas por las word1 de la cadena de markov, dimension de la cadena:
row.names(mm_chain) <- cadena_markov$word1
dim(mm_chain)
[1] 995 995
Numero de filas y columnas para definir la matriz:
mm_chain<-
mm_chain/rowSums(mm_chain)
nrow(mm_chain)
[1] 995
ncol(mm_chain)
[1] 995
Creando la matriz con el numero de filas, numero de columnas de la cadena de markov. Y se divide entre la suma de las frecuencias, para obtener la probabilidad:
s<-
matrix(1,ncol=995,nrow=995)
s<-
s/rowSums(s)
Evitando clusters no unidos:
M <- 0.85*mm_chain+0.15*s
Metodo para procesar la matriz en distintos hilos de ejecucion.
matprod.par <- function(cl, A, B){
if (ncol(A) != nrow(B)) stop("Matrices do not conforme")
idx <- splitIndices(nrow(A), length(cl))
Alist <- lapply(idx, function(ii) A[ii,,drop=FALSE])
## ans <- clusterApply(cl, Alist, function(aa, B) aa %*% B, B)
## Same as above, but faster:
ans <- clusterApply(cl, Alist, get("%*%"), B)
do.call(rbind, ans) }
(nc <- detectCores())
[1] 4
cl <- makeCluster(rep("localhost", nc))
Multiplicando la matriz por ella misma:
M1 <-
matprod.par(cl,M,M)
M <- M %*% M
stopCluster(cl)
Vista de la Matriz luego de la multiplicacion:
Estabilidad de la Matriz multiplicandola varias veces por ella misma:
M_2 <- M
for(i in 1:25){
c2 <- makeCluster(rep("localhost", nc))
M2 <-
matprod.par(c2,M,M)
M_2 <- M_2 %*% M
stopCluster(c2)
}
Multiplicando la matriz 10 veces por ella misma:
Multiplicando la matriz 20 veces por ella misma:
M_2 <- M
for(i in 1:20){
c2 <- makeCluster(rep("localhost", nc))
M2 <-
matprod.par(c2,M,M)
M_2 <- M_2 %*% M
stopCluster(c2)
}
Multiplicando la matriz 25 veces por ella misma:
M_2 <- M
for(i in 1:25){
c2 <- makeCluster(rep("localhost", nc))
M2 <-
matprod.par(c2,M,M)
M_2 <- M_2 %*% M
stopCluster(c2)
}