File size: 5,908 Bytes
f945c73
 
 
 
 
 
 
 
 
 
 
 
6c2d890
f945c73
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
import streamlit as st
import plotly.express as px
import pandas as pd
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from scrapper_rss import Scrapper
import datetime as dt

st.set_option('deprecation.showPyplotGlobalUse', False)

scrapper = Scrapper()

noticias = pd.read_csv('./diarios_historicos.csv')
noticias=noticias.drop('descripcion' ,axis=1)
fechas = pd.read_csv('./fechas.csv')

diarios = list(noticias.diario.unique())
secciones = list(noticias.seccion.unique())
columna_para_nube = ['titulo', 'descripcion']

st.set_page_config(
        page_title="Observatorio de noticias",        
        initial_sidebar_state="expanded"
    )


with st.sidebar:
    st.write("Creado por [sebasur90](https://www.linkedin.com/in/sebastian-rodriguez-9b417830/)")

    diarios_select = st.multiselect('Selecciona los  diarios',
                                    diarios, default=diarios)
    secciones_select = st.multiselect('Selecciona las secciones',
                                      secciones, default=secciones)
    palabra_buscada = st.text_input('Buscar palabra', 'Ninguna')

    if st.button('Actualizar Diarios'):
        dia_str = str(dt.datetime.today().date())
        if fechas.iloc[-1]['dia'] == dia_str:
            st.success("Las noticias ya estan actualizadas")
            pass
        else:
            with st.spinner('Actualizando los siguientes diarios..'):            
                scrapper.run()
                st.write("Se actualizaron las noticias")

    


if palabra_buscada == "Ninguna" or palabra_buscada == "":
    st.title("Observatorio de Noticias")
    st.write("""            

            Hola! Bienvenido a la aplicaci贸n de an谩lisis de sentimientos en las noticias. Esta aplicaci贸n extrae las noticias de algunos de los diarios mas
            importantes del pa铆s ( a traves del RSS) y realiza un analisis de sentimientos sobre los titulos de cada una.
            La app permite filtrar por palabra clave y generar una nube de palabras con los resultados 

            De acuerdo al sentimiento analizado sobre cada noticia encontraremos 3 grupos: 
            
            **Sentimiento Positivo:** "YPF aument贸 la distribuci贸n de gasoil y asegur贸 que el campo tiene garantizado el abastecimiento" 
               *Probabilidades: NEGATIVA=0.008 ---  NEUTRA 0.43  ---    POSITIVA 0.56 (GANADOR --> POSITIVA)* 
               
            
            **Sentimiento Neutro:** "El aeroclub de Comodoro Rivadavia celebr贸 su 87掳 aniversario"
            *Probabilidades: NEGATIVA=0.02 ---  NEUTRA 0.67  ---    POSITIVA 0.30 (GANADOR --> NEUTRA)* 
            
            **Sentimiento Negativo:** "Crecen las expectativas de inflaci贸n del mercado"
            *Probabilidades: NEGATIVA=0.60 ---  NEUTRA 0.37  ---    POSITIVA 0.15 (GANADOR --> NEGATIVA)* 
            
            """)

    

    pass
else:
    #st.title("Observatorio de Noticias")
    st.header(f"Resultados para : {palabra_buscada}")
    
    noticias = noticias[noticias['titulo'].str.contains(palabra_buscada)]

st.session_state['dataframe_filtrado'] = noticias[(noticias.diario.isin(
    diarios_select)) & (noticias.seccion.isin(secciones_select))]

st.subheader("Muestra aleatoria de noticias")
st.dataframe(st.session_state['dataframe_filtrado'].sample(frac=1))
st.session_state['dataframe_agrupado'] = st.session_state['dataframe_filtrado'].groupby(
    'diario')[['pond_negativos', 'pond_neutro', 'pond_positivo']].mean().reset_index()

fig = px.bar(st.session_state['dataframe_agrupado'], x="diario", y=['pond_neutro', "pond_negativos", 'pond_positivo'], text_auto=True,
             title=f"Analisis de sentimientos para las noticias seleccionadas seg煤n el diario"
             )

newnames = {'pond_neutro':'NEUTRAL', 'pond_negativos': 'NEGATIVA','pond_positivo': 'POSITIVA'}
fig.for_each_trace(lambda t: t.update(name = newnames[t.name],
                                      legendgroup = newnames[t.name],
                                      hovertemplate = t.hovertemplate.replace(t.name, newnames[t.name])
                                     )
                  )
fig.update_layout(
    xaxis_title="Diarios",
    yaxis_title="Probabilidades (de 0 a 1)",
    
)                  
fig.update_layout(legend_title_text='Probabilidades')

st.plotly_chart(fig)


def transforma_letras_para_wordcloud(dataframe_noticias):
    columna_analizada = list(dataframe_noticias['titulo'])
    acentos = {'谩': 'a', '茅': 'e', '铆': 'i', '贸': 'o', '煤': 'u',
               '脕': 'A', 'E': 'E', '脥': 'I', '脫': 'O', '脷': 'U'}
    lista_palabras_para_wordcloud = []
    for palabras in columna_analizada:
        palabras_div = palabras.split(' ')
        for letras in palabras_div:
            for acen in acentos:
                if acen in letras:
                    letras = letras.replace(acen, acentos[acen])
            lista_palabras_para_wordcloud.append(letras.lower())
    return ' '.join(lista_palabras_para_wordcloud)


def genera_wordcloud(dataframe_noticias):
    palabras_para_wordcloud = transforma_letras_para_wordcloud(
        dataframe_noticias)
    palabras_ignoradas = set(['a', 'ante', 'con', 'contra', 'de', 'desde', 'durante', 'en', 'para', 'por', 'segun', 'sin', 'sobre', 'el', 'la', 'los', 'las',
                              '...', 'y', 'hoy', 'este', 'cuanto',  'un', 'del', 'las',  'que', 'con', 'todos',  'es', '驴qu茅',  'como', 'cada',
                              'jueves', '驴cuanto', 'hoy', 'al', 'cual', 'se', 'su', 'sus', 'lo', 'una', 'un', 'tiene',
                              'le', 'habia'])

    wordcloud = WordCloud(width=1920, height=1080, stopwords=palabras_ignoradas).generate(
        palabras_para_wordcloud)
    plt.imshow(wordcloud, interpolation='bilinear')
    plt.axis("off")
    st.pyplot()


if st.button('Generar Nube'):
    genera_wordcloud(st.session_state['dataframe_filtrado'])
else:
    pass