Created
December 3, 2016 19:25
-
-
Save rubentr/59003db7a3afea38fdb23584f83045c2 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
### | |
# Introducción Analisis de texto literario con R | |
# "The Dunwich Horror" de H.P. Lovecraft | |
# Rubén Tobalina Ramirez | |
# 03/12/2016 | |
# chuletitaspinguino.wordpress.com | |
### | |
# Descargamos el texto e indicamos a R nuestra carpeta de trabajo, donde se encuentra | |
# el texto y donde el programa guardará los datos de nuestro script. | |
# Luego cargamos el texto como un vector: | |
# Directorio de trabajo | |
setwd("~/Documentos/PlantillasR/The-Dunwich-Horror/") | |
# Cargamos el texto como vector (.v) | |
text.v <- scan ("~/Documentos/PlantillasR/The-Dunwich-Horror/data/horror.txt", | |
what="character", sep="\n") | |
# Muestra la primera linea | |
text.v[1] | |
# El texto descargado tiene 1862 lineas que incluye partes (*metadata*) | |
# que no son propiamente de la novela y que para el análisis vamos a | |
# guardar en una variable a parte (para analizar más adelante). | |
# En este caso, mirando el *txt* vemos que la obra comienza en la línea 15 (el título) | |
# y termina en la 1555. | |
# Inicio | |
text.v[15] | |
# Final | |
text.v[1555] | |
# Usamos *which* para indicar en nueva variable -**metadata.v**- el texto | |
# (antes del título y después de la última palabra) que forma parte del metadata | |
# y las lineas que pertenecen a la novela (entre la línea 15 y la 1555), | |
# que guardamos en la variable *novela.v*. | |
# Yo he considerado que la obra comienza en el título pero tal vez sería | |
# mejor establecer que el inicio es con la primera frase de la novela como tal. | |
# Inicio del texto | |
start.text <- which(text.v==" The Dunwich Horror") | |
# Final del texto | |
end.text <- which(text.v=="his twin brother, but it looked more like the father than he did.\"") | |
# Metadata | |
metadata.v <- c(text.v[1:start.text-1],text.v[end.text+1:length(text.v)]) | |
# Novela | |
novela.v <- text.v[start.text:end.text] | |
#Vemos las cinco primeras lineas de nuestra variable: | |
novela.v[1:5] | |
#Comprobamos con *length* que la nueva variable -**novela.v**- contiene menos datos que **text.v-. | |
# El texto antes y después | |
length(text.v) | |
length(novela.v) | |
# El siguiente paso es quitar los saltos de línea con *paste* que concatena | |
# las cadenas de letras quitando los espacios. | |
# Cómo vemos todo el texto de la obra está guardado en un vector de una sóla línea. | |
novela.v <- paste(novela.v, collapse = " ") | |
length(novela.v) | |
# El siguiente paso es convertir todas las letras del texto en minúsculas (*tolower*). | |
novela.v <- tolower(novela.v) | |
# Ahora, convertimos nuestro texto a una lista de elementos, con la función *strsplit* | |
# por lo que cada palabra, espacios o símbolos ocupan un lugar determinado. | |
novela.l <- strsplit(novela.v, "\\W") | |
# Vemos la estructura de la nueva variable | |
str(novela.l) | |
novela.l[1:5] | |
# Volvemos a vectorizar el texto (con *unlist*), pero ahora, tras la conversión | |
# anterior en lista, el vector está indexado. Es decir cada palabra, espacio | |
# o símbolo tiene asignada una posición dentro del vector. | |
horror.v <- unlist (novela.l) | |
horror.v[1:10] | |
# Vamos a quitar los espacios de nuevo, esta vez, creamos un vector con | |
# las palabras que no son espacios usando *which* y reescribimos la variable **horror.v** con él. | |
# Creamos una nueva variable con las posiciones que tienen palabras | |
not.blank.v <- which(horror.v!="") | |
# Reescribimos la variable con esta variable | |
horror.v <- horror.v[not.blank.v] | |
horror.v[1:10] | |
# Ya tenemos nuestra novela sin signos de puntuación y espacios. | |
# Como he comentado antes, cada palabra tiene asignado un indice, | |
# así que podemos averiguar que palabra se encuentra en una determinada posición. | |
# Por ejemplo, en la posición 1000 de nuestro vector encontramos la palabra "legends". | |
horror.v[1000] | |
# También, podemos cuantas averiguar veces aparece en el vector una determinada palabra. | |
# Por ejemplo, cuantas veces aparece "Dunwich", la ciudad donde sucede la | |
# novela corta, el "simpático" primigenio "Cthulhu" o la familia protagonista "Whateley". | |
which(horror.v=="cthulhu") | |
which(horror.v=="dunwich") | |
which(horror.v=="whateley") | |
# Curioso, o no, que el simpático Cthulhu sólo aparezca una vez (soy un *fanboy*:D). | |
# Podemos conocer en que posición o posiciones se encuentran estas palabras en el vector. | |
horror.v[which(horror.v=="cthulhu")] | |
horror.v[which(horror.v=="dunwich")] | |
horror.v[which(horror.v=="whateley")] | |
# Usando *lenght* podemos conocer cuantas veces se repiten las anteriores palabras. | |
length(horror.v[which(horror.v=="cthulhu")]) | |
length(horror.v[which(horror.v=="dunwich")]) | |
length(horror.v[which(horror.v=="whateley")]) | |
# Calculando la longitud del vector con *length* podemos saber que el número total | |
# de palabras que contiene "The Dunwich Horror" son **17.878 palabras**. | |
total.words <- length(horror.v) | |
total.words | |
# Conociendo la cantidad de palabras que contiene nuestro vector y | |
# las veces que se repite una determinada palabra podemos averiguar el porcentaje | |
# de veces que aparece una palabra en concreto en la novela. | |
# Siguiendo el ejemplo anterior, "dunwhich" aparece en un porcentaje de 0,21%. | |
rep.dunwich <- length(horror.v[which(horror.v=="dunwich")]) | |
(rep.dunwich/total.words)*100 | |
#¿Que porcentaje de palabras hay en la novela que aparezcan una única vez? | |
# Porcentaje de palabras unicas hay (que se usan una sola vez) ==> (22.47%) | |
length(unique(horror.v))/total.words*100 | |
# Ahora, vamos a crear una tabla (con la función *table*) con las frecuencias | |
# de cada palabra ordenadas de forma decreciente. | |
# Frecuencias de cada palabra | |
horror.freq.t <- table(horror.v) | |
horror.freq.t[1:10] | |
# Ordenamos por orden decreciente | |
sorted.horror.freq.t <- sort(horror.freq.t, decreasing = TRUE) | |
# Usando esta tabla, realizamos un gráfico con las 10 primeras palabras más utilizadas en la novela. | |
# Plot con las 10 palabras más frecuentes | |
plot(sorted.horror.freq.t[1:10], xlab="Palabras más utilizadas", | |
ylab="Frecuencia", main = "The Dunwich Horror") | |
# Tenemos todas las palabras ordenadas por su frecuencia en una tabla y | |
# como en nuestro vector, todas estan indexadas y podemos buscar la frecuencia | |
# de una determinada palabra. Por ejemplo, el nombre del profesor Henry Armitage | |
# aparece en 52 ocasiones en la novela. | |
sorted.horror.freq.t["armitage"] | |
# Podemos también comparar el uso de dos palabras, dividiendo sus frecuencias. | |
# Así, la palabra "whateley" es usada 1,44 veces más que "armitage". | |
sorted.horror.freq.t["whateley"]/sorted.horror.freq.t["armitage"] | |
# Bueno, sabemos cuantas veces se repite una palabra en el texto, | |
# pero si queremos comparar textos (que lo dejo para más adelante) | |
# es mejor conocer las frecuencias relativas de cada palabra. | |
# Para ello, realizamos una sencilla operación, dividiendo cada palabra | |
# por la suma de las frecuencias de la tabla. | |
# Frecuencias relativas de cada palabra | |
sorted.horror.rel.freq.t <- 100*(sorted.horror.freq.t/sum(sorted.horror.freq.t)) | |
sorted.horror.rel.freq.t[1:5] | |
# Y realizamos el plot correspondiente para ver el resultado con las 10 con mayor porcentaje: | |
# Plot frecuencias relativas | |
plot(sorted.horror.rel.freq.t[1:10], type="b", xlab="Palabras más utilizadas", | |
ylab="Porcentaje sobre el total del texto", xaxt="n", main = "The Dunwich Horror") | |
axis(1,1:10, labels = names(sorted.horror.rel.freq.t[1:10])) | |
# Fin |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment