PoliticsToYou / Home.py
TomData's picture
spelling
456a93d
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>PoliticsToYou</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