---
title: "Análisis de Sentimiento con R"
date: "`r Sys.Date()`"
output:
  rmdformats::readthedown:
    highlight: kate
---


```{r setup, echo=FALSE, cache=FALSE}
library(knitr)
library(rmdformats)


## Global options
options(max.print="75")
opts_chunk$set(echo=FALSE,
	             cache=TRUE,
               prompt=FALSE,
               tidy=TRUE,
               comment=NA,
               message=FALSE,
               warning=FALSE)
opts_knit$set(width=75)
```


# Definiciones

Carga de Bibliotecas
```{r}
library(tidyverse)
library(readr)
library(ggplot2)
library(tidytext)
```



Para practicar técnicas de procesamiento y análisis computacional de textos, vamos a trabajar con un dataset de letras de tango. La información fue recopilada a partir de las letras publicadas en el sitio Todo Tango, por el Dr. Germán Rosatti.

```{r}
# tangos <- read.csv("letras_final.csv", stringsAsFactors = FALSE)

library(readr)
tangos <- read_csv("https://themys.sid.uncu.edu.ar/rpalma/R-cran/Todo_Tango_letras_final.csv" )

```

Veamos una sítesis del corpus de conocimiento que cargamos

```{r}
summary(tangos)
```

Examinemos la cabecera de la tabla

```{r}
head(tangos)
```

Agregamos una columna con la década de cada tanto, usando un truquito aritmético. Si a cualquier año se le sustrae el resto de una división entera por 10, el resultado es la década correspondiente a ese año. Por ejemplo, el resto de 1928 / 10 es 8 , y 1928 - 8 = 1920. En informática, la función que devuelve el resto de una división entera suele llamarse módulo. En R, el módulo se invoca con %%.

Creamos nuestra columna de décadas

```{r}
tangos <- tangos %>% 
    mutate(ano = as.integer(ano),
           decada = ano - ano %% 10)
```

Notése que en la mayoría de los casos no se registra el año del tango, por lo que tampoco obtenemos la década.

```{r}
tangos %>%  count(decada, sort = TRUE)
```

Graficamos la cantidad de tangos encontrados por década

```{r}
ggplot(tangos) +
    geom_bar(aes(decada)) +
    scale_x_continuous(breaks = seq(1890, 2010, by = 10)) +
    labs(title = "Tangos por década", 
         x = "década",
         y = "cantidad") 
```

Sabiendo poco de tango, voy a asumir que de los años ’20 a los ’40 transcurrió la era dorada del género.

También podemos revisar la distribución por género.


```{r}
tangos %>% 
    count(ritmo, sort = TRUE) 
```


Y realizar un ranking de los compositores más prolíficos (o al menos, los más representados en el dataset). Nuevamente se trata de una variable con mayoría de datos faltantes.

```{r}
tangos %>% 
    count(compositor, sort = TRUE)
```


## Tokenizado

Preparando los datos para análisis de texto: la “tokenización”
En la jerga del análisis computacional de texto se le llama “tokenizar” (por tokenize en inglés) al acto de extraer unidades de análisis a partir de un cuerpo de escritos. Cualquiera sea el material analizado (frases, discursos o libros completos) se le extrae las palabras individuales que lo componen (“tokens”) para luego cuantificar de algún modo sus atributos.

En nuestro dataset la letra de los tangos aparece en un sólo campo, con las oraciones separadas a veces por uan barra vertical (“|”) y en ocasiones por la secuencia “”. Podemos usar **separate_rows**, una función que permite reorganizar una variable de modo que cada observacion se distribuya en múltiples filas, separando el valor original en base a un delimitador especificado. Usamos entonces **sep_rows** , con el parámetro **“sep”** indicando cuales son los separadores, y luego agregamos una variable nueva que ennumere las líneas de cada tango:

```{r}
tangos <- separate_rows(tangos, letra, sep = "\\\\n | \\|")

tangos <- tangos %>%
    group_by(link) %>% 
    mutate(linea = row_number()) %>% 
    ungroup()

head(tangos)
```
## Extrayendo tokens

Ahora si, “tokenizamos”. Usamos la función **unnest_tokens()**, provista por el paquete *tidytext*, para realizar una operación similar a la anterior: ahora dividiremos cada línea de texto en múltiples filas dentro de nuestro dataframe, una por cada palabra. Esto hace posible analizar el texto de forma muy cómoda luego.

```{r}
tangos_tokenizado <- tangos %>% 
    unnest_tokens(word, letra)

head(tangos_tokenizado)
```
# Eliminando stopwords

El siguiente paso, común a cualquier análisis de texto, es eliminar las “stopwords”. Estas son palabras muy frecuentes que no agregan significado al texto, sino que funcionan como estructura: por ejemplo “de”, “la”, “en”, “a”, etc. Al eliminarlas del texto a analizar nos aseguramos de que no aparezcan siempre entre las palabras más frecuentes encontradas, y a cambio no perdemos nada; en la práctica, las stopwords nunca son necesarias para detectar el tema de un texto.

Descargamos una lista de stopwords del lenguaje español basada en <http://snowball.tartarus.org/algorithms/spanish/stop.txt>

