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 conotació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)

1. Instalar paquetes y llamar librerías

# install.packages("syuzhet")
library(syuzhet)

# install.packages("RColorBrewer")
library(RColorBrewer)

2. Cargar texto

texto_cadena <- read.delim("/Users/kristencarlos/Documents/Concentración Análisis Datos/El triste canción.txt", header=FALSE)

3. Tokenizar texto

texto_palabras <- get_tokens(texto_cadena)

4. Explorar texto

head(texto_palabras)
## [1] "c"        "qué"      "triste"   "fue"      "decirnos" "adiós"
length(texto_palabras)
## [1] 183

5. Realizar Análisis de Sentimientos

sentimientos_df <- get_nrc_sentiment(texto_palabras, language = "spanish")

# Idiomas disponibles: spanish, english, french, german, italian, portuguese, etc.

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     1            0       1    2   0       5        0     0        5        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
summary(sentimientos_df)
##      anger          anticipation    disgust             fear       
##  Min.   :0.00000   Min.   :0     Min.   :0.00000   Min.   :0.0000  
##  1st Qu.:0.00000   1st Qu.:0     1st Qu.:0.00000   1st Qu.:0.0000  
##  Median :0.00000   Median :0     Median :0.00000   Median :0.0000  
##  Mean   :0.02186   Mean   :0     Mean   :0.03825   Mean   :0.0765  
##  3rd Qu.:0.00000   3rd Qu.:0     3rd Qu.:0.00000   3rd Qu.:0.0000  
##  Max.   :1.00000   Max.   :0     Max.   :1.00000   Max.   :2.0000  
##       joy             sadness          surprise     trust      negative     
##  Min.   :0.00000   Min.   :0.0000   Min.   :0   Min.   :0   Min.   :0.0000  
##  1st Qu.:0.00000   1st Qu.:0.0000   1st Qu.:0   1st Qu.:0   1st Qu.:0.0000  
##  Median :0.00000   Median :0.0000   Median :0   Median :0   Median :0.0000  
##  Mean   :0.03279   Mean   :0.2077   Mean   :0   Mean   :0   Mean   :0.1967  
##  3rd Qu.:0.00000   3rd Qu.:0.0000   3rd Qu.:0   3rd Qu.:0   3rd Qu.:0.0000  
##  Max.   :1.00000   Max.   :7.0000   Max.   :0   Max.   :0   Max.   :7.0000  
##     positive      
##  Min.   :0.00000  
##  1st Qu.:0.00000  
##  Median :0.00000  
##  Mean   :0.04372  
##  3rd Qu.:0.00000  
##  Max.   :1.00000

6. 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 de la canción El Triste",
  xlab = "emociones"
)

7. Profundizar Análisis de Emociones

palabras_tristeza <- texto_palabras[sentimientos_df$sadness > 0]
palabras_tristeza_orden <- sort(table(unlist(palabras_tristeza)), decreasing = TRUE)
head(palabras_tristeza_orden, n= 10)
## 
##  triste   dolor    azul    gris soledad 
##       4       2       1       1       1

8. Graficar Resultados de Sentimientos

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

1. Instalar paquetes y llamar librerías

# install.packages("syuzhet")
library(syuzhet)

# install.packages("RColorBrewer")
library(RColorBrewer)

2. Cargar texto

texto_completo <- read.delim("/Users/kristencarlos/Documents/Concentración Análisis Datos/HimnoMexicano.txt", header=FALSE)

3. Tokenizar texto

texto_palabrasHimno <- get_tokens(texto_completo)

4. Explorar texto

head(texto_palabrasHimno)
## [1] "c"         "coro"      "mexicanos" "al"        "grito"     "de"
length(texto_palabrasHimno)
## [1] 255

5. Realizar Análisis de Sentimientos

sentimientos_Himno <- get_nrc_sentiment(texto_palabrasHimno, language = "spanish")

# Idiomas disponibles: spanish, english, french, german, italian, portuguese, etc.

head(sentimientos_Himno)
##   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   1       0        0     1        0        2
## 3     0            0       0    0   0       0        0     0        0        0
## 4     0            0       0    0   0       0        0     0        0        0
## 5     2            0       0    1   0       1        2     0        2        0
## 6     0            0       0    0   0       0        0     0        0        0
summary(sentimientos_Himno)
##      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.07059   Mean   :0.02745   Mean   :0.01961   Mean   :0.09804  
##  3rd Qu.:0.00000   3rd Qu.:0.00000   3rd Qu.:0.00000   3rd Qu.:0.00000  
##  Max.   :2.00000   Max.   :2.00000   Max.   :1.00000   Max.   :2.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.04706   Mean   :0.05882   Mean   :0.02353   Mean   :0.05098  
##  3rd Qu.:0.00000   3rd Qu.:0.00000   3rd Qu.:0.00000   3rd Qu.:0.00000  
##  Max.   :2.00000   Max.   :1.00000   Max.   :2.00000   Max.   :2.00000  
##     negative         positive     
##  Min.   :0.0000   Min.   :0.0000  
##  1st Qu.:0.0000   1st Qu.:0.0000  
##  Median :0.0000   Median :0.0000  
##  Mean   :0.1137   Mean   :0.1098  
##  3rd Qu.:0.0000   3rd Qu.:0.0000  
##  Max.   :2.0000   Max.   :2.0000

