Cargamos las librerias necesarias para text mining y su manejo:
library(tm)
library(dplyr)
library(tidyr)
Cargamos el libro del Quijote:
Libroquijote<-file("libros/quijote.txt","r", encoding = "UTF-8")
Libroquijote_lines<-readLines(Libroquijote)
#Convertimos a corpus
quijote_src<-VectorSource(Libroquijote_lines)
quijote_corpus<-VCorpus(quijote_src)
Creamos una funcion para limpiar adecuadamente el libro y quedarnos con los caracteres deseados para el analisis.
clean_corpus <- function(corpus){
#espacio en blanco
corpus <- tm_map(corpus, stripWhitespace)
#signos de puntuacion
corpus <- tm_map(corpus, removePunctuation)
#todo el texto lo convierte a minusculas
corpus <- tm_map(corpus, content_transformer(tolower))
#se quitan los numeros
corpus <- tm_map(corpus, removeNumbers)
return(corpus)
}
Aplicamos la funcion clean_corpus para el libro de quijote.txt:
quijote_corpus<-clean_corpus(quijote_corpus)
Nos es de utilidad una funcion para tokenizar el texto, separando el texto en bigramas:
BigramTokenizer <- function(x){
unlist(lapply(ngrams(words(x), 2), paste, collapse=" "), use.names = FALSE)
}
Procedemos a tokenizar las palabras:
tdm_quijote<- TermDocumentMatrix(quijote_corpus, control = list(tokenize= BigramTokenizer))
matriz_Libroquijote<-as.matrix(tdm_quijote)
#Se muestran los Bigramas
rowSums(matriz_Libroquijote) %>% as.data.frame()
Especifico por frecuencia y bigrama:
bigram_quijote<- rowSums(matriz_Libroquijote) %>% as.data.frame()
bigram_quijote<- as.data.frame(bigram_quijote)
bigram_quijote$bigrams<-rownames(bigram_quijote)
names(bigram_quijote)<-c("freq","bigram")
bigram<-as.data.frame(bigram_quijote)
Separamos las palabras:
bigram_quijote$bigram<-as.character(bigram_quijote$bigram)
bigram_quijote<-separate(bigram_quijote,bigram,into=c("word1","word2"), sep=" ")
bigram_quijote$freq <- as.integer(bigram_quijote$freq)
Para generar la matriz es necesario poder separar en columnas y filas para ver la incidencia de cierta combinacion de 2 palabras. Tomaremos 200 palabras a considerar. Las palabras son tomadas de manera aleatoria.
#definimos quienes estaran en las filas
filas_quijote<-unique(bigram_quijote$word1)
#defnimos quienes estaran en las columnas
columnas_quijote<-unique(bigram_quijote$word2)
nPalabras<- 50
set.seed(1230)
filasQ<-sample(filas_quijote)
columnasQ<-sample(columnas_quijote)
quijote_matriz<-matrix(data=0, nrow<-nPalabras, ncol<-nPalabras, dimnames = list(head(filasQ,nPalabras), head(columnasQ,nPalabras)))
Por ultimo generamos la Matriz de quijote:
#definimos una funcion for para la creacion de la matriz
for(i in 1:nrow(quijote_matriz)){
for(j in 1:ncol(quijote_matriz)){
val<-
bigram_quijote$freq[bigram_quijote$word1==row.names(quijote_matriz)[i] & bigram_quijote$word2==colnames(quijote_matriz)[j]]
if(length(val)==0){
quijote_matriz[i,j]<-0
}else{
quijote_matriz[i,j]<-val
}
}
}
Desplegamos la matriz resultante:
quijote_matriz
cuello sabrá talante mío amaneciese por atrevimiento deba enderécese venida
machuca 0 0 0 0 0 0 0 0 0 0
olla 0 0 0 0 0 0 0 0 0 0
quedóse 0 0 0 0 0 0 0 0 0 0
decilla 0 0 0 0 0 0 0 0 0 0
erades 0 0 0 0 0 0 0 0 0 0
hirviendo 0 0 0 0 0 0 0 0 0 0
terible 0 0 0 0 0 0 0 0 0 0
mudas 0 0 0 0 0 0 0 0 0 0
siguen 0 0 0 0 0 0 0 0 0 0
recibiera 0 0 0 0 0 0 0 0 0 0
seglar 0 0 0 0 0 0 0 0 0 0
aqueste 0 0 0 0 0 0 0 0 0 0
muy 0 0 0 0 0 0 0 0 0 0
hallarse 0 0 0 0 0 0 0 0 0 0
volcar 0 0 0 0 0 1 0 0 0 0
apartéme 0 0 0 0 0 0 0 0 0 0
trozos 0 0 0 0 0 0 0 0 0 0
partidas 0 0 0 0 0 0 0 0 0 0
piedra 0 0 0 0 0 0 0 0 0 0
paraba 0 0 0 0 0 0 0 0 0 0
lamentable entrado horror callar ojo desamparado razonamientos kirieleison
machuca 0 0 0 0 0 0 0 0
olla 0 0 0 0 0 0 0 0
quedóse 0 0 0 0 0 0 0 0
decilla 0 0 0 0 0 0 0 0
erades 0 0 0 0 0 0 0 0
hirviendo 0 0 0 0 0 0 0 0
terible 0 0 0 0 0 0 0 0
mudas 0 0 0 0 0 0 0 0
siguen 0 0 0 0 0 0 0 0
recibiera 0 0 0 0 0 0 0 0
seglar 0 0 0 0 0 0 0 0
aqueste 0 0 0 0 0 0 0 0
muy 0 0 0 0 0 0 0 0
hallarse 0 0 0 0 0 0 0 0
volcar 0 0 0 0 0 0 0 0
apartéme 0 0 0 0 0 0 0 0
trozos 0 0 0 0 0 0 0 0
partidas 0 0 0 0 0 0 0 0
piedra 0 0 0 0 0 0 0 0
paraba 0 0 0 0 0 0 0 0
pertenecían contrario culpan sangre emperatriz asomaron digna furibundo
machuca 0 0 0 0 0 0 0 0
olla 0 0 0 0 0 0 0 0
quedóse 0 0 0 0 0 0 0 0
decilla 0 0 0 0 0 0 0 0
erades 0 0 0 0 0 0 0 0
hirviendo 0 0 0 0 0 0 0 0
terible 0 0 0 0 0 0 0 0
mudas 0 0 0 0 0 0 0 0
siguen 0 0 0 0 0 0 0 0
recibiera 0 0 0 0 0 0 0 0
seglar 0 0 0 0 0 0 0 0
aqueste 0 0 0 0 0 0 0 0
muy 0 0 0 0 0 0 0 0
hallarse 0 0 0 0 0 0 0 0
volcar 0 0 0 0 0 0 0 0
apartéme 0 0 0 0 0 0 0 0
trozos 0 0 0 0 0 0 0 0
partidas 0 0 0 0 0 0 0 0
piedra 0 0 0 0 0 0 0 0
paraba 0 0 0 0 0 0 0 0
castilla coger conformaba entera inglaterra honestísimos riñas fasta camina
machuca 0 0 0 0 0 0 0 0 0
olla 0 0 0 0 0 0 0 0 0
quedóse 0 0 0 0 0 0 0 0 0
decilla 0 0 0 0 0 0 0 0 0
erades 0 0 0 0 0 0 0 0 0
hirviendo 0 0 0 0 0 0 0 0 0
terible 0 0 0 0 0 0 0 0 0
mudas 0 0 0 0 0 0 0 0 0
siguen 0 0 0 0 0 0 0 0 0
recibiera 0 0 0 0 0 0 0 0 0
seglar 0 0 0 0 0 0 0 0 0
aqueste 0 0 0 0 0 0 0 0 0
muy 0 0 0 0 0 0 0 0 0
hallarse 0 0 0 0 0 0 0 0 0
volcar 0 0 0 0 0 0 0 0 0
apartéme 0 0 0 0 0 0 0 0 0
trozos 0 0 0 0 0 0 0 0 0
partidas 0 0 0 0 0 0 0 0 0
piedra 0 0 0 0 0 0 0 0 0
paraba 0 0 0 0 0 0 0 0 0
fristón costezuela escondidas escribían rucio papelón silboso amo aguardase
machuca 0 0 0 0 0 0 0 0 0
olla 0 0 0 0 0 0 0 0 0
quedóse 0 0 0 0 0 0 0 0 0
decilla 0 0 0 0 0 0 0 0 0
erades 0 0 0 0 0 0 0 0 0
hirviendo 0 0 0 0 0 0 0 0 0
terible 0 0 0 0 0 0 0 0 0
mudas 0 0 0 0 0 0 0 0 0
siguen 0 0 0 0 0 0 0 0 0
recibiera 0 0 0 0 0 0 0 0 0
seglar 0 0 0 0 0 0 0 0 0
aqueste 0 0 0 0 0 0 0 0 0
muy 0 0 0 0 0 0 0 0 0
hallarse 0 0 0 0 0 0 0 0 0
volcar 0 0 0 0 0 0 0 0 0
apartéme 0 0 0 0 0 0 0 0 0
trozos 0 0 0 0 0 0 0 0 0
partidas 0 0 0 0 0 0 0 0 0
piedra 0 0 0 0 0 0 0 0 0
paraba 0 0 0 0 0 0 0 0 0
noria mováis ponérsele público traducción depositasen
machuca 0 0 0 0 0 0
olla 0 0 0 0 0 0
quedóse 0 0 0 0 0 0
decilla 0 0 0 0 0 0
erades 0 0 0 0 0 0
hirviendo 0 0 0 0 0 0
terible 0 0 0 0 0 0
mudas 0 0 0 0 0 0
siguen 0 0 0 0 0 0
recibiera 0 0 0 0 0 0
seglar 0 0 0 0 0 0
aqueste 0 0 0 0 0 0
muy 0 0 0 0 0 0
hallarse 0 0 0 0 0 0
volcar 0 0 0 0 0 0
apartéme 0 0 0 0 0 0
trozos 0 0 0 0 0 0
partidas 0 0 0 0 0 0
piedra 0 0 0 0 0 0
paraba 0 0 0 0 0 0
[ reached getOption("max.print") -- omitted 30 rows ]
Son tantas las combinaciones de palabras debido al libro de texto que es dificil apreciar, pero si se busca en la fila “volcar” y en la columna “por” se puede observar una incidencia denotada por 1.