Spaces:
Sleeping
Sleeping
import gradio as gr | |
from src.chatbot import chatbot, keyword_search | |
#from gradio_calendar import Calendar | |
#from datetime import datetime | |
# Define important variables | |
legislature_periods = [ | |
"All", | |
"20. Legislaturperiode", | |
"19. Legislaturperiode", | |
"18. Legislaturperiode", | |
"17. Legislaturperiode", | |
"16. Legislaturperiode", | |
"15. Legislaturperiode", | |
"14. Legislaturperiode", | |
"13. Legislaturperiode", | |
"12. Legislaturperiode", | |
"11. Legislaturperiode", | |
"10. Legislaturperiode", | |
"9. Legislaturperiode", | |
"8. Legislaturperiode", | |
"7. Legislaturperiode", | |
"6. Legislaturperiode", | |
"5. Legislaturperiode", | |
"4. Legislaturperiode", | |
"3. Legislaturperiode", | |
"2. Legislaturperiode", | |
"1. Legislaturperiode" | |
] | |
partys = ['All','CDU/CSU','SPD','AfD','Grüne','FDP','DIE LINKE.','GB/BHE','DRP', 'WAV', 'NR', 'BP', 'FU', 'SSW', 'KPD', 'DA', 'FVP','DP','Z', 'PDS','Fraktionslos','not found', 'Gast'] | |
with gr.Blocks() as App: | |
with gr.Tab("ChatBot"): | |
with gr.Blocks(fill_height=True): | |
with gr.Accordion(open=False, label="Filter database"): | |
# Apply RAG using chatbut function from local file ChatBot.py | |
db_inputs = gr.Dropdown(choices=legislature_periods, value="All", multiselect=True, label="Legislature", info="Select a combination of legislatures as basis for the chatbot's replies", show_label=True) | |
prompt_language = gr.Dropdown(choices=["DE", "EN"], value="DE",label="Language", info="Choose output language", multiselect=False) | |
gr.ChatInterface(chatbot, | |
title="PoliticsToYou", | |
description= "Ask anything about your favorite political topic from any legislature period", | |
examples=[ | |
["Wie steht die CDU zur Cannabislegalisierung?", "All", "DE"], | |
["Wie steht die FDP zur Rente?", "All", "DE"], | |
["Was sagten die Parteien in der ersten Legislaturperiode über die nazi Vergangenheit?", "1. Legislaturperiode", "DE"], | |
["Wie wird die Ehe für alle diskutiert?", "18. Legislaturperiode", "DE"], | |
["How is the GDR perceived?", "11. Legislaturperiode", "EN"] | |
], | |
cache_examples=True, #true increases loading time | |
additional_inputs = [db_inputs, prompt_language], | |
) | |
with gr.Tab("KeywordSearch"): | |
with gr.Blocks() as Block: | |
# Keyword Input | |
keyword_box = gr.Textbox(label='keyword') | |
#Additional Input (hidden) | |
with gr.Accordion('Detailed filters', open=False): | |
# Row orientation | |
with gr.Row() as additional_input: | |
n_slider = gr.Slider(label="Number of Results",info="Other filters reduces the returned results", minimum=1, maximum=100, step=1, value=10) | |
party_dopdown = gr.Dropdown(value='All', choices=partys, label='Party') | |
# ToDo: Add date or legislature filter as input | |
#start_date = Calendar(value="1949-01-01", type="datetime", label="Select start date", info="Click the calendar icon to bring up the calendar.", interactive=True) | |
#end_date = Calendar(value=datetime.today().strftime('%Y-%m-%d'), type="datetime", label="Select end date", info="Click the calendar icon to bring up the calendar.", interactive=True) | |
search_btn = gr.Button('Search') | |
with gr.Column(visible=False) as output_col: | |
results_df = gr.Dataframe(label='Results', interactive=False) | |
# Download results from keyword search | |
with gr.Accordion('Would you like to download your results?', open=False) as download_row: | |
with gr.Row(): | |
ftype_dropdown = gr.Dropdown(choices=["csv","excel","json"], label="Format") | |
export_btn = gr.Button('Export') | |
file = gr.File(file_types=[".xlsx", ".csv", ".json"], visible=False) | |
# Keyword Search on click | |
def search(keyword, n, party): # ToDo: Include party and timedate | |
return { | |
output_col: gr.Column(visible=True), | |
results_df: keyword_search(query=keyword, n=n, party_filter=party), | |
} | |
search_btn.click( | |
fn=search, | |
inputs=[keyword_box, n_slider, party_dopdown], | |
outputs=[output_col, results_df], | |
) | |
# Export data to a downloadable format | |
def export(df, keyword, ftype=None): | |
if ftype == "csv": | |
file = f'{keyword}.csv' | |
df.to_csv(file, index = False) | |
return gr.File(value=file,visible=True) | |
elif ftype == "json": | |
file = f'{keyword}.json' | |
df.to_json(file, index = True) | |
return gr.File(value=file,visible=True) | |
else: | |
file = f'{keyword}.xlsx' | |
df.to_excel(file, index = True) | |
return gr.File(value=file,visible=True) | |
export_btn.click( | |
fn=export, | |
inputs=[results_df, keyword_box, ftype_dropdown], | |
outputs=[file], | |
) | |
with gr.Tab("About"): | |
gr.Markdown(""" | |
<h2>Welcome to <strong>Politics2you</strong> - your playground for investigating the heart of politics in Germany</h2> | |
<ul> | |
<p>Would you like to gain insights into political debates or reveal party positions on specific topics from any legislature?</p> | |
<p>You can use the ChatBot to ask all your questions or search for related speech content in the Keyword Search section.</p> | |
</ul> | |
<p>Looking forward to your feedback!</p> | |
<h3>Further improvements & Ideas:</h3> | |
<ul> | |
<li>Experiment with different LLMs and Templates</li> | |
<li>Include chat history in RAG</li> | |
<li>Add a date or legislature filter to KeywordSearch</li> | |
<li>Exclude short document splits when creating the vectorstore</li> | |
<li>Improve inference time</li> | |
<li>Add analytic tools for party manifestos</li> | |
<li>Expand the scope to different countries</li> | |
<li>Update vector databases with new speech entries every n months (currently static)</li> | |
</ul> | |
<p>Big thank you to the OpenDiscourse team for creating the underlying speeches corpus. Check out their website <a href="https://opendiscourse.de/">here</a>.</p> | |
""" | |
) | |
if __name__ == "__main__": | |
App.launch(share=False) # true not supported on hf spaces | |