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

Análisis de sentimientos Himno Nacional Mexicano

Llamar librerias

library("syuzhet")

Cargar texto

# Ruta del archivo de texto
ruta_archivo <- "C:\\Users\\Deisy Lopez\\Documents\\7. Séptimo Semestre Ago-Dic 2023\\RStudio_AN\\Himno Nacional Mexicano.txt"

# Leer el archivo de texto
himno <- readLines(ruta_archivo)
## Warning in readLines(ruta_archivo): incomplete final line found on
## 'C:\Users\Deisy Lopez\Documents\7. Séptimo Semestre Ago-Dic
## 2023\RStudio_AN\Himno Nacional Mexicano.txt'

Tokenizar texto (Dividir un texto de palabras)

texto_palabras <- get_tokens(himno)

Explorar texto

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

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)
##      anger         anticipation        disgust             fear       
##  Min.   :0.0000   Min.   :0.00000   Min.   :0.00000   Min.   :0.0000  
##  1st Qu.:0.0000   1st Qu.:0.00000   1st Qu.:0.00000   1st Qu.:0.0000  
##  Median :0.0000   Median :0.00000   Median :0.00000   Median :0.0000  
##  Mean   :0.0625   Mean   :0.04234   Mean   :0.02218   Mean   :0.0746  
##  3rd Qu.:0.0000   3rd Qu.:0.00000   3rd Qu.:0.00000   3rd Qu.:0.0000  
##  Max.   :3.0000   Max.   :2.00000   Max.   :2.00000   Max.   :2.0000  
##       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.04839   Mean   :0.04234   Mean   :0.02621   Mean   :0.04032  
##  3rd Qu.:0.00000   3rd Qu.:0.00000   3rd Qu.:0.00000   3rd Qu.:0.00000  
##  Max.   :2.00000   Max.   :2.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.08266   Mean   :0.1008  
##  3rd Qu.:0.00000   3rd Qu.:0.0000  
##  Max.   :3.00000   Max.   :3.0000
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

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

