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("C:\\Users\\aleja\\triste.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)

Himno Nacional Mexicano

1. Instalar paquetes y llamar librerías

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

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

2. Cargar texto

texto_completo <- read.delim("C:\\Users\\aleja\\himno.txt", header=FALSE)

3. Tokenizar texto

texto_palabrasHimno <- get_tokens(texto_completo)

4. Explorar texto

head(texto_palabrasHimno)
## [1] "c"           "mexicanos"   "u2029al"     "u2029grito"  "u2029de"    
## [6] "u2029guerra"
length(texto_palabrasHimno)
## [1] 270

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   0       0        0     0        0        0
## 3     0            0       0    0   0       0        0     0        0        0
## 4     2            0       0    1   0       1        2     0        2        0
## 5     0            0       0    0   0       0        0     0        0        0
## 6     1            0       0    2   0       1        0     0        2        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.05926   Mean   :0.02593   Mean   :0.01852   Mean   :0.08148  
##  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.03704   Mean   :0.05185   Mean   :0.01481   Mean   :0.04444  
##  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.00000   Min.   :0.0000  
##  1st Qu.:0.00000   1st Qu.:0.0000  
##  Median :0.00000   Median :0.0000  
##  Mean   :0.09259   Mean   :0.0963  
##  3rd Qu.:0.00000   3rd Qu.:0.0000  
##  Max.   :2.00000   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)
## 
##  u2029guerra       guerra  u2029sangre       sangre u2029destino    u2029dios 
##            4            3            2            1            1            1 
## u2029enemigo   u2029grito 
##            1            1

8. Graficar Resultados de Sentimientos

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

LS0tDQp0aXRsZTogIkFjdGl2aWRhZCA0LjQiDQphdXRob3I6ICJTYXRvc2hpIFBhYmxvcyINCmRhdGU6ICIyMDIzLTA5LTI1Ig0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogVFJVRQ0KICAgIHRvY19mbG9hdDogVFJVRQ0KICAgIGNvZGVfZG93bmxvYWQ6IFRSVUUNCiAgICB0aGVtZTogInlldGkiDQogICAgaGlnaGxpZ2h0OiAidGFuZ28iDQotLS0NCg0KIVtdKEM6XFVzZXJzXGFsZWphXFBpY3R1cmVzXGVtb2Npb25lcy5qcGcpDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiBHcmVlbjsiPioqQW7DoWxpc2lzIGRlIFNlbnRpbWllbnRvcyoqPC9zcGFuPg0KDQpFbCAqKmFuw6FsaXNpcyBkZSBzZW50aW1pZW50b3MqKiwgbyBtaW5lcsOtYSBkZSBvcGluacOzbiwgZXMgdXRpbGl6YWRvIHBhcmEgZXh0cmFlciBkZSBmb3JtYSBhdXRvbcOhdGljYSwgaW5mb3JtYWNpw7NuIHNvYnJlIGxhIGNvbm90YWNpw7NuIHBvc2l0aXZhIG8gbmVnYXRpdmEgZGVsIGxlbmd1YWplIGRlIHVuIGRvY3VtZW50by4NCg0KRWwgYW7DoWxpc2lzIG1vc3RyYXLDoSBlbCByZXN1bHRhZG8gZW4gKjggZW1vY2lvbmVzIGLDoXNpY2FzIHkgMiBzZW50aW1pZW50b3MuKg0KDQpFbW9jaW9uZXMgYsOhc2ljYXM6ICANCjEuIEFsZWdyw61hIChqb3kpICANCjIuIFRyaXN0ZXphIChzYWRuZXNzKSAgDQozLiBJcmEgKGFuZ2VyKSAgDQo0LiBTb3JwcmVzYSAoc3VycHJpc2UpICAgIA0KNS4gQXNjbyAoZGlzZ3VzdCkgICANCjYuIE1pZWRvIChmZWFyKSAgIA0KNy4gQW50aWNpcGFjacOzbiAoYW50aWNpcGF0aW9uKSAgICANCjguIENvbmZpYW56YSAodHJ1c3QpICAgIA0KDQpTZW50aW1pZW50b3M6ICAgDQoxLiBQb3NpdGl2byAocG9zaXRpdmUpICAgIA0KMi4gTmVnYXRpdm8gKG5lZ2F0aXZlKSAgICANCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBHcmVlbjsiPjEuIEluc3RhbGFyIHBhcXVldGVzIHkgbGxhbWFyIGxpYnJlcsOtYXM8L3NwYW4+DQoNCmBgYHtyfQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJzeXV6aGV0IikNCmxpYnJhcnkoc3l1emhldCkNCg0KIyBpbnN0YWxsLnBhY2thZ2VzKCJSQ29sb3JCcmV3ZXIiKQ0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQpgYGANCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBncmVlbjsiPjIuIENhcmdhciB0ZXh0bzwvc3Bhbj4NCg0KYGBge3J9DQp0ZXh0b19jYWRlbmEgPC0gcmVhZC5kZWxpbSgiQzpcXFVzZXJzXFxhbGVqYVxcdHJpc3RlLnR4dCIsIGhlYWRlcj1GQUxTRSkNCmBgYA0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6Z3JlZW47Ij4zLiBUb2tlbml6YXIgdGV4dG88L3NwYW4+DQoNCmBgYHtyfQ0KdGV4dG9fcGFsYWJyYXMgPC0gZ2V0X3Rva2Vucyh0ZXh0b19jYWRlbmEpDQpgYGANCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBncmVlbjsiPjQuIEV4cGxvcmFyIHRleHRvPC9zcGFuPg0KDQpgYGB7cn0NCmhlYWQodGV4dG9fcGFsYWJyYXMpDQpsZW5ndGgodGV4dG9fcGFsYWJyYXMpDQpgYGANCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBncmVlbjsiPjUuIFJlYWxpemFyIEFuw6FsaXNpcyBkZSBTZW50aW1pZW50b3M8L3NwYW4+DQoNCmBgYHtyfQ0Kc2VudGltaWVudG9zX2RmIDwtIGdldF9ucmNfc2VudGltZW50KHRleHRvX3BhbGFicmFzLCBsYW5ndWFnZSA9ICJzcGFuaXNoIikNCg0KIyBJZGlvbWFzIGRpc3BvbmlibGVzOiBzcGFuaXNoLCBlbmdsaXNoLCBmcmVuY2gsIGdlcm1hbiwgaXRhbGlhbiwgcG9ydHVndWVzZSwgZXRjLg0KDQpoZWFkKHNlbnRpbWllbnRvc19kZikNCnN1bW1hcnkoc2VudGltaWVudG9zX2RmKQ0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogZ3JlZW47Ij42LiBHcmFmaWNhciBSZXN1bHRhZG9zIGRlIEVtb2Npb25lczwvc3Bhbj4NCg0KYGBge3J9DQpiYXJwbG90KA0KICBjb2xTdW1zKHByb3AudGFibGUoc2VudGltaWVudG9zX2RmWywxOjhdKSksDQogIHNwYWNlID0gMC4yLA0KICBob3JpeiA9IEZBTFNFLA0KICBsYXMgPSAxLA0KICBjZXgubmFtZXMgPSAwLjcsDQogIGNvbCA9IGJyZXdlci5wYWwobiA9IDgsIG5hbWUgPSAiU2V0MyIpLA0KICBtYWluID0gIkFuw6FsaXNpcyBkZSBTZW50aW1pZW50b3MgZGUgbGEgY2FuY2nDs24gRWwgVHJpc3RlIiwNCiAgeGxhYiA9ICJlbW9jaW9uZXMiDQopDQpgYGANCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBncmVlbjsiPjcuIFByb2Z1bmRpemFyIEFuw6FsaXNpcyBkZSBFbW9jaW9uZXM8L3NwYW4+DQoNCmBgYHtyfQ0KcGFsYWJyYXNfdHJpc3RlemEgPC0gdGV4dG9fcGFsYWJyYXNbc2VudGltaWVudG9zX2RmJHNhZG5lc3MgPiAwXQ0KcGFsYWJyYXNfdHJpc3RlemFfb3JkZW4gPC0gc29ydCh0YWJsZSh1bmxpc3QocGFsYWJyYXNfdHJpc3RlemEpKSwgZGVjcmVhc2luZyA9IFRSVUUpDQpoZWFkKHBhbGFicmFzX3RyaXN0ZXphX29yZGVuLCBuPSAxMCkNCmBgYA0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IGdyZWVuOyI+OC4gR3JhZmljYXIgUmVzdWx0YWRvcyBkZSBTZW50aW1pZW50b3M8L3NwYW4+DQoNCmBgYHtyfQ0Kc2VjdWVuY2lhX3NlbnRpbWllbnRvcyA8LSAoc2VudGltaWVudG9zX2RmJG5lZ2F0aXZlKi0xKSArIHNlbnRpbWllbnRvc19kZiRwb3NpdGl2ZQ0Kc2ltcGxlX3Bsb3Qoc2VjdWVuY2lhX3NlbnRpbWllbnRvcykNCmBgYA0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IGdyZWVuOyI+IEhpbW5vIE5hY2lvbmFsIE1leGljYW5vPC9zcGFuPg0KDQohW10oQzpcVXNlcnNcYWxlamFcUGljdHVyZXNcaGlkYWxnby5qcGcpDQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogZ3JlZW47Ij4xLiBJbnN0YWxhciBwYXF1ZXRlcyB5IGxsYW1hciBsaWJyZXLDrWFzPC9zcGFuPg0KDQpgYGB7cn0NCiMgaW5zdGFsbC5wYWNrYWdlcygic3l1emhldCIpDQpsaWJyYXJ5KHN5dXpoZXQpDQoNCiMgaW5zdGFsbC5wYWNrYWdlcygiUkNvbG9yQnJld2VyIikNCmxpYnJhcnkoUkNvbG9yQnJld2VyKQ0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogZ3JlZW47Ij4yLiBDYXJnYXIgdGV4dG88L3NwYW4+DQoNCmBgYHtyfQ0KdGV4dG9fY29tcGxldG8gPC0gcmVhZC5kZWxpbSgiQzpcXFVzZXJzXFxhbGVqYVxcaGltbm8udHh0IiwgaGVhZGVyPUZBTFNFKQ0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogZ3JlZW47Ij4zLiBUb2tlbml6YXIgdGV4dG88L3NwYW4+DQoNCmBgYHtyfQ0KdGV4dG9fcGFsYWJyYXNIaW1ubyA8LSBnZXRfdG9rZW5zKHRleHRvX2NvbXBsZXRvKQ0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogZ3JlZW47Ij40LiBFeHBsb3JhciB0ZXh0bzwvc3Bhbj4NCg0KYGBge3J9DQpoZWFkKHRleHRvX3BhbGFicmFzSGltbm8pDQpsZW5ndGgodGV4dG9fcGFsYWJyYXNIaW1ubykNCmBgYA0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IGdyZWVuOyI+NS4gUmVhbGl6YXIgQW7DoWxpc2lzIGRlIFNlbnRpbWllbnRvczwvc3Bhbj4NCg0KYGBge3J9DQpzZW50aW1pZW50b3NfSGltbm8gPC0gZ2V0X25yY19zZW50aW1lbnQodGV4dG9fcGFsYWJyYXNIaW1ubywgbGFuZ3VhZ2UgPSAic3BhbmlzaCIpDQoNCiMgSWRpb21hcyBkaXNwb25pYmxlczogc3BhbmlzaCwgZW5nbGlzaCwgZnJlbmNoLCBnZXJtYW4sIGl0YWxpYW4sIHBvcnR1Z3Vlc2UsIGV0Yy4NCg0KaGVhZChzZW50aW1pZW50b3NfSGltbm8pDQpzdW1tYXJ5KHNlbnRpbWllbnRvc19IaW1ubykNCmBgYA0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IGdyZWVuOyI+Ni4gR3JhZmljYXIgUmVzdWx0YWRvcyBkZSBFbW9jaW9uZXM8L3NwYW4+DQoNCmBgYHtyfQ0KYmFycGxvdCgNCiAgY29sU3Vtcyhwcm9wLnRhYmxlKHNlbnRpbWllbnRvc19IaW1ub1ssMTo4XSkpLA0KICBzcGFjZSA9IDAuMiwNCiAgaG9yaXogPSBGQUxTRSwNCiAgbGFzID0gMSwNCiAgY2V4Lm5hbWVzID0gMC43LA0KICBjb2wgPSBicmV3ZXIucGFsKG4gPSA4LCBuYW1lID0gIlNldDMiKSwNCiAgbWFpbiA9ICJBbsOhbGlzaXMgZGUgU2VudGltaWVudG9zIGRlIGxhIGNhbmNpw7NuIEhpbW5vIE5hY2lvbmFsIE1leGljYW5vIiwNCiAgeGxhYiA9ICJlbW9jaW9uZXMiDQopDQpgYGANCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBncmVlbjsiPjcuIFByb2Z1bmRpemFyIEFuw6FsaXNpcyBkZSBFbW9jaW9uZXM8L3NwYW4+DQoNCmBgYHtyfQ0KcGFsYWJyYXNfbWllZG8gPC0gdGV4dG9fcGFsYWJyYXNIaW1ub1tzZW50aW1pZW50b3NfSGltbm8kZmVhciA+IDBdDQpwYWxhYnJhc19taWVkb19vcmRlbiA8LSBzb3J0KHRhYmxlKHVubGlzdChwYWxhYnJhc19taWVkbykpLCBkZWNyZWFzaW5nID0gVFJVRSkNCmhlYWQocGFsYWJyYXNfbWllZG9fb3JkZW4sIG49IDEwKQ0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogZ3JlZW47Ij44LiBHcmFmaWNhciBSZXN1bHRhZG9zIGRlIFNlbnRpbWllbnRvczwvc3Bhbj4NCg0KYGBge3J9DQpzZWN1ZW5jaWFfc2VudGltaWVudG9zIDwtIChzZW50aW1pZW50b3NfZGYkbmVnYXRpdmUqLTEpICsgc2VudGltaWVudG9zX2RmJHBvc2l0aXZlDQpzaW1wbGVfcGxvdChzZWN1ZW5jaWFfc2VudGltaWVudG9zKQ0KYGBgDQoNCg0KDQoNCg0KDQo=