6. Graficar Resultados de Emociones

barplot(
  colSums(prop.table(sentimientos_Himno[,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 canción Himno Nacional Mexicano",
  xlab = "emociones"
)

7. Profundizar Análisis de Emociones

palabras_miedo <- texto_palabrasHimno[sentimientos_Himno$fear > 0]
palabras_miedo_orden <- sort(table(unlist(palabras_miedo)), decreasing = TRUE)
head(palabras_miedo_orden, n= 10)
## 
##  guerra  sangre   grito destino    dios enemigo 
##       8       3       2       1       1       1

8. Graficar Resultados de Sentimientos

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

LS0tCnRpdGxlOiAiQWN0aXZpZGFkIDQuNCIKYXV0aG9yOiAiS3Jpc3RlbiBDYXJsb3MgQTAxNTcwNzUzIgpkYXRlOiAiMjAyMy0wOS0yNSIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IFRSVUUKICAgIHRvY19mbG9hdDogVFJVRQogICAgY29kZV9kb3dubG9hZDogVFJVRQogICAgdGhlbWU6ICJ5ZXRpIgogICAgaGlnaGxpZ2h0OiAidGFuZ28iCi0tLQoKIVtdKC9Vc2Vycy9rcmlzdGVuY2FybG9zL0RvY3VtZW50cy9Db25jZW50cmFjaW/MgW4gQW5hzIFsaXNpcyBEYXRvcy9lbW9jaW9uZXNmb3RvLmpwZykKCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiBvcmFuZ2U7Ij4qKkFuw6FsaXNpcyBkZSBTZW50aW1pZW50b3MqKjwvc3Bhbj4KCkVsICoqYW7DoWxpc2lzIGRlIHNlbnRpbWllbnRvcyoqLCBvIG1pbmVyw61hIGRlIG9waW5pw7NuLCBlcyB1dGlsaXphZG8gcGFyYSBleHRyYWVyIGRlIGZvcm1hIGF1dG9tw6F0aWNhLCBpbmZvcm1hY2nDs24gc29icmUgbGEgY29ub3RhY2nDs24gcG9zaXRpdmEgbyBuZWdhdGl2YSBkZWwgbGVuZ3VhamUgZGUgdW4gZG9jdW1lbnRvLgoKRWwgYW7DoWxpc2lzIG1vc3RyYXLDoSBlbCByZXN1bHRhZG8gZW4gKjggZW1vY2lvbmVzIGLDoXNpY2FzIHkgMiBzZW50aW1pZW50b3MuKgoKRW1vY2lvbmVzIGLDoXNpY2FzOiAgCjEuIEFsZWdyw61hIChqb3kpICAKMi4gVHJpc3RlemEgKHNhZG5lc3MpICAKMy4gSXJhIChhbmdlcikgIAo0LiBTb3JwcmVzYSAoc3VycHJpc2UpICAgIAo1LiBBc2NvIChkaXNndXN0KSAgIAo2LiBNaWVkbyAoZmVhcikgICAKNy4gQW50aWNpcGFjacOzbiAoYW50aWNpcGF0aW9uKSAgICAKOC4gQ29uZmlhbnphICh0cnVzdCkgICAgCgpTZW50aW1pZW50b3M6ICAgCjEuIFBvc2l0aXZvIChwb3NpdGl2ZSkgICAgCjIuIE5lZ2F0aXZvIChuZWdhdGl2ZSkgICAgCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IG9yYW5nZTsiPjEuIEluc3RhbGFyIHBhcXVldGVzIHkgbGxhbWFyIGxpYnJlcsOtYXM8L3NwYW4+CgpgYGB7cn0KIyBpbnN0YWxsLnBhY2thZ2VzKCJzeXV6aGV0IikKbGlicmFyeShzeXV6aGV0KQoKIyBpbnN0YWxsLnBhY2thZ2VzKCJSQ29sb3JCcmV3ZXIiKQpsaWJyYXJ5KFJDb2xvckJyZXdlcikKYGBgCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IG9yYW5nZTsiPjIuIENhcmdhciB0ZXh0bzwvc3Bhbj4KCmBgYHtyfQp0ZXh0b19jYWRlbmEgPC0gcmVhZC5kZWxpbSgiL1VzZXJzL2tyaXN0ZW5jYXJsb3MvRG9jdW1lbnRzL0NvbmNlbnRyYWNpb8yBbiBBbmHMgWxpc2lzIERhdG9zL0VsIHRyaXN0ZSBjYW5jaW/MgW4udHh0IiwgaGVhZGVyPUZBTFNFKQpgYGAKCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogb3JhbmdlOyI+My4gVG9rZW5pemFyIHRleHRvPC9zcGFuPgoKYGBge3J9CnRleHRvX3BhbGFicmFzIDwtIGdldF90b2tlbnModGV4dG9fY2FkZW5hKQpgYGAKCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogb3JhbmdlOyI+NC4gRXhwbG9yYXIgdGV4dG88L3NwYW4+CgpgYGB7cn0KaGVhZCh0ZXh0b19wYWxhYnJhcykKbGVuZ3RoKHRleHRvX3BhbGFicmFzKQpgYGAKCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogb3JhbmdlOyI+NS4gUmVhbGl6YXIgQW7DoWxpc2lzIGRlIFNlbnRpbWllbnRvczwvc3Bhbj4KCmBgYHtyfQpzZW50aW1pZW50b3NfZGYgPC0gZ2V0X25yY19zZW50aW1lbnQodGV4dG9fcGFsYWJyYXMsIGxhbmd1YWdlID0gInNwYW5pc2giKQoKIyBJZGlvbWFzIGRpc3BvbmlibGVzOiBzcGFuaXNoLCBlbmdsaXNoLCBmcmVuY2gsIGdlcm1hbiwgaXRhbGlhbiwgcG9ydHVndWVzZSwgZXRjLgoKaGVhZChzZW50aW1pZW50b3NfZGYpCnN1bW1hcnkoc2VudGltaWVudG9zX2RmKQpgYGAKCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogb3JhbmdlOyI+Ni4gR3JhZmljYXIgUmVzdWx0YWRvcyBkZSBFbW9jaW9uZXM8L3NwYW4+CgpgYGB7cn0KYmFycGxvdCgKICBjb2xTdW1zKHByb3AudGFibGUoc2VudGltaWVudG9zX2RmWywxOjhdKSksCiAgc3BhY2UgPSAwLjIsCiAgaG9yaXogPSBGQUxTRSwKICBsYXMgPSAxLAogIGNleC5uYW1lcyA9IDAuNywKICBjb2wgPSBicmV3ZXIucGFsKG4gPSA4LCBuYW1lID0gIlNldDMiKSwKICBtYWluID0gIkFuw6FsaXNpcyBkZSBTZW50aW1pZW50b3MgZGUgbGEgY2FuY2nDs24gRWwgVHJpc3RlIiwKICB4bGFiID0gImVtb2Npb25lcyIKKQpgYGAKCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogb3JhbmdlOyI+Ny4gUHJvZnVuZGl6YXIgQW7DoWxpc2lzIGRlIEVtb2Npb25lczwvc3Bhbj4KCmBgYHtyfQpwYWxhYnJhc190cmlzdGV6YSA8LSB0ZXh0b19wYWxhYnJhc1tzZW50aW1pZW50b3NfZGYkc2FkbmVzcyA+IDBdCnBhbGFicmFzX3RyaXN0ZXphX29yZGVuIDwtIHNvcnQodGFibGUodW5saXN0KHBhbGFicmFzX3RyaXN0ZXphKSksIGRlY3JlYXNpbmcgPSBUUlVFKQpoZWFkKHBhbGFicmFzX3RyaXN0ZXphX29yZGVuLCBuPSAxMCkKYGBgCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IG9yYW5nZTsiPjguIEdyYWZpY2FyIFJlc3VsdGFkb3MgZGUgU2VudGltaWVudG9zPC9zcGFuPgoKYGBge3J9CnNlY3VlbmNpYV9zZW50aW1pZW50b3MgPC0gKHNlbnRpbWllbnRvc19kZiRuZWdhdGl2ZSotMSkgKyBzZW50aW1pZW50b3NfZGYkcG9zaXRpdmUKc2ltcGxlX3Bsb3Qoc2VjdWVuY2lhX3NlbnRpbWllbnRvcykKYGBgCgohW10oL1VzZXJzL2tyaXN0ZW5jYXJsb3MvRG9jdW1lbnRzL0NvbmNlbnRyYWNpb8yBbiBBbmHMgWxpc2lzIERhdG9zL2JhbmRlcmFtZXhpY28uanBnKQoKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBvcmFuZ2U7Ij4xLiBJbnN0YWxhciBwYXF1ZXRlcyB5IGxsYW1hciBsaWJyZXLDrWFzPC9zcGFuPgoKYGBge3J9CiMgaW5zdGFsbC5wYWNrYWdlcygic3l1emhldCIpCmxpYnJhcnkoc3l1emhldCkKCiMgaW5zdGFsbC5wYWNrYWdlcygiUkNvbG9yQnJld2VyIikKbGlicmFyeShSQ29sb3JCcmV3ZXIpCmBgYAoKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBvcmFuZ2U7Ij4yLiBDYXJnYXIgdGV4dG88L3NwYW4+CgpgYGB7cn0KdGV4dG9fY29tcGxldG8gPC0gcmVhZC5kZWxpbSgiL1VzZXJzL2tyaXN0ZW5jYXJsb3MvRG9jdW1lbnRzL0NvbmNlbnRyYWNpb8yBbiBBbmHMgWxpc2lzIERhdG9zL0hpbW5vTWV4aWNhbm8udHh0IiwgaGVhZGVyPUZBTFNFKQpgYGAKCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogb3JhbmdlOyI+My4gVG9rZW5pemFyIHRleHRvPC9zcGFuPgoKYGBge3J9CnRleHRvX3BhbGFicmFzSGltbm8gPC0gZ2V0X3Rva2Vucyh0ZXh0b19jb21wbGV0bykKYGBgCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IG9yYW5nZTsiPjQuIEV4cGxvcmFyIHRleHRvPC9zcGFuPgoKYGBge3J9CmhlYWQodGV4dG9fcGFsYWJyYXNIaW1ubykKbGVuZ3RoKHRleHRvX3BhbGFicmFzSGltbm8pCmBgYAoKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBvcmFuZ2U7Ij41LiBSZWFsaXphciBBbsOhbGlzaXMgZGUgU2VudGltaWVudG9zPC9zcGFuPgoKYGBge3J9CnNlbnRpbWllbnRvc19IaW1ubyA8LSBnZXRfbnJjX3NlbnRpbWVudCh0ZXh0b19wYWxhYnJhc0hpbW5vLCBsYW5ndWFnZSA9ICJzcGFuaXNoIikKCiMgSWRpb21hcyBkaXNwb25pYmxlczogc3BhbmlzaCwgZW5nbGlzaCwgZnJlbmNoLCBnZXJtYW4sIGl0YWxpYW4sIHBvcnR1Z3Vlc2UsIGV0Yy4KCmhlYWQoc2VudGltaWVudG9zX0hpbW5vKQpzdW1tYXJ5KHNlbnRpbWllbnRvc19IaW1ubykKYGBgCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IG9yYW5nZTsiPjYuIEdyYWZpY2FyIFJlc3VsdGFkb3MgZGUgRW1vY2lvbmVzPC9zcGFuPgoKYGBge3J9CmJhcnBsb3QoCiAgY29sU3Vtcyhwcm9wLnRhYmxlKHNlbnRpbWllbnRvc19IaW1ub1ssMTo4XSkpLAogIHNwYWNlID0gMC4yLAogIGhvcml6ID0gRkFMU0UsCiAgbGFzID0gMSwKICBjZXgubmFtZXMgPSAwLjcsCiAgY29sID0gYnJld2VyLnBhbChuID0gOCwgbmFtZSA9ICJTZXQzIiksCiAgbWFpbiA9ICJBbsOhbGlzaXMgZGUgU2VudGltaWVudG9zIGRlIGxhIGNhbmNpw7NuIEhpbW5vIE5hY2lvbmFsIE1leGljYW5vIiwKICB4bGFiID0gImVtb2Npb25lcyIKKQpgYGAKCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogb3JhbmdlOyI+Ny4gUHJvZnVuZGl6YXIgQW7DoWxpc2lzIGRlIEVtb2Npb25lczwvc3Bhbj4KCmBgYHtyfQpwYWxhYnJhc19taWVkbyA8LSB0ZXh0b19wYWxhYnJhc0hpbW5vW3NlbnRpbWllbnRvc19IaW1ubyRmZWFyID4gMF0KcGFsYWJyYXNfbWllZG9fb3JkZW4gPC0gc29ydCh0YWJsZSh1bmxpc3QocGFsYWJyYXNfbWllZG8pKSwgZGVjcmVhc2luZyA9IFRSVUUpCmhlYWQocGFsYWJyYXNfbWllZG9fb3JkZW4sIG49IDEwKQpgYGAKCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogb3JhbmdlOyI+OC4gR3JhZmljYXIgUmVzdWx0YWRvcyBkZSBTZW50aW1pZW50b3M8L3NwYW4+CgpgYGB7cn0Kc2VjdWVuY2lhX3NlbnRpbWllbnRvcyA8LSAoc2VudGltaWVudG9zX2RmJG5lZ2F0aXZlKi0xKSArIHNlbnRpbWllbnRvc19kZiRwb3NpdGl2ZQpzaW1wbGVfcGxvdChzZWN1ZW5jaWFfc2VudGltaWVudG9zKQpgYGAKCgoKCgoK