#INTRODUCCION
El trabajo está realizado en dos partes, porque he utilizado dos fuentes diferentes de texto. En una primera parte he utilizado los libros de HG Wells The Time Machine y The Invisible man de la libreria de R gutenbergr, y en la segunda parte, he bajado un articulo cientifico: Exercise training in heart failure: from theory to practice. A consensus document of the Heart Failure Association and the European Association for Cardiovascular Prevention and Rehabilitation, desde la pagina web en formato Html, para realizar el Word cloud y un analisis de las palabras mas frecuentes. Vamos a ello!!
##ANALISIS DE LIBROS DE LA LIBRERIA GUTENBERG
En primer lugar cargamos las librerias que vamos a necesitar
Escogemos los libros mencionados en la introduccion y comprobamos clase y variables que contienen:
hgwells<- gutenberg_download(c(36, 5230))
class(hgwells)
names(hgwells)
Empezamos a utilizar la libreria tidytest pars iniciar el analisis de los libros
tidy_hgwells <- hgwells %>%
unnest_tokens(word, text) %>%
anti_join(stop_words)
#Averiguamos la clase y el objeto del documento descargado
class(tidy_hgwells)
names(tidy_hgwells)
En este momento, podemos realizar un recuento de las palabras que se repiten mas frecuentemente (más de 100 veces) en ambos libros, y dibujamos un gráfico con las mismas
tidy_hgwells %>%
count(word, sort = TRUE) %>%
filter(n > 100) %>%
mutate(word = reorder(word, n)) %>%
ggplot(aes(word, n)) +
geom_col() +
xlab(NULL) +
coord_flip()
Observamos que las palabras que más se repiten en ambos libros son entre otras kemp, door, people, invisible, etc hasta 22 palabras que se repiten mas de 100 veces.
Ahora, sabiendo que ambos libros son del mismo autor, podriamos ver si estas palabras utilizadas en un libro y el otro guardan algun tipo de relación con la frecuencia con que el autor las utiliza.
Para ello vamos a desagregar los dos libros para construir dos objetos data.frames diferentes
hgwells1<- gutenberg_download(c(36))
hgwells2<- gutenberg_download(c(5230))
tidy_hgwells1 <- hgwells1 %>%
unnest_tokens(word, text) %>%
anti_join(stop_words)
tidy_hgwells2 <- hgwells2 %>%
unnest_tokens(word, text) %>%
anti_join(stop_words)
#Realizamos un recuento inicial de palabras en cada uno de los libros
tidy_hgwells1 %>%
count(word, sort = TRUE)
tidy_hgwells2 %>%
count(word, sort = TRUE)
A priori no se ven parecidos entre unas palabra y otras, por lo que construimos un grafico para visualizarlo mejor
#Construimos un nuevo objeto, que llamamos frequency, donde juntamos las filas de tidy_hgwells 1 y 2
frequency <- bind_rows(mutate(tidy_hgwells1, Title = "The Time Machine"),
mutate(tidy_hgwells2, Title = "The invisible Man")) %>%
mutate(word = str_extract(word, "[a-z']+")) %>%
count(Title, word) %>%
group_by(Title) %>%
mutate(proportion = n / sum(n)) %>%
select(-n) %>%
spread(Title, proportion) %>%
gather(Title, proportion, `The Time Machine`)
Ahora realizamos el grafico de relacion entre un las palabras de un libro y otro
ggplot(frequency, aes(x = proportion, y = `The invisible Man`, color = abs(`The invisible Man` - proportion))) +
geom_abline(color = "gray40", lty = 2) +
geom_jitter(alpha = 0.1, size = 2.5, width = 0.3, height = 0.3) +
geom_text(aes(label = word), check_overlap = TRUE, vjust = 1.5) +
scale_x_log10(labels = percent_format()) +
scale_y_log10(labels = percent_format()) +
scale_color_gradient(limits = c(0, 0.001), low = "darkslategray4", high = "gray75") +
facet_wrap(~Title, ncol = 2) +
theme(legend.position="none") +
labs(y = "The invisible Man", x = NULL)
Como se puede observar en el gráfico resultante existe bastante dispersion con las palabras de ambos libros. Algunas como eyes, found ran, chapter o half se repiten frecuentemente en ambos libros.
##ANALISIS DE UN ARTICULO CIENTIFICO
La segunda parte del trabajo la centramos en la realización de un word cloud y de un recuento de palabras mas frecuentes a partir de un articulo publicado en una revista European Journal of Hear Failure a partir del formato html de la pagina, ya que el pdf es de dificil lectura.
En primer lugar obtenemos el archivo html
#Extraemos el documento en HTML
num<-017
fname<-function(num){return(sprintf("hfr017", num))}
baseurl<-"https://onlinelibrary.wiley.com/doi/full/10.1093/eurjhf/"
#Descarga en html
url_1 <- paste0(baseurl,fname(num))
html_urls <- c(url_1, "https://onlinelibrary.wiley.com/doi/full/10.1093/eurjhf/hfr017")
art_html <- lapply(url_1, function(x) read_html(x) %>% html_text())
#Miro que clase tiene este archivo y compruebo que es de tipo list
class(art_html)
A partir de aqui construyo un data.frame para poder trabajar con la libreria tm
letters <- do.call(rbind, Map(data.frame, text=c(art_html)))
letters$text <- as.character(letters$text)
Y en este momento, comienzo mediante la lbreria tm a realizar alguna tarea de reconocimiento del texto.
articulo <- letters %>%
unnest_tokens(word, text) %>%
anti_join(stop_words)
Miro las palabras mas frecuentes, las repetidas mas de 50 veces y las dibujo
articulo %>%
count(word, sort = TRUE) %>%
filter(n > 50) %>%
mutate(word = reorder(word, n)) %>%
ggplot(aes(word, n)) +
geom_col() +
xlab(NULL) +
coord_flip()
Vemos que muchas palabras frecuentes estan contenidas en el titulo. Tambien vemos que algunas de esas palabras son numeros por lo que realizamos alguna tarea de limpieza del texto
#Retiramos caracteres especiales
articulo <- gsub("\a|\t", "", articulo)
Ahora calculamos el corpus, y continuamos con labores de limpieza
corpus_articulo <- Corpus(VectorSource(articulo),readerControl = list(language="en"))
#Volvemos a limpiar sobre el corpus:
# Paso a minúsculas
corpus_articulo_clean <- tm_map(corpus_articulo,tolower)
# Quito números
corpus_articulo_clean <- tm_map(corpus_articulo_clean, removeNumbers)
# Quito los símbolos de puntuación
corpus_articulo_clean <- tm_map(corpus_articulo_clean, removePunctuation)
# Quitamos los stopwords
corpus_articulo_clean <- tm_map(corpus_articulo_clean,removeWords, stopwords("en"))
# Espacios en blanco
corpus_articulo_clean <- tm_map(corpus_articulo_clean, stripWhitespace)
Ahora continuamos con la realizacion del word cloud sobre el texto que nos ha quedado
wordcloud(corpus_articulo_clean, min.freq = 10, random.order = FALSE,
colors = brewer.pal(8, "Set2"))
Para realizar un analisis de las palabras mas frecuentes creamos un documento matriz y despues un data.frame
tdm <- TermDocumentMatrix(corpus_articulo_clean)
#Lo convertimos en matriz
t <- as.matrix(tdm)
#Ordenamos la matriz
v <- sort(t[, 1], decreasing = TRUE)
#Y creamos el objeto como dataframe
tdm_matriz <- data.frame(word=names(v), freq=v)
Finalmente hacemos el analisis con las palabras mas frecuentes
#Encontramos los términos con una frecuencia superior a 4
findFreqTerms(tdm, 4)
Creamos un gráfico de barras y nos quedamos con los primeros 15 valores
{fig.align="center"}
barplot(tdm_matriz[1:15, ]$freq,
las = 2,
names.arg = tdm_matriz[1:15, ]$word,
col = "green",
main = "Palabras mas frecuentes",
ylab = "Apariciones palabras",
ylim = c(0, 200))
Podemos para finalizar, realizar un bigrama para observar las palabras que se unen con más frecuencia, del primero objeto (letters)
letters_bi<- letters %>%
unnest_tokens (bigram, text, token = "ngrams", n=2)
Se observa que las palabras mas frecuentemente unidas en las primeras filas se correponden con las del titulo y fragmentos de la edicion de la revista (heart failure_ejhf).