LS0tDQp0aXRsZTogIkFjdGl2aWRhZCA0LjUiDQphdXRob3I6ICJEZWlzeSBMw7NwZXoiDQpkYXRlOiAiMjAyMy0wOS0yNSINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiBUUlVFDQogICAgdG9jX2Zsb2F0OiBUUlVFDQogICAgdG9jX2RlcHRoOiA0DQogICAgY29kZV9kb3dubG9hZDogVFJVRQ0KICAgIHRoZW1lOiAiZGFya2x5Ig0KICAgIGhpZ2hsaWdodDogImVzcHJlc3NvIg0KZWRpdG9yX29wdGlvbnM6IA0KICBjaHVua19vdXRwdXRfdHlwZTogY29uc29sZQ0KLS0tDQoNCjxjZW50ZXI+DQoNCiFbXShDOlxcVXNlcnNcXERlaXN5IExvcGV6XFxEb2N1bWVudHNcXDcuIFPDqXB0aW1vIFNlbWVzdHJlIEFnby1EaWMgMjAyM1xcUlN0dWRpb19BTlxcc2VudGltaWVudG9zLmdpZikNCg0KIyBBbsOhbGlzaXMgZGUgc2VudGltaWVudG9zIHsudGFic2V0fQ0KRWwgYW7DoWxpc2lzIGRlIHNlbnRpbWllbnRvcywgbyBtaW5lcsOtYSBkZSBvcGluacOzbiwgZXMgdXRpbGl6YWRvIHBhcmEgZXh0cmFlciBkZSBmb3JtYSBhdXRvbcOhdGljYSBpbmZvcm1hY2nDs24gc29icmUgbGEgY29ubm90YWNpw7NuIHBvc2l0aXZhIG8gbmVnYXRpdmEgZGVsIGxlbmd1YWplIGRlIHVuIGRvY3VtZW50by4NCg0KRWwgYW7DoWxpc2lzIG1vc3RyYXLDoSBlbCByZXN1bHRhZG8gZW4gOCBlbW9jaW9uZXMgYsOhc2ljYXMgeSAyIHNlbnRpbWllbnRvczoNCg0KRW1vY2lvbmVzIGLDoXNpY2FzOg0KMS4gQWxlZ3LDrWEgKGpveSkNCjIuIFRyaXN0ZXphIChzYWRuZXNzKQ0KMy4gSXJhIChhbmdlcikNCjQuIFNvcnByZXNhIChzdXJwcmlzZSkNCjUuIEFzY28gKGRpc2d1c3QpDQo2LiBNaWVkbyAoZmVhcikNCjcuIEFudGljaXBhY2nDs24gKGFudGljaXBhdGlvbikNCjguIENvbmZpYW56YSAodHJ1c3QpDQpTZW50aW1pZW50b3M6DQoxLiBQb3NpdGl2byAocG9zaXRpdmUpDQoyLiBOZWdhdGl2byAobmVnYXRpdmUpDQoNCiMjIEFuw6FsaXNpcyBkZSBzZW50aW1pZW50b3MgTm92ZWxhIE1pYXUNCg0KIyMjIExsYW1hciBsaWJyZXJpYXMNCmBgYHtyfQ0KbGlicmFyeSgic3l1emhldCIpDQpgYGANCiANCiMjIyBDYXJnYXIgdGV4dG8NCmBgYHtyfQ0KdGV4dG9fY2FkZW5hIDwtIHNjYW4oZmlsZSA9ICJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcHJvZ3JhbW1pbmdoaXN0b3JpYW4vamVreWxsL2doLXBhZ2VzL2Fzc2V0cy9nYWxkb3NfbWlhdS50eHQiLCBmaWxlRW5jb2RpbmcgPSAiVVRGLTgiLCB3aGF0ID0gY2hhcmFjdGVyKCksIHNlcCA9ICJcbiIsIGFsbG93RXNjYXBlcyA9IFQpDQpgYGANCg0KIyMjIFRva2VuaXphciB0ZXh0byAoRGl2aWRpciB1biB0ZXh0byBkZSBwYWxhYnJhcykNCmBgYHtyfQ0KdGV4dG9fcGFsYWJyYXMgPC0gZ2V0X3Rva2Vucyh0ZXh0b19jYWRlbmEpDQpgYGANCg0KIyMjIEV4cGxvcmFyIHRleHRvDQpgYGB7cn0NCmhlYWQodGV4dG9fcGFsYWJyYXMpDQpsZW5ndGgodGV4dG9fcGFsYWJyYXMpDQpvcmFjaW9uZXNfdmVjdG9yICA8LSBnZXRfc2VudGVuY2VzKHRleHRvX2NhZGVuYSkNCmxlbmd0aChvcmFjaW9uZXNfdmVjdG9yKQ0KYGBgDQoNCiMjIyBSZWFsaXphciBhbsOhbGlzaXMgZGUgc2VudGltaWVudG9zDQpgYGB7cn0NCnNlbnRpbWllbnRvc19kZiA8LSBnZXRfbnJjX3NlbnRpbWVudCh0ZXh0b19wYWxhYnJhcywgbGFuZ3VhZ2UgPSAic3BhbmlzaCIpDQojIElkaW9tYXMgZGlzcG9uaWJsZXM6IGluZ2zDqXMsIGZyYW5jZXMsIGl0YWxpYW5vLCBhbGVtw6FuLCBwb3J0dWd1w6lzLCBlc3Bhw7FvbC4NCnN1bW1hcnkoc2VudGltaWVudG9zX2RmKQ0KaGVhZChzZW50aW1pZW50b3NfZGYpDQpgYGANCg0KIyMjIEdyYWZpY2FyIHJlc3VsdGFkb3MgZGUgZW1vY2lvbmVzDQpgYGB7cn0NCmxpYnJhcnkoUkNvbG9yQnJld2VyKQ0KYmFycGxvdCgNCiAgY29sU3Vtcyhwcm9wLnRhYmxlKHNlbnRpbWllbnRvc19kZlssMTo4XSkpLA0KICBzcGFjZSA9IDAuMiwNCiAgaG9yaXogPSBGQUxTRSwNCiAgbGFzID0gMSwNCiAgY2V4Lm5hbWVzID0gMC43LA0KICBjb2wgPSBicmV3ZXIucGFsKG49OCwgbmFtZT0iU2V0MyIpLA0KICBtYWluID0gIkFuw6FsaXNpcyBkZSBTZW50aW1pZW50b3MgZGUgbGEgTm92ZWxhIE1pYXUiLA0KICB4bGFiID0gIkVtb2Npb25lcyINCikNCmBgYA0KDQojIyMgUHJvZnVuZGl6YXIgYW7DoWxpc2lzIGRlIGVtb2Npb25lcw0KYGBge3J9DQpwYWxhYnJhc19jb25maWFuemEgIDwtIHRleHRvX3BhbGFicmFzW3NlbnRpbWllbnRvc19kZiR0cnVzdCA+MF0NCnBhbGFicmFzX2NvbmZpYW56YV9vcmRlbiA8LSBzb3J0KHRhYmxlKHVubGlzdChwYWxhYnJhc19jb25maWFuemEpKSwgZGVjcmVhc2luZyA9IFRSVUUpDQpoZWFkKHBhbGFicmFzX2NvbmZpYW56YV9vcmRlbiwgbj0xMCkNCmBgYA0KDQojIyMgR3JhZmljYXIgcmVzdWx0YWRvcyBkZSBzZW50aW1pZW50b3MNCmBgYHtyfQ0Kc2VjdWVuY2lhX3NlbnRpbWllbnRvcyA8LSAoc2VudGltaWVudG9zX2RmJG5lZ2F0aXZlKi0xKSArIChzZW50aW1pZW50b3NfZGYkcG9zaXRpdmUpDQpzaW1wbGVfcGxvdChzZWN1ZW5jaWFfc2VudGltaWVudG9zKQ0KYGBgDQoNCg0KIyMgQW7DoWxpc2lzIGRlIHNlbnRpbWllbnRvcyBIaW1ubyBOYWNpb25hbCBNZXhpY2Fubw0KDQojIyMgTGxhbWFyIGxpYnJlcmlhcw0KYGBge3J9DQpsaWJyYXJ5KCJzeXV6aGV0IikNCmBgYA0KDQojIyMgQ2FyZ2FyIHRleHRvDQpgYGB7cn0NCiMgUnV0YSBkZWwgYXJjaGl2byBkZSB0ZXh0bw0KcnV0YV9hcmNoaXZvIDwtICJDOlxcVXNlcnNcXERlaXN5IExvcGV6XFxEb2N1bWVudHNcXDcuIFPDqXB0aW1vIFNlbWVzdHJlIEFnby1EaWMgMjAyM1xcUlN0dWRpb19BTlxcSGltbm8gTmFjaW9uYWwgTWV4aWNhbm8udHh0Ig0KDQojIExlZXIgZWwgYXJjaGl2byBkZSB0ZXh0bw0KaGltbm8gPC0gcmVhZExpbmVzKHJ1dGFfYXJjaGl2bykNCmBgYA0KDQojIyMgVG9rZW5pemFyIHRleHRvIChEaXZpZGlyIHVuIHRleHRvIGRlIHBhbGFicmFzKQ0KYGBge3J9DQp0ZXh0b19wYWxhYnJhcyA8LSBnZXRfdG9rZW5zKGhpbW5vKQ0KYGBgDQoNCiMjIyBFeHBsb3JhciB0ZXh0bw0KYGBge3J9DQpoZWFkKHRleHRvX3BhbGFicmFzKQ0KbGVuZ3RoKHRleHRvX3BhbGFicmFzKQ0Kb3JhY2lvbmVzX3ZlY3RvciAgPC0gZ2V0X3NlbnRlbmNlcyhoaW1ubykNCmxlbmd0aChvcmFjaW9uZXNfdmVjdG9yKQ0KYGBgDQoNCiMjIyBSZWFsaXphciBhbsOhbGlzaXMgZGUgc2VudGltaWVudG9zDQpgYGB7cn0NCnNlbnRpbWllbnRvc19kZiA8LSBnZXRfbnJjX3NlbnRpbWVudCh0ZXh0b19wYWxhYnJhcywgbGFuZ3VhZ2UgPSAic3BhbmlzaCIpDQojIElkaW9tYXMgZGlzcG9uaWJsZXM6IGluZ2zDqXMsIGZyYW5jZXMsIGl0YWxpYW5vLCBhbGVtw6FuLCBwb3J0dWd1w6lzLCBlc3Bhw7FvbC4NCnN1bW1hcnkoc2VudGltaWVudG9zX2RmKQ0KaGVhZChzZW50aW1pZW50b3NfZGYpDQpgYGANCg0KIyMjIEdyYWZpY2FyIHJlc3VsdGFkb3MgZGUgZW1vY2lvbmVzDQpgYGB7cn0NCmxpYnJhcnkoUkNvbG9yQnJld2VyKQ0KYmFycGxvdCgNCiAgY29sU3Vtcyhwcm9wLnRhYmxlKHNlbnRpbWllbnRvc19kZlssMTo4XSkpLA0KICBzcGFjZSA9IDAuMiwNCiAgaG9yaXogPSBGQUxTRSwNCiAgbGFzID0gMSwNCiAgY2V4Lm5hbWVzID0gMC43LA0KICBjb2wgPSBicmV3ZXIucGFsKG49OCwgbmFtZT0iU2V0MyIpLA0KICBtYWluID0gIkFuw6FsaXNpcyBkZSBTZW50aW1pZW50b3MgZGVsIEhpbW5vIE5hY2lvbmFsIiwNCiAgeGxhYiA9ICJFbW9jaW9uZXMiDQopDQpgYGANCg0KIyMjIFByb2Z1bmRpemFyIGFuw6FsaXNpcyBkZSBlbW9jaW9uZXMNCmBgYHtyfQ0KcGFsYWJyYXNfbWllZG8gIDwtIHRleHRvX3BhbGFicmFzW3NlbnRpbWllbnRvc19kZiRmZWFyID4wXQ0KcGFsYWJyYXNfbWllZG9fb3JkZW4gPC0gc29ydCh0YWJsZSh1bmxpc3QocGFsYWJyYXNfbWllZG8pKSwgZGVjcmVhc2luZyA9IFRSVUUpDQpoZWFkKHBhbGFicmFzX21pZWRvX29yZGVuLCBuPTEwKQ0KYGBgDQoNCiMjIyBHcmFmaWNhciByZXN1bHRhZG9zIGRlIHNlbnRpbWllbnRvcw0KYGBge3J9DQpzZWN1ZW5jaWFfc2VudGltaWVudG9zIDwtIChzZW50aW1pZW50b3NfZGYkbmVnYXRpdmUqLTEpICsgKHNlbnRpbWllbnRvc19kZiRwb3NpdGl2ZSkNCnNpbXBsZV9wbG90KHNlY3VlbmNpYV9zZW50aW1pZW50b3MpDQpgYGANCg==