Análisis de sentimientos

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)

Análisis de sentimientos Novela Miau

Llamar librerías y cargar texto

library(syuzhet)

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)

Exploración de 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

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 resultado de emociones

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 de sentimientos

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

Ejercicio Himno

Cargar texto

# Ruta del archivo de texto
ruta_archivo <- "C:\\Users\\karim\\OneDrive\\Escritorio\\Ejercicios R\\app2 e incidencia de emociones\\himno_nacional.txt"

# Leer el archivo de texto
himno <- readLines(ruta_archivo)
## Warning in readLines(ruta_archivo): incomplete final line found on
## 'C:\Users\karim\OneDrive\Escritorio\Ejercicios R\app2 e incidencia de
## emociones\himno_nacional.txt'

Tokenizar texto

texto_palabras <- get_tokens(himno)

Explorar texto

head(texto_palabras)
## [1] "mexicanos" "al"        "grito"     "de"        "guerra"    "el"
length(texto_palabras)
## [1] 506
oraciones_vector  <- get_sentences(himno)
length(oraciones_vector)
## [1] 112

Realizar 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)
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     2            0       0    1   0       1        2     0        2        0
## 4     0            0       0    0   0       0        0     0        0        0
## 5     1            0       0    2   0       1        0     0        2        0
## 6     0            0       0    0   0       0        0     0        0        0

Graficar resultados de emociones

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 del Himno Nacional",
  xlab = "Emociones"
)

Profundizar análisis de emociones

palabras_miedo  <- texto_palabras[sentimientos_df$fear >0]
palabras_miedo_orden <- sort(table(unlist(palabras_miedo)), decreasing = TRUE)
head(palabras_miedo_orden, n=10)
## 
##    guerra    sangre     golpe  guerrero  metralla   destino      dios   enemigo 
##         8         4         2         2         2         1         1         1 
##     grito impotente 
##         1         1

Graficar resultados de sentimientos

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

