|
import gradio as gr
|
|
from src.chatbot import chatbot, keyword_search
|
|
|
|
|
|
|
|
|
|
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"):
|
|
|
|
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,
|
|
additional_inputs = [db_inputs, prompt_language],
|
|
)
|
|
|
|
with gr.Tab("KeywordSearch"):
|
|
|
|
with gr.Blocks() as Block:
|
|
|
|
keyword_box = gr.Textbox(label='keyword')
|
|
|
|
|
|
with gr.Accordion('Detailed filters', open=False):
|
|
|
|
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')
|
|
|
|
|
|
|
|
|
|
search_btn = gr.Button('Search')
|
|
|
|
with gr.Column(visible=False) as output_col:
|
|
results_df = gr.Dataframe(label='Results', interactive=False)
|
|
|
|
|
|
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)
|
|
|
|
|
|
def search(keyword, n, party):
|
|
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],
|
|
)
|
|
|
|
|
|
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)
|
|
|
|
|
|
|