Spaces:
Runtime error
Runtime error
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
|