LS0tDQp0aXRsZTogIkFuw6FsaXNpcyBkZSBTZW50aW1pZW50b3MgYWN0Ig0KYXV0aG9yOiAiTGVpc2x5IENydXoiDQpkYXRlOiAiMjUtMTAtMjAyMyINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiBUUlVFDQogICAgdG9jX2Zsb2F0OiBUUlVFDQogICAgdG9jX2RlcHRoOiA0DQogICAgY29kZV9kb3dubG9hZDogVFJVRQ0KICAgIHRoZW1lOiAiZmxhdGx5Ig0KICAgIGhpZ2hsaWdodDogImVzcHJlc3NvIg0KZWRpdG9yX29wdGlvbnM6IA0KICBjaHVua19vdXRwdXRfdHlwZTogY29uc29sZQ0KLS0tDQohW10oQzpcXFVzZXJzXFxrYXJpbVxcT25lRHJpdmVcXFBpY3R1cmVzXFxzZW50aW1pZW50b3MuZ2lmKQ0KDQojIEFuw6FsaXNpcyBkZSBzZW50aW1pZW50b3MNCkVsIGFuw6FsaXNpcyBkZSBzZW50aW1pZW50b3MsIG8gbWluZXLDrWEgZGUgb3BpbmnDs24sIGVzIHV0aWxpemFkbyBwYXJhIGV4dHJhZXIgZGUgZm9ybWEgYXV0b23DoXRpY2EgaW5mb3JtYWNpw7NuIHNvYnJlIGxhIGNvbm5vdGFjacOzbiBwb3NpdGl2YSBvIG5lZ2F0aXZhIGRlbCBsZW5ndWFqZSBkZSB1biBkb2N1bWVudG8uDQoNCkVsIGFuw6FsaXNpcyBtb3N0cmFyw6EgZWwgcmVzdWx0YWRvIGVuIDggZW1vY2lvbmVzIGLDoXNpY2FzIHkgMiBzZW50aW1pZW50b3M6DQoNCkVtb2Npb25lcyBiw6FzaWNhczoNCjEuIEFsZWdyw61hIChqb3kpDQoyLiBUcmlzdGV6YSAoc2FkbmVzcykNCjMuIElyYSAoYW5nZXIpDQo0LiBTb3JwcmVzYSAoc3VycHJpc2UpDQo1LiBBc2NvIChkaXNndXN0KQ0KNi4gTWllZG8gKGZlYXIpDQo3LiBBbnRpY2lwYWNpw7NuIChhbnRpY2lwYXRpb24pDQo4LiBDb25maWFuemEgKHRydXN0KQ0KU2VudGltaWVudG9zOg0KMS4gUG9zaXRpdm8gKHBvc2l0aXZlKQ0KMi4gTmVnYXRpdm8gKG5lZ2F0aXZlKQ0KDQojIyBBbsOhbGlzaXMgZGUgc2VudGltaWVudG9zIE5vdmVsYSBNaWF1DQoNCiMjIyBMbGFtYXIgbGlicmVyw61hcyB5IGNhcmdhciB0ZXh0bw0KDQpgYGB7cn0NCmxpYnJhcnkoc3l1emhldCkNCg0KdGV4dG9fY2FkZW5hIDwtIHNjYW4oZmlsZSA9ICJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcHJvZ3JhbW1pbmdoaXN0b3JpYW4vamVreWxsL2doLXBhZ2VzL2Fzc2V0cy9nYWxkb3NfbWlhdS50eHQiLCBmaWxlRW5jb2RpbmcgPSAiVVRGLTgiLCB3aGF0ID0gY2hhcmFjdGVyKCksIHNlcCA9ICJcbiIsIGFsbG93RXNjYXBlcyA9IFQpDQpgYGANCg0KDQojIyMgVG9rZW5pemFyIHRleHRvIChEaXZpZGlyIHVuIHRleHRvIGRlIHBhbGFicmFzKQ0KYGBge3J9DQp0ZXh0b19wYWxhYnJhcyA8LSBnZXRfdG9rZW5zKHRleHRvX2NhZGVuYSkNCmBgYA0KDQojIyMgRXhwbG9yYWNpw7NuIGRlIHRleHRvDQpgYGB7cn0NCmhlYWQodGV4dG9fcGFsYWJyYXMpDQpsZW5ndGgodGV4dG9fcGFsYWJyYXMpDQpvcmFjaW9uZXNfdmVjdG9yICA8LSBnZXRfc2VudGVuY2VzKHRleHRvX2NhZGVuYSkNCmxlbmd0aChvcmFjaW9uZXNfdmVjdG9yKQ0KYGBgDQoNCiMjIyBBbsOhbGlzaXMgZGUgc2VudGltaWVudG9zDQpgYGB7cn0NCnNlbnRpbWllbnRvc19kZiA8LSBnZXRfbnJjX3NlbnRpbWVudCh0ZXh0b19wYWxhYnJhcywgbGFuZ3VhZ2UgPSAic3BhbmlzaCIpDQojIElkaW9tYXMgZGlzcG9uaWJsZXM6IGluZ2zDqXMsIGZyYW5jZXMsIGl0YWxpYW5vLCBhbGVtw6FuLCBwb3J0dWd1w6lzLCBlc3Bhw7FvbC4NCnN1bW1hcnkoc2VudGltaWVudG9zX2RmKQ0KaGVhZChzZW50aW1pZW50b3NfZGYpDQpgYGANCg0KIyMjIEdyYWZpY2FyIHJlc3VsdGFkbyBkZSBlbW9jaW9uZXMNCmBgYHtyfQ0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQpiYXJwbG90KA0KICBjb2xTdW1zKHByb3AudGFibGUoc2VudGltaWVudG9zX2RmWywxOjhdKSksDQogIHNwYWNlID0gMC4yLA0KICBob3JpeiA9IEZBTFNFLA0KICBsYXMgPSAxLA0KICBjZXgubmFtZXMgPSAwLjcsDQogIGNvbCA9IGJyZXdlci5wYWwobj04LCBuYW1lPSJTZXQzIiksDQogIG1haW4gPSAiQW7DoWxpc2lzIGRlIFNlbnRpbWllbnRvcyBkZSBsYSBOb3ZlbGEgTWlhdSIsDQogIHhsYWIgPSAiRW1vY2lvbmVzIg0KKQ0KYGBgDQoNCiMjIyBQcm9mdW5kaXphciBhbsOhbGlzaXMgZGUgZW1vY2lvbmVzDQpgYGB7cn0NCnBhbGFicmFzX2NvbmZpYW56YSAgPC0gdGV4dG9fcGFsYWJyYXNbc2VudGltaWVudG9zX2RmJHRydXN0ID4wXQ0KcGFsYWJyYXNfY29uZmlhbnphX29yZGVuIDwtIHNvcnQodGFibGUodW5saXN0KHBhbGFicmFzX2NvbmZpYW56YSkpLCBkZWNyZWFzaW5nID0gVFJVRSkNCmhlYWQocGFsYWJyYXNfY29uZmlhbnphX29yZGVuLCBuPTEwKQ0KYGBgDQoNCiMjIyBHcmFmaWNhciByZXN1bHRhZG9zIGRlIHNlbnRpbWllbnRvcw0KYGBge3J9DQpzZWN1ZW5jaWFfc2VudGltaWVudG9zIDwtIChzZW50aW1pZW50b3NfZGYkbmVnYXRpdmUqLTEpICsgKHNlbnRpbWllbnRvc19kZiRwb3NpdGl2ZSkNCnNpbXBsZV9wbG90KHNlY3VlbmNpYV9zZW50aW1pZW50b3MpDQpgYGANCg0KDQojIyBFamVyY2ljaW8gSGltbm8NCg0KIyMjIENhcmdhciB0ZXh0bw0KYGBge3J9DQojIFJ1dGEgZGVsIGFyY2hpdm8gZGUgdGV4dG8NCnJ1dGFfYXJjaGl2byA8LSAiQzpcXFVzZXJzXFxrYXJpbVxcT25lRHJpdmVcXEVzY3JpdG9yaW9cXEVqZXJjaWNpb3MgUlxcYXBwMiBlIGluY2lkZW5jaWEgZGUgZW1vY2lvbmVzXFxoaW1ub19uYWNpb25hbC50eHQiDQoNCiMgTGVlciBlbCBhcmNoaXZvIGRlIHRleHRvDQpoaW1ubyA8LSByZWFkTGluZXMocnV0YV9hcmNoaXZvKQ0KYGBgDQoNCiMjIyBUb2tlbml6YXIgdGV4dG8NCmBgYHtyfQ0KdGV4dG9fcGFsYWJyYXMgPC0gZ2V0X3Rva2VucyhoaW1ubykNCmBgYA0KDQojIyMgRXhwbG9yYXIgdGV4dG8NCmBgYHtyfQ0KaGVhZCh0ZXh0b19wYWxhYnJhcykNCmxlbmd0aCh0ZXh0b19wYWxhYnJhcykNCm9yYWNpb25lc192ZWN0b3IgIDwtIGdldF9zZW50ZW5jZXMoaGltbm8pDQpsZW5ndGgob3JhY2lvbmVzX3ZlY3RvcikNCmBgYA0KDQojIyMgUmVhbGl6YXIgYW7DoWxpc2lzIGRlIHNlbnRpbWllbnRvcw0KYGBge3J9DQpzZW50aW1pZW50b3NfZGYgPC0gZ2V0X25yY19zZW50aW1lbnQodGV4dG9fcGFsYWJyYXMsIGxhbmd1YWdlID0gInNwYW5pc2giKQ0KIyBJZGlvbWFzIGRpc3BvbmlibGVzOiBpbmdsw6lzLCBmcmFuY2VzLCBpdGFsaWFubywgYWxlbcOhbiwgcG9ydHVndcOpcywgZXNwYcOxb2wuDQojIHN1bW1hcnkoc2VudGltaWVudG9zX2RmKQ0KaGVhZChzZW50aW1pZW50b3NfZGYpDQpgYGANCg0KIyMjIEdyYWZpY2FyIHJlc3VsdGFkb3MgZGUgZW1vY2lvbmVzDQpgYGB7cn0NCmJhcnBsb3QoDQogIGNvbFN1bXMocHJvcC50YWJsZShzZW50aW1pZW50b3NfZGZbLDE6OF0pKSwNCiAgc3BhY2UgPSAwLjIsDQogIGhvcml6ID0gRkFMU0UsDQogIGxhcyA9IDEsDQogIGNleC5uYW1lcyA9IDAuNywNCiAgY29sID0gYnJld2VyLnBhbChuPTgsIG5hbWU9IlNldDMiKSwNCiAgbWFpbiA9ICJBbsOhbGlzaXMgZGUgU2VudGltaWVudG9zIGRlbCBIaW1ubyBOYWNpb25hbCIsDQogIHhsYWIgPSAiRW1vY2lvbmVzIg0KKQ0KYGBgDQoNCiMjIyBQcm9mdW5kaXphciBhbsOhbGlzaXMgZGUgZW1vY2lvbmVzDQpgYGB7cn0NCnBhbGFicmFzX21pZWRvICA8LSB0ZXh0b19wYWxhYnJhc1tzZW50aW1pZW50b3NfZGYkZmVhciA+MF0NCnBhbGFicmFzX21pZWRvX29yZGVuIDwtIHNvcnQodGFibGUodW5saXN0KHBhbGFicmFzX21pZWRvKSksIGRlY3JlYXNpbmcgPSBUUlVFKQ0KaGVhZChwYWxhYnJhc19taWVkb19vcmRlbiwgbj0xMCkNCmBgYA0KDQojIyMgR3JhZmljYXIgcmVzdWx0YWRvcyBkZSBzZW50aW1pZW50b3MNCmBgYHtyfQ0Kc2VjdWVuY2lhX3NlbnRpbWllbnRvcyA8LSAoc2VudGltaWVudG9zX2RmJG5lZ2F0aXZlKi0xKSArIChzZW50aW1pZW50b3NfZGYkcG9zaXRpdmUpDQpzaW1wbGVfcGxvdChzZWN1ZW5jaWFfc2VudGltaWVudG9zKQ0KYGBgDQoNCg==