#!/usr/bin/env python
# coding: utf-8

# # Análisis de sentimiento

# ## Introducción

# Hasta ahora el análisis realizado ha sido muy similar al que se debe realizar a los datos numéricos.
# 
# Una de las técnicas que podemos aplicar al análisis de textos es el **Análisis de sentimiento**
# 
# Usaremos las siguientes herramientas:
# 
# 1. **Módulo TextBlob:** A través del cual y mediante palabras ya previamente etiquetadas (en cuanto a sentimiento) extraeremos el sentimiento de cada palabra.  Hay que tener en cuenta, que una misma palabra puede tener sentimiento positivo o negativo en función del contexto (cerveza fría, día frío).
# 2. **Etiquetas de sentimiento:** Cada palabra en el corpus está etiquetada en términos de polaridad y subjetividad (polarity y subjectivity)
#    * **Polaridad**: Cómo de positiva o negativa es una palabra.  -1 muy negativa. +1 muy positiva.
#    * **Subjectividad**: Como de subjetivo es el sentimiento de una palabra. 0 no subjetivo. +1 sentimiento muy subjetivo.
# 
# Más información acerca de TextBlob [función sentimiento](https://planspace.org/20150607-textblob_sentiment/).
# 
# 

# ## Sentimiento

# In[3]:


#!pip install textblob


# In[1]:


# Iniciamos leyendo el corpus generado previamente
import pandas as pd

datos = pd.read_pickle('corpus.pkl')
datos


# In[2]:


# Generamos un par de funciones Lambda para encontrar la polaridad y subjetividad de cada palabra
from textblob import TextBlob

pol = lambda x: TextBlob(x).sentiment.polarity
sub = lambda x: TextBlob(x).sentiment.subjectivity

datos['polaridad'] = datos['transcripcion'].apply(pol)
datos['subjectividad'] = datos['transcripcion'].apply(sub)
datos


# In[3]:


# Pintamos resultados
import matplotlib.pyplot as plt

plt.rcParams['figure.figsize'] = [10, 8]

for index, comico in enumerate(datos.index):
    x = datos['polaridad'].loc[comico]
    y = datos['subjectividad'].loc[comico]
    plt.scatter(x, y, color='blue')
    plt.text(x+.001, y+.001, datos['nombre_completo'][index], fontsize=10)
    plt.xlim(-.01, .12) 
    
plt.title('Análisis de Sentimiento', fontsize=20)
plt.xlabel('<-- Negativo -------- Positivo -->', fontsize=15)
plt.ylabel('<-- Hechos -------- Opiniones -->', fontsize=15)

plt.show()


# ## Análisis de sentimiento a lo largo del tiempo

# El análisis de sentimiento ejecutado es sobre el monólogo completo.  Analizamos el sentimiento a lo largo del tiempo.  Para ello, dividimos el monólogo en 10 partes y analizaremos cada una de ellas para ver cómo varía el sentimiento.

# In[4]:


# Dividimos cada monologo en 10 partes
import numpy as np
import math

def dividir_texto(texto, n=10):
    '''Divide una cadena de texto en n partes iguales.'''

    # Cálculo de la longitud del texto, el tamaño de cada chunk y el inicio de cada chunk
    long = len(texto)
    tamano = math.floor(long / n)
    inicio = np.arange(0, long, tamano)
    
    # Extracción de porciones de texto del mismo tamaño
    lista = []
    for i in range(n):
        lista.append(texto[inicio[i]:inicio[i]+tamano])
    return lista


# In[8]:


# Creamos una lista que contenga todos los chunks de texto
lista_chunks = []
for t in datos['transcripcion']:
    tmp = dividir_texto(t)
    lista_chunks.append(tmp)
    
lista_chunks [1:2]


# In[9]:


# Lista de chunks tiene 12 elementos, uno por cómico
print (len(lista_chunks))
# Cada elemento está compuesto de 10 partes.
print (len(lista_chunks[0]))


# In[10]:


# Calculamos la polaridad de cada parte

transcripcion_polaridad = []
for lch in lista_chunks:
    partes_polaridad = []
    for p in lch:
        partes_polaridad.append(TextBlob(p).sentiment.polarity)
    transcripcion_polaridad.append(partes_polaridad)
    
transcripcion_polaridad


# In[12]:


# Pintamos los para un cómico
plt.plot(transcripcion_polaridad[0])
plt.title(datos['nombre_completo'].index[0])
plt.show()


# In[11]:


# Pintamos la polaridad para cada cómico
plt.rcParams['figure.figsize'] = [16, 12]

for indice, comico in enumerate(datos.index):    
    plt.subplot(3, 4, indice+1)
    plt.plot(transcripcion_polaridad[indice])
    plt.plot(np.arange(0,10), np.zeros(10))
    plt.title(datos['nombre_completo'][indice])
    plt.ylim(ymin=-.2, ymax=.3)
    
plt.show()


# ## Ejercicios

# 1. Prueba a dividir los monólogos en 5 ó 15 partes para ver si hay cambios en la polaridad obtenida
