File size: 9,772 Bytes
c188624 538f893 cd22fcf c188624 3285b2f d93b1a1 3cb588d c188624 d93b1a1 2223cef 2dc3466 b6bf0ba 2223cef 32c554f 4f11d9a 32c554f c188624 c8e2bd5 c2eb6c0 19b6be2 3a6124d c188624 a17b65d f0d04b2 8ca54ac 05edb91 8ca54ac a17b65d d85140a a17b65d a4616f8 a17b65d 615de2a a17b65d c90738f a17b65d e2fa215 a17b65d d85140a a17b65d 5421eee ba4a859 5421eee 4a0bcf5 5421eee 5d8ce62 5421eee a17b65d e85f2a8 37f8221 c90738f cef2390 8d8174b c90738f 6e18ecb c90738f c188624 3a6124d 083cdef c188624 b3ca400 c188624 d56623b 8931e64 f0e3cd1 8931e64 f0e3cd1 8931e64 b3ca400 7779b1b b3ca400 5f3ce59 f34c031 5e83447 ab8e818 7779b1b 8931e64 f34c031 f0e3cd1 f34c031 5579ffd 8931e64 f028df8 0b42aa0 750fb1c 0b42aa0 750fb1c f028df8 750fb1c f028df8 750fb1c 0b42aa0 8931e64 d56623b b3ca400 c188624 0bb7e36 c188624 963ec7c 6803992 b518608 bd37214 57bca4c 5997e16 e6f4a11 75dfc30 2819576 75dfc30 94e535e ad40ecb b518608 2223cef 1464ea3 ae96240 |
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 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 |
import pandas as pd
import streamlit as st
import streamlit.components.v1 as components
from transformers import *
from carga_articulos import cargar_articulos
from preprocesamiento_articulos import limpieza_articulos
from entrenamiento_modelo import term_document_matrix, tf_idf_score
from resultados_consulta import resultados_consulta, detalles_resultados
import tensorflow as tf
import tensorflow.python.ops.numpy_ops.np_config as np_config
from math import ceil
def split_frame(input_df, rows):
df=[]
for i in range(0, len(input_df), rows):
df.append(input_df.iloc[i : i + rows, :])
return df
def paginar_frame(df):
N_cards_per_row = 1
for n_row, row in df.reset_index().iterrows():
i = n_row%N_cards_per_row
if i==0:
st.write("---")
cols = st.columns(N_cards_per_row, gap="large")
# draw the card
with cols[n_row%N_cards_per_row]:
if 'answer' in row:
if (row['answer']):
st.info(row['answer'])
st.caption(f"{row['feed'].strip()} - {row['seccion'].strip()} - {row['fecha'].strip()} ")
st.markdown(f"**{row['titulo'].strip()}**")
st.markdown(f"{row['resumen'].strip()}")
st.markdown(f"{row['link']}")
def crear_indice():
df=cargar_articulos()
vocab = limpieza_articulos(df)
td_matrix=term_document_matrix(df, vocab, 'ID', 'titulo')
td_idf_matrix=tf_idf_score(td_matrix, df.ID.values)
td_idf_matrix.to_csv('articulos_indexados.csv')
def load_qa_model():
tokenizer = AutoTokenizer.from_pretrained('dccuchile/bert-base-spanish-wwm-cased', use_fast="false")
model = TFAutoModelForQuestionAnswering.from_pretrained("Lisibonny/modelo_qa_beto_squad_es_5000")
return tokenizer, model
# 4. Use streamlit to create a web app
def main():
#crear_indice()
st.set_page_config(page_title="Buscador de noticias periodicos dominicanos", page_icon="📰", layout="centered")
st.image('repartidor_periodicos.jpeg', width=150)
st.header('El Repartidor Dominicano')
# Sidebar
st.sidebar.header("Acerca De")
st.sidebar.markdown(
"El Repartidor Dominicano es un sistema de recuperación de información desde periódicos dominicanos que usa técnicas de aprendizaje automático."
)
st.sidebar.markdown("Desarrollado por [Lisibonny Beato-Castro](https://scholar.google.com/citations?user=KSzjfeUAAAAJ&hl=es&oi=ao)")
st.sidebar.header("Artículos Indexados")
st.sidebar.markdown(
"""
Los artículos noticiosos indexados son descargados de los feeds RSS de varios periódicos dominicanos.
"""
)
st.sidebar.header("Aviso Legal Sobre Uso de Datos")
st.sidebar.markdown(
"""
El uso de los artículos en este sitio tiene fines no comerciales, respetando los derechos de autor. Implementamos las mejores prácticas para el uso de RSS, tal y como son recomendadas por el Berkman Klein Center for Internet & Society de la Universidad de Harvard.
Si quieres saber más acerca de los feeds RSS o de las mejores prácticas para el uso de RSS, haz clic en los siguientes enlaces:
- [RSS](https://es.wikipedia.org/wiki/RSS)
- [Uso legal de feeds RSS](https://cyber.harvard.edu/publications/2010/news_aggregator_legal_implications_best_practices)
"""
)
st.sidebar.header("¡Cómprame un Café!")
st.sidebar.markdown("Si te gusta este sitio y quieres darme las gracias o animarme a hacer más, puedes hacer una pequeña donación.")
with st.sidebar:
components.html(
"""
<div id="donate-button-container">
<div id="donate-button"></div>
<script src="https://www.paypalobjects.com/donate/sdk/donate-sdk.js" charset="UTF-8"></script>
<script>
PayPal.Donation.Button({
env:'production',
hosted_button_id:'VK5ZAB52ZYDNA',
image: {
src:'https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif',
alt:'Dona con el botón de PayPal',
title:'PayPal - ¡La forma más fácil y segura de pagar en línea!',
}
}).render('#donate-button');
</script>
</div>
"""
)
df=cargar_articulos()
articulos_indexados = pd.read_csv('articulos_indexados.csv')
articulos_indexados = articulos_indexados.set_index('Unnamed: 0')
tokenizer, qa_model = load_qa_model()
query = st.text_input(
"Escribe tus términos de búsqueda o haz una pregunta terminando con el caracter ?:"
)
if query:
# Si se especifico una pregunta
if ('?' in query):
st.write("Contestando a: ", query)
# Verificando cada resumen de los articulos como contexto a la pregunta
cantidad_respuestas = 0
lista_noticias_respuestas = []
df_answer=df
df_answer['answer']=''
progress_text = "Buscando respuestas. Por favor, espere."
my_bar = st.progress(0, text=progress_text)
for i in range(len(df_answer)):
text=df_answer.loc[i, "resumen"]
inputs = tokenizer(query, text, return_tensors='tf')
outputs = qa_model(input_ids=inputs['input_ids'], attention_mask=inputs['attention_mask'])
answer_start_index = int(tf.math.argmax(outputs.start_logits, axis=-1)[0])
answer_end_index = int(tf.math.argmax(outputs.end_logits, axis=-1)[0])
#answer_start_scores = tf.nn.softmax(outputs.start_logits)
#answer_end_scores = tf.nn.softmax(outputs.end_logits)
predict_answer_tokens = inputs.input_ids[0, answer_start_index : answer_end_index + 1]
answer=tokenizer.decode(predict_answer_tokens)
if (len(answer)>0):
#answer_start_scores= tf.math.reduce_sum(answer_start_scores)
#answer_end_scores= tf.math.reduce_sum(answer_end_scores)
#score = answer_start_scores*answer_end_scores
#st.write(f'Aqui {answer_start_scores}' )
#st.write(answer_end_scores)
cantidad_respuestas = cantidad_respuestas + 1
df_answer.loc[i, "answer"] = answer
lista_noticias_respuestas.append(df_answer.loc[i].to_frame().T)
# Barra de progreso
my_bar.progress(i + 1, text=progress_text)
my_bar.empty()
df_noticias_respuestas=pd.concat(lista_noticias_respuestas)
batch_size = 5
pages = split_frame(df_noticias_respuestas, batch_size)
top_menu = st.columns(3)
pagination = st.container()
bottom_menu = st.columns((3))
with pagination:
with bottom_menu[2]:
total_pages = (ceil(cantidad_respuestas / batch_size) if ceil(cantidad_respuestas / batch_size) > 0 else 1)
current_page = st.number_input("Página", min_value=1, max_value=total_pages, step=1)
with bottom_menu[1]:
st.write("---")
st.markdown(f"Página **{current_page}** de **{total_pages}** ")
with top_menu[0]:
pagina_res_fin= batch_size*current_page if batch_size*current_page <= cantidad_respuestas else cantidad_respuestas
st.markdown(f"Respuestas **{(current_page*batch_size)-batch_size+1}-{pagina_res_fin}** de **{cantidad_respuestas}** ")
paginar_frame(pages[current_page - 1])
# Si se especificaron keywords
else:
st.write("Buscando: ", query)
result = resultados_consulta(df,articulos_indexados, query)
if result.empty:
st.info("No se encontraron artículos para la búsqueda solicitada")
else:
df_results=detalles_resultados(df,result)
cantidad_resultados=len(df_results)
batch_size = 5
pages = split_frame(df_results, batch_size)
top_menu = st.columns(3)
pagination = st.container()
bottom_menu = st.columns((3))
with bottom_menu[2]:
total_pages = (ceil(cantidad_resultados / batch_size) if ceil(cantidad_resultados / batch_size) > 0 else 1)
current_page = st.number_input("Página", min_value=1, max_value=total_pages, step=1)
with bottom_menu[1]:
st.write("---")
st.markdown(f"Página **{current_page}** de **{total_pages}** ")
with top_menu[0]:
pagina_res_fin= batch_size*current_page if batch_size*current_page <= cantidad_resultados else cantidad_resultados
st.markdown(f"Artículos **{(current_page*batch_size)-batch_size+1}-{pagina_res_fin}** de **{cantidad_resultados}** ")
with pagination:
paginar_frame(pages[current_page - 1])
if __name__ == "__main__":
main() |