Contexto

El análisis de sentimientos, o minería de opinión, es utilizado para extraer de forma automática información sobre la connotación positiva o negativa del lenguaje de un documento.

El análisis mostrará el resultado en 8 emociones básicas y 2 sentimientos:

Emociones básicas: 1. Alegría (joy) 2. Tristeza (sadness) 3. Ira (anger) 4. Sorpresa (surprise) 5. Asco (disgust) 6. Miedo (fear) 7. Anticipación (anticipation) 8. Confianza (trust) Sentimientos: 1. Positivo (positive) 2. Negativo (negative)

Llamar librerias

library(syuzhet)

Cargar texto

texto_cadena <- scan(file = "https://raw.githubusercontent.com/programminghistorian/jekyll/gh-pages/assets/galdos_miau.txt", fileEncoding = "UTF-8", what = character(), sep = "\n", allowEscapes = T)

Tokenizar texto (dividir un texto de palabras)

texto_palabras <- get_tokens(texto_cadena)

Explorar texto

head(texto_palabras)
## [1] "miau"   "por"    "b"      "pérez"  "galdós" "14"
length(texto_palabras)
## [1] 97254
oraciones_vector  <- get_sentences(texto_cadena)
length(oraciones_vector)
## [1] 13136

Realizar el análisis de sentimientos

sentimientos_df <- get_nrc_sentiment(texto_palabras, language = "spanish")
# Idiomas disponibles: inglés, frances, italiano, alemán, portugués, español.
summary(sentimientos_df)
##      anger          anticipation        disgust             fear        
##  Min.   :0.00000   Min.   :0.00000   Min.   :0.00000   Min.   :0.00000  
##  1st Qu.:0.00000   1st Qu.:0.00000   1st Qu.:0.00000   1st Qu.:0.00000  
##  Median :0.00000   Median :0.00000   Median :0.00000   Median :0.00000  
##  Mean   :0.01596   Mean   :0.02114   Mean   :0.01263   Mean   :0.02243  
##  3rd Qu.:0.00000   3rd Qu.:0.00000   3rd Qu.:0.00000   3rd Qu.:0.00000  
##  Max.   :5.00000   Max.   :3.00000   Max.   :6.00000   Max.   :5.00000  
##       joy             sadness           surprise           trust        
##  Min.   :0.00000   Min.   :0.00000   Min.   :0.00000   Min.   :0.00000  
##  1st Qu.:0.00000   1st Qu.:0.00000   1st Qu.:0.00000   1st Qu.:0.00000  
##  Median :0.00000   Median :0.00000   Median :0.00000   Median :0.00000  
##  Mean   :0.01929   Mean   :0.02564   Mean   :0.01035   Mean   :0.03004  
##  3rd Qu.:0.00000   3rd Qu.:0.00000   3rd Qu.:0.00000   3rd Qu.:0.00000  
##  Max.   :5.00000   Max.   :7.00000   Max.   :2.00000   Max.   :3.00000  
##     negative          positive      
##  Min.   :0.00000   Min.   :0.00000  
##  1st Qu.:0.00000   1st Qu.:0.00000  
##  Median :0.00000   Median :0.00000  
##  Mean   :0.04658   Mean   :0.05153  
##  3rd Qu.:0.00000   3rd Qu.:0.00000  
##  Max.   :7.00000   Max.   :5.00000
head(sentimientos_df)
##   anger anticipation disgust fear joy sadness surprise trust negative positive
## 1     0            0       0    0   0       0        0     0        0        0
## 2     0            0       0    0   0       0        0     0        0        0
## 3     0            0       0    0   0       0        0     0        0        0
## 4     0            0       0    0   0       0        0     0        0        0
## 5     0            0       0    0   0       0        0     0        0        0
## 6     0            0       0    0   0       0        0     0        0        0

Graficar resultados

