File size: 6,588 Bytes
c188624
 
538f893
cd22fcf
c188624
 
 
 
3285b2f
3cb588d
c188624
805e3e6
2223cef
805e3e6
 
 
 
2223cef
 
32c554f
 
 
 
 
 
 
 
 
 
 
 
 
 
c188624
 
 
 
 
 
 
 
 
 
c8e2bd5
 
fb4de31
3a6124d
c188624
 
 
 
a17b65d
 
f0d04b2
8ca54ac
05edb91
8ca54ac
a17b65d
 
d85140a
a17b65d
615de2a
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
 
 
 
 
 
 
 
 
aa06dc2
c46cd83
bc5855e
699c8d1
 
 
4b58234
 
c188624
 
 
 
 
 
 
 
 
 
0bb7e36
c188624
73d454d
49ac684
8d9f9fe
 
45f4194
8d9f9fe
 
 
 
 
73d454d
49ac684
32c554f
2223cef
c188624
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
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
from math import ceil

@st.cache_data(show_spinner=False)
def split_frame(input_df, rows):
    for i in range(0, len(input_df), rows):
     st.markdown(i)
     st.markdown(i + rows - 1)   
    #df = [input_df.loc[i : i + rows - 1, :] for i in range(0, len(input_df), 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]:
            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('mrm8488/distill-bert-base-spanish-wwm-cased-finetuned-spa-squad2-es', use_fast="false")
    model = TFDistilBertForQuestionAnswering.from_pretrained("mrm8488/distill-bert-base-spanish-wwm-cased-finetuned-spa-squad2-es", from_pt=True)
    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 de máquina."
    )
    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:

        if ('?' in query):
           st.write("Contestando a: ", query)
           text='Un texto es una composición de signos codificados en un sistema de escritura que forma una unidad de sentido.' 
           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])
           predict_answer_tokens = inputs.input_ids[0, answer_start_index : answer_end_index + 1] 
           answer=tokenizer.decode(predict_answer_tokens) 
           st.info(answer)     

        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)
                batch_size = 5
                     
                bottom_menu = st.columns((2,1,1))
                with bottom_menu[1]:
                    total_pages = (ceil(len(df_results) / batch_size) if ceil(len(df_results) / batch_size) > 0 else 1)
                    current_page = st.number_input("Página", min_value=1, max_value=total_pages, step=1)  
                    
                with bottom_menu[0]:
                    
                    st.markdown(f"Página **{current_page}** de **{total_pages}** ") 
                
                pages = split_frame(df_results, batch_size)
                paginar_frame(pages[current_page - 1])
                        
if __name__ == "__main__":
    main()