Skip to content

Instantly share code, notes, and snippets.

@rubentr
Created December 3, 2016 19:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rubentr/59003db7a3afea38fdb23584f83045c2 to your computer and use it in GitHub Desktop.
Save rubentr/59003db7a3afea38fdb23584f83045c2 to your computer and use it in GitHub Desktop.
###
# 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