library(RColorBrewer)
barplot(
  colSums(prop.table(sentimientos_df[,1:8])),
  space = 0.2,
  horiz = FALSE,
  las = 1,
  cex.names = 0.7,
  col = brewer.pal(n=8, name="Set3"),
  main = "Análisis de Sentimientos de la Novela Miau",
  xlab = "Emociones")

Profundizar análisis de emociones

palabras_confianza  <- texto_palabras[sentimientos_df$trust >0]
palabras_confianza_orden <- sort(table(unlist(palabras_confianza)), decreasing = TRUE)
head(palabras_confianza_orden, n=10)
## 
##    dios   amigo   padre  abuelo   hecho  puerta  verdad   bueno palabra iglesia 
##     142      97      77      69      56      53      51      41      41      37

Graficar resultados

secuencia_sentimientos <- (sentimientos_df$negative*-1) + (sentimientos_df$positive)
simple_plot(secuencia_sentimientos)

LS0tCnRpdGxlOiAnQW5hbGlzaXMgZGUgU2VudGltaWVudG9zIE5vdmVsYSBNaWF1JwphdXRob3I6ICJBbmRyZWEgU8OhbmNoZXoiCmRhdGU6ICIyMDIzLTA5LTI1IgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogVFJVRQogICAgdG9jX2Zsb2F0OiBUUlVFCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFCiAgICB0aGVtZTogImNlcnVsZWFuIgogICAgaGlnaGxpZ2h0OiAibW9ub2Nocm9tZSIKZWRpdG9yX29wdGlvbnM6IAogIGNodW5rX291dHB1dF90eXBlOiBjb25zb2xlCi0tLQoKIVtdKC9Vc2Vycy9hbmRyZWFzYW5jaGV6Z29tZXovRG9jdW1lbnRzL1Ivbm92ZWxhLmdpZikKCiMjIyBDb250ZXh0bwpFbCBhbsOhbGlzaXMgZGUgc2VudGltaWVudG9zLCBvIG1pbmVyw61hIGRlIG9waW5pw7NuLCBlcyB1dGlsaXphZG8gcGFyYSBleHRyYWVyIGRlIGZvcm1hIGF1dG9tw6F0aWNhIGluZm9ybWFjacOzbiBzb2JyZSBsYSBjb25ub3RhY2nDs24gcG9zaXRpdmEgbyBuZWdhdGl2YSBkZWwgbGVuZ3VhamUgZGUgdW4gZG9jdW1lbnRvLgoKRWwgYW7DoWxpc2lzIG1vc3RyYXLDoSBlbCByZXN1bHRhZG8gZW4gOCBlbW9jaW9uZXMgYsOhc2ljYXMgeSAyIHNlbnRpbWllbnRvczoKCkVtb2Npb25lcyBiw6FzaWNhczoKMS4gQWxlZ3LDrWEgKGpveSkKMi4gVHJpc3RlemEgKHNhZG5lc3MpCjMuIElyYSAoYW5nZXIpCjQuIFNvcnByZXNhIChzdXJwcmlzZSkKNS4gQXNjbyAoZGlzZ3VzdCkKNi4gTWllZG8gKGZlYXIpCjcuIEFudGljaXBhY2nDs24gKGFudGljaXBhdGlvbikKOC4gQ29uZmlhbnphICh0cnVzdCkKU2VudGltaWVudG9zOgoxLiBQb3NpdGl2byAocG9zaXRpdmUpCjIuIE5lZ2F0aXZvIChuZWdhdGl2ZSkKCiMjIyBMbGFtYXIgbGlicmVyaWFzCmBgYHtyfQpsaWJyYXJ5KHN5dXpoZXQpCmBgYAoKIyMjIENhcmdhciB0ZXh0bwpgYGB7cn0KdGV4dG9fY2FkZW5hIDwtIHNjYW4oZmlsZSA9ICJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcHJvZ3JhbW1pbmdoaXN0b3JpYW4vamVreWxsL2doLXBhZ2VzL2Fzc2V0cy9nYWxkb3NfbWlhdS50eHQiLCBmaWxlRW5jb2RpbmcgPSAiVVRGLTgiLCB3aGF0ID0gY2hhcmFjdGVyKCksIHNlcCA9ICJcbiIsIGFsbG93RXNjYXBlcyA9IFQpCmBgYAoKIyMjIFRva2VuaXphciB0ZXh0byAoZGl2aWRpciB1biB0ZXh0byBkZSBwYWxhYnJhcykKYGBge3J9CnRleHRvX3BhbGFicmFzIDwtIGdldF90b2tlbnModGV4dG9fY2FkZW5hKQpgYGAKCiMjIyBFeHBsb3JhciB0ZXh0bwpgYGB7cn0KaGVhZCh0ZXh0b19wYWxhYnJhcykKbGVuZ3RoKHRleHRvX3BhbGFicmFzKQpvcmFjaW9uZXNfdmVjdG9yICA8LSBnZXRfc2VudGVuY2VzKHRleHRvX2NhZGVuYSkKbGVuZ3RoKG9yYWNpb25lc192ZWN0b3IpCmBgYAoKIyMjIFJlYWxpemFyIGVsIGFuw6FsaXNpcyBkZSBzZW50aW1pZW50b3MKYGBge3J9CnNlbnRpbWllbnRvc19kZiA8LSBnZXRfbnJjX3NlbnRpbWVudCh0ZXh0b19wYWxhYnJhcywgbGFuZ3VhZ2UgPSAic3BhbmlzaCIpCiMgSWRpb21hcyBkaXNwb25pYmxlczogaW5nbMOpcywgZnJhbmNlcywgaXRhbGlhbm8sIGFsZW3DoW4sIHBvcnR1Z3XDqXMsIGVzcGHDsW9sLgpzdW1tYXJ5KHNlbnRpbWllbnRvc19kZikKaGVhZChzZW50aW1pZW50b3NfZGYpCmBgYAoKIyMjIEdyYWZpY2FyIHJlc3VsdGFkb3MKYGBge3J9CmxpYnJhcnkoUkNvbG9yQnJld2VyKQpiYXJwbG90KAogIGNvbFN1bXMocHJvcC50YWJsZShzZW50aW1pZW50b3NfZGZbLDE6OF0pKSwKICBzcGFjZSA9IDAuMiwKICBob3JpeiA9IEZBTFNFLAogIGxhcyA9IDEsCiAgY2V4Lm5hbWVzID0gMC43LAogIGNvbCA9IGJyZXdlci5wYWwobj04LCBuYW1lPSJTZXQzIiksCiAgbWFpbiA9ICJBbsOhbGlzaXMgZGUgU2VudGltaWVudG9zIGRlIGxhIE5vdmVsYSBNaWF1IiwKICB4bGFiID0gIkVtb2Npb25lcyIpCmBgYAoKIyMjIFByb2Z1bmRpemFyIGFuw6FsaXNpcyBkZSBlbW9jaW9uZXMKYGBge3J9CnBhbGFicmFzX2NvbmZpYW56YSAgPC0gdGV4dG9fcGFsYWJyYXNbc2VudGltaWVudG9zX2RmJHRydXN0ID4wXQpwYWxhYnJhc19jb25maWFuemFfb3JkZW4gPC0gc29ydCh0YWJsZSh1bmxpc3QocGFsYWJyYXNfY29uZmlhbnphKSksIGRlY3JlYXNpbmcgPSBUUlVFKQpoZWFkKHBhbGFicmFzX2NvbmZpYW56YV9vcmRlbiwgbj0xMCkKYGBgCgojIyMgR3JhZmljYXIgcmVzdWx0YWRvcwpgYGB7cn0Kc2VjdWVuY2lhX3NlbnRpbWllbnRvcyA8LSAoc2VudGltaWVudG9zX2RmJG5lZ2F0aXZlKi0xKSArIChzZW50aW1pZW50b3NfZGYkcG9zaXRpdmUpCnNpbXBsZV9wbG90KHNlY3VlbmNpYV9zZW50aW1pZW50b3MpCmBgYAo=