-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathAS-SHAPE-STORIES-NRC.R
More file actions
164 lines (146 loc) · 9.57 KB
/
Copy pathAS-SHAPE-STORIES-NRC.R
File metadata and controls
164 lines (146 loc) · 9.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#### Análisis de Sentimientos de Textos Literarios ####
# La formas de las historias #
# #
# Qué es la estilometría. R como lenguaje para analizar textos #
# Stylometry? R as a computer language to analyze texts #
# DH@MADRID SUMMER SCHOOL #
# 10 DE JULIO DE 2018 #
# #
# #
# #
# Basado en #
# Julia Silge: https://juliasilge.com/blog/if-i-loved-nlp-less/ #
# y #
# Danny Murillo Lanza: http://uvadoc.uva.es/handle/10324/25437 #
# #
# Revisado, reescrito y actualizado por #
# José Manuel Fradejas Rueda #
# julio 2018 #
# #
# USO #
# Esta versión permite analizar cualquier texto español. Lo considera en secciones de #
# 400 palabras, con lo que viene a equivaler a una página de una edición de bolsillo #
# algo muy variable). Utiliza el lexicón nrc tal y como lo ha implementado M.L. Jockers #
# en syuzhet 1.0.4 (diciembre 2017). Están en desarrollo las traducciones de los otros #
# diccionarios utilizados en syuzhet (bing, afinn y syuzhet). #
# Sustitúyase TITULO NOVELA en todos los literales en los que aparezca por el título #
# del texto que se esté analizando. #
# #
# Nota #
# La cantidad de validación del texto no es aún óptima dado que en el diccionario nrc #
# implentado en el paquete syuzhet no se tiene encuenta las palabras en plural ni en #
# femenino y los verbos, salvo que sean participios, aparecen en infinitivo. #
# Una manera de solventar este problema sería utlizando textos lematizados, o bien #
# incorporar todas las formas posibles al diccionario. #
# #
# Proyecto 7PartidasDigital "Edición crítica digital de las Siete Partidas de Alfonso X" #
# Proyecto financiado por el MINECO, referencia FFI2016-75014-P AEI-FEDER, EU #
# Universidad de Valladolid -- IP José Manuel Fradejas Rueda #
# https://7partidas.hypotheses.org/ #
# https://github.com/7PartidasDigital #
# Este material se distribuye con una licencia #
# MIT #
# v. 1.0.0 #
# Establece el directorio de trabajo
setwd("~/Desktop/R-LINHD-18")
# Cargar librerías
library(readr)
library(stringr)
library(syuzhet)
library(dplyr)
library(reshape2)
library(ggplot2)
# Lee el texto.
# Usaremos Los cuatro jinetes del Apocalipsis de V. Blasco Ibáñez, pero tienes otros dos textos más
# para probar: Trafalgar de B.Pérez Galdós, y los Pazos de Ulloa de E. Pardo Bazán
texto_entrada <- readLines("cuatro_jinetes_apocalipsis.txt") # Pon el nombre del fichero adecuado
texto_unido <- paste(texto_entrada, collapse = " ") # Funde el texto e una sola cadena
texto_palabras <- unlist(strsplit(texto_unido, " ")) # Lo divide en palabras
long_maxima <- length(texto_palabras)/400 # Establece el número de páginas en que lo debe dividir
x <- seq_along(texto_palabras)
texto_paginas <- split(texto_palabras, ceiling(x/long_maxima))
# Crea las páginas
texto_paginas <- lapply(texto_paginas, function(x) paste(x, collapse = " "))
# Convierte el texto a minúsculas
texto_paginas <- tolower(as.character(unlist(texto_paginas)))
# Calcula el sentimiento
texto_nrc <- cbind(NumPag = seq_along(texto_paginas), get_nrc_sentiment(texto_paginas, language = "spanish"))
# cambia el nombre de las columnas para que sean fácilmente comprensibles
colnames(texto_nrc) <- c("NumPag","ira", "expectación","disgusto","miedo","alegría","tristeza","sorpresa","confianza","negativo","positivo")
# Convierte a números negativos la columna negativa
texto_nrc$negativo <- -texto_nrc$negativo
# Toma las columna numero de línea, positiva y negativa y crea una nueva
# tabla de tres columnas en las que los positivos y negativos están en una
# misma columna, pero guarda de donde procede cada positivo y negativo
pos_neg <- texto_nrc %>% select(NumPag, positivo, negativo) %>%
melt(id = c("NumPag"))
# renombra las columnas
names(pos_neg) <- c("NumPag", "sentimiento", "valor")
# Desde aquí dibuja varios gráficos
# Primer gráfico
# Cámbiese el literal de la línea 93 por el título adecuado
ggplot(data = pos_neg, aes(x = NumPag, y = valor, color = sentimiento)) +
geom_point(size = 4, alpha = 0.5) + theme_minimal() +
ylab("Sentimento") +
ggtitle(expression(paste("Sentimiento positivo y negativo en ",
italic("Los cuatro jinetes del Apocalipsis")))) +
theme(legend.title=element_blank()) +
theme(axis.title.x=element_blank()) +
theme(axis.ticks.x=element_blank()) +
theme(axis.text.x=element_blank()) +
theme(legend.justification=c(7,0), legend.position=c(1, -0.05)) +
scale_color_manual(values = c("aquamarine3", "midnightblue"))
# Segundo gráfico
# Cámbiese el literal de la línea 108 por el título adecuado
ggplot(data = pos_neg, aes(x = NumPag, y = valor, color = sentimiento, fill = sentimiento)) +
geom_bar(stat = "identity", position = "dodge") + theme_minimal() +
ylab("Sentimiento") +
ggtitle(expression(paste("Sentimiento positivo y negativo en ",
italic("Los cuatro jinetes del Apocalipsis")))) +
theme(legend.title=element_blank()) +
theme(axis.title.x=element_blank()) +
theme(axis.ticks.x=element_blank()) +
theme(axis.text.x=element_blank()) +
theme(legend.justification=c(6.98,0), legend.position=c(1, -0.05)) +
scale_fill_manual(values = c("aquamarine3", "midnightblue")) +
scale_color_manual(values = c("aquamarine3", "midnightblue"))
# Finalizan los dos primeros gráficos
# Recalcula el sentimiento para abordar otros gráficos más interesantes
texto_nrc <- data.frame(cbind(NumPag = seq_along(texto_paginas),
sentimiento = get_sentiment(texto_paginas, method = "nrc", language = "spanish")))
# Tercer gráfico
### Cámbiese el literal de la línea 129 por el título adecuado
ggplot(data = texto_nrc, aes(x = NumPag, y = sentimiento)) +
geom_bar(stat = "identity", position = "dodge", color = "midnightblue") +
theme_minimal() +
ylab("Sentimiento") +
ggtitle(expression(paste("Sentimiento en ", italic("Los cuatro jinetes del Apocalipsis")))) +
theme(axis.title.x=element_blank()) +
theme(axis.ticks.x=element_blank()) +
theme(axis.text.x=element_blank()) +
theme(legend.justification=c(0.91,0), legend.position=c(1, 0))
# Cuarto gráfico
# Aplica una fórmula de transformación diseñada por Jockers.
# Producirá un Warning. No pasa nada, es un aviso de que
# hay una fórmula mejor y que es la que se debería utilizar.
# Para nuestros propósitos es suficiente.
texto_ft <- as.numeric(get_transformed_values(texto_nrc$sentimiento,
low_pass_size = 3,
scale_vals = TRUE,
scale_range = FALSE))
texto_ft <- data.frame(cbind(NumPag = seq_along(texto_ft), ft = texto_ft))
# Cuarto gráfico
# Cámbiese el literal de las líneas 157 y 159 por el título adecuado
# Si se quita geom_bar y theme_minimal, solo imprime la línea suavizada, lo que
# se logra anteponiendo una almohadilla a dichas líneas.
# Si se borran las almohadilla de las líneas 158-162 el aspecto del gráfico cambia
ggplot(data = texto_ft, aes(x = NumPag, y = ft)) +
geom_bar(stat = "identity", alpha = 0.8, color = "aquamarine3", fill = "aquamarine3") +
theme_minimal() +
labs(title ="Forma de la historia en Los cuatro jinetes del Apocalipsis", subtitle="NRC", x = "Tiempo narrativo", y = "Transformación Valorada del Sentimiento") +
#ylab("Transformación Valorada del Sentimiento") +
#ggtitle(expression(paste("Sentimientos en ", italic("Los cuatro jinetes del Apocalipsis")))) +
#theme(axis.title.x=element_blank()) +
#theme(axis.ticks.x=element_blank()) +
#theme(axis.text.x=element_blank()) +
geom_smooth(se=FALSE) # se=FALSE borra lo gris del smooth