```{r}
stopwords_es <- read.csv("https://bitsandbricks.github.io/data/stopwords_es.csv",
                      stringsAsFactors = FALSE)

head(stopwords_es)
```


Y con un “anti-join” eliminamos todas las palabras en el dataset de tangos que también aparecen en la lista. (El anti-join compara dos sets de datos en base a un campo en común, y elimina del primero todas las filas con valores que aparecen en el segundo)

```{r}
tangos_tokenizado <- tangos_tokenizado %>% 
   anti_join(stopwords_es, by = c("word" = "STOPWORD"))
```

## Identificando las palabras más frecuentes

Habiéndonos librados de las stopwords, ya podemos hacer una lista de los términos más frecuentes en nuestra colección de letras de tango:

```{r}
tangos_tokenizado %>% 
    count(word, sort = TRUE)
```

Visualizemos la palabra más frecuente por década. Usamos slice() para “cortar” una porción de la data de cada grupo. En este caso, sólo la primera fila, que por el orden establecido en el paso anterior, es la que tiene la palabra más frecuente:

```{r}
tangos_tokenizado %>% 
    filter(!is.na(decada)) %>% 
    group_by(decada) %>% 
    count(word, sort = TRUE) %>% 
    slice(1) %>% 
    ggplot() +
    geom_bar(aes(x = word, weight = n, fill = word)) +
    coord_flip() +
    facet_wrap(~decada) +
    labs(title = "Letras de tango",
         subtitle = "Palabra más frecuente por década",
         x = "palabra",
         y = "veces hallada")
```

# Análisis de sentimiento

Para asignar un “sentimiento” a cada palabra utilizaremos SDAL, un léxico de 2880 palabras. El SDAL fue producido por el Grupo del Procesamiento del Habla de la Facultad de Ciencias Exactas y Naturales (FCEyN), parte de la Universidad de Buenos Aires

Las palabras contenidas en el léxico han sido “puntuadas” manualmente asignando su valor según tres dimensiones afectivas:

agrado (agradable / neutra / desagradable)
activación (activa / neutra / pasiva)
imaginabilidad (fácil de imaginar / neutra / difícil de imaginar)
Los detalles al respecto de del léxico pueden encontrarse en: Agustín Gravano & Matías Dell’ Amerlina Ríos, “Spanish DAL: A Spanish Dictionary of Affect in Language”, Reporte Técnico, Departamento de Computación, FCEyN-UBA, Febrero 2014.

Cargamos una versión adaptada del léxico:

```{r}
lexico <- read.csv("https://bitsandbricks.github.io/data/sdal.csv", 
                   stringsAsFactors = FALSE)

head(lexico)
```

## Cuantificando sentimiento

Vamos a comparar cuatro tangos entre sí, asignándoles una polaridad de sentimiento (de positivo a negativo) línea por línea. Nuestra guía será el valor de “agrado” para cada palabra hallada en el léxico SDAL. Un agrado alto será asociado a un sentimiento positivo, y uno bajo a sentimiento negativo.

Seleccionemos éstos clásicos:

- El día que me quieras
- Por una cabeza
- Naranjo en flor
- Garufa


```{r}
clasicos <- c("el dia que me quieras",
              "por una cabeza",
              "naranjo en flor",
              "garufa")
```


Para asignar un sentimiento a cada línea de los tangos, simplemente hacemos un join con el léxico, lo cual asocia a cada palabra su valor de sentimiento. Y luego sumamos los valores para obtener el sentimiento general de cada línea:

```{r}
sentimiento_clasicos <- tangos_tokenizado %>% 
    filter(titulo %in% clasicos) %>% 
    inner_join(lexico, by = c("word" = "palabra")) %>% 
    group_by(titulo, linea) %>% 
    summarise(sentimiento = sum(media_agrado))
```


La utilidad de analizar el sentimiento línea a línea es que podemos visualizar la progresión a medida que transcurre el tango:

```{r}
ggplot(sentimiento_clasicos) + 
  geom_bar(aes(linea, sentimiento, fill = sentimiento),
           stat = "identity", show.legend = FALSE) +
  facet_wrap(~titulo, ncol = 2, scales = "free_x") +
    scale_fill_distiller(type = "div")
```

El día que me quieras” alcanza sus picos de sentimiento positivo en las líneas 18 y 40. Para saber cuales son, lo consultamos con el dataset original de tangos, el que no hemos divididos letra por letra:

```{r}
tangos %>% 
    filter(titulo == "el dia que me quieras", linea == 18 | linea == 40) %>% 
    select(letra)
## # A tibble: 2 x 1
##   letra                     
##   <chr>                     
## 1 " desde el azul del cielo"
## 2 " desde el azul del cielo"
```


De algún modo, la combinación de palabras “desde el azul del cielo” rankea muy alto de acuerdo al léxico de sentimiento que estamos usando.

“Naranjo en flor”, por su parte, muestra siempre un sentimiento positivo… excepto en los versos 24 y 25. ¿Qué contienen?

```{r}
tangos %>% 
    filter(titulo == "naranjo en flor", linea == 24 | linea == 25) %>% 
    select(letra)
```

