paper_qa / app.py
chansung's picture
Update app.py
ba0d9a2 verified
raw history blame
No virus
17.8 kB
import gradio as gr
import copy
import datasets
STYLE = """
.main {
width: 90% !important;
margin: 0 auto; /* Center the container */
}
.small-font{
font-size: 12pt !important;
}
.small-font:hover {
font-size: 20px !important;
transition: font-size 0.3s ease-out;
transition-delay: 0.8s;
}
.group {
padding-top: 10px;
padding-left: 10px;
padding-right: 10px;
padding-bottom: 10px;
border: 2px dashed gray;
border-radius: 20px;
box-shadow: 5px 3px 10px 1px rgba(0, 0, 0, 0.4) !important;
}
.accordion > button > span{
font-size: 12pt !important;
}
.accordion {
border-style: dashed !important;
border-left-width: 2px !important;
border-bottom-width: 2.5px !important;
border-top: none !important;
border-right: none !important;
box-shadow: none !important;
}
.no-gap {
gap: 0px;
}
.no-radius {
border-radius: 0px;
}
#search_input > label > span {
display: none;
}
#exp-type > span {
display: none;
}
"""
dataset_repo_id = "chansung/auto-paper-qa2"
ds = datasets.load_dataset(dataset_repo_id)
title2qna = {}
date2qna = {}
longest_qans = 0
def count_nans(row):
count = 0
for _, (k, v) in enumerate(data.items()):
if v is None:
count = count + 1
return count
for data in ds["train"]:
date = data["target_date"].strftime("%Y-%m-%d")
if date in date2qna:
papers = copy.deepcopy(date2qna[date])
for paper in papers:
if paper["title"] == data["title"]:
if count_nans(paper) > count_nans(data):
date2qna[date].remove(paper)
date2qna[date].append(data)
del papers
else:
date2qna[date] = [data]
for date in date2qna:
papers = date2qna[date]
for paper in papers:
title2qna[paper["title"]] = paper
titles = title2qna.keys()
sorted_dates = sorted(date2qna.keys())
last_date = sorted_dates[-1]
last_papers = date2qna[last_date]
selected_paper = last_papers[0]
def get_papers(date):
papers = [paper["title"] for paper in date2qna[date]]
return gr.Dropdown(
papers,
value=papers[0]
)
def set_paper(date, paper_title):
selected_paper = None
for paper in date2qna[date]:
if paper["title"] == paper_title:
selected_paper = paper
break
return (
gr.Markdown(f"# {selected_paper['title']}"), gr.Markdown(selected_paper["summary"]),
gr.Markdown(f"## πŸ™‹ {selected_paper['0_question']}"),
gr.Markdown(f"β†ͺ **(ELI5)** {selected_paper['0_answers:eli5']}"),
gr.Markdown(f"β†ͺ **(Technical)** {selected_paper['0_answers:expert']}"),
gr.Markdown(f"## πŸ™‹πŸ™‹ {selected_paper['0_additional_depth_q:follow up question']}"),
gr.Markdown(f"β†ͺ **(ELI5)** {selected_paper['0_additional_depth_q:answers:eli5']}"),
gr.Markdown(f"β†ͺ **(Technical)** {selected_paper['0_additional_depth_q:answers:expert']}"),
gr.Markdown(f"## πŸ™‹πŸ™‹ {selected_paper['0_additional_breath_q:follow up question']}"),
gr.Markdown(f"β†ͺ **(ELI5)** {selected_paper['0_additional_breath_q:answers:eli5']}"),
gr.Markdown(f"β†ͺ **(Technical)** {selected_paper['0_additional_breath_q:answers:expert']}"),
gr.Markdown(f"## πŸ™‹ {selected_paper['1_question']}"),
gr.Markdown(f"β†ͺ **(ELI5)** {selected_paper['1_answers:eli5']}"),
gr.Markdown(f"β†ͺ **(Technical)** {selected_paper['1_answers:expert']}"),
gr.Markdown(f"## πŸ™‹πŸ™‹ {selected_paper['1_additional_depth_q:follow up question']}"),
gr.Markdown(f"β†ͺ **(ELI5)** {selected_paper['1_additional_depth_q:answers:eli5']}"),
gr.Markdown(f"β†ͺ **(Technical)** {selected_paper['1_additional_depth_q:answers:expert']}"),
gr.Markdown(f"## πŸ™‹πŸ™‹ {selected_paper['1_additional_breath_q:follow up question']}"),
gr.Markdown(f"β†ͺ **(ELI5)** {selected_paper['1_additional_breath_q:answers:eli5']}"),
gr.Markdown(f"β†ͺ **(Technical)** {selected_paper['1_additional_breath_q:answers:expert']}"),
gr.Markdown(f"## πŸ™‹ {selected_paper['2_question']}"),
gr.Markdown(f"β†ͺ **(ELI5)** {selected_paper['2_answers:eli5']}"),
gr.Markdown(f"β†ͺ **(Technical)** {selected_paper['2_answers:expert']}"),
gr.Markdown(f"## πŸ™‹πŸ™‹ {selected_paper['2_additional_depth_q:follow up question']}"),
gr.Markdown(f"β†ͺ **(ELI5)** {selected_paper['2_additional_depth_q:answers:eli5']}"),
gr.Markdown(f"β†ͺ **(Technical)** {selected_paper['2_additional_depth_q:answers:expert']}"),
gr.Markdown(f"## πŸ™‹πŸ™‹ {selected_paper['2_additional_breath_q:follow up question']}"),
gr.Markdown(f"β†ͺ **(ELI5)** {selected_paper['2_additional_breath_q:answers:eli5']}"),
gr.Markdown(f"β†ͺ **(Technical)** {selected_paper['2_additional_breath_q:answers:expert']}"),
)
def change_exp_type(exp_type):
if exp_type == "ELI5":
return (
gr.Markdown(visible=True), gr.Markdown(visible=False), gr.Markdown(visible=True), gr.Markdown(visible=False), gr.Markdown(visible=True), gr.Markdown(visible=False),
gr.Markdown(visible=True), gr.Markdown(visible=False), gr.Markdown(visible=True), gr.Markdown(visible=False), gr.Markdown(visible=True), gr.Markdown(visible=False),
gr.Markdown(visible=True), gr.Markdown(visible=False), gr.Markdown(visible=True), gr.Markdown(visible=False), gr.Markdown(visible=True), gr.Markdown(visible=False),
)
else:
return (
gr.Markdown(visible=False), gr.Markdown(visible=True), gr.Markdown(visible=False), gr.Markdown(visible=True), gr.Markdown(visible=False), gr.Markdown(visible=True),
gr.Markdown(visible=False), gr.Markdown(visible=True), gr.Markdown(visible=False), gr.Markdown(visible=True), gr.Markdown(visible=False), gr.Markdown(visible=True),
gr.Markdown(visible=False), gr.Markdown(visible=True), gr.Markdown(visible=False), gr.Markdown(visible=True), gr.Markdown(visible=False), gr.Markdown(visible=True),
)
def search(search_in, max_results=3):
results = []
for title in titles:
if len(results) > 3:
break
else:
if search_in in title:
results.append(title)
return (
gr.Textbox(
visible=True if len(results) > 0 else False,
value=results[0] if len(results) > 0 else ""
),
gr.Textbox(
visible=True if len(results) > 1 else False,
value=results[1] if len(results) > 1 else ""
),
gr.Textbox(
visible=True if len(results) > 2 else False,
value=results[2] if len(results) > 2 else ""
)
)
UPDATE_SEARCH_RESULTS = f"""
function search(searchIn, maxResults = 3) {{
if (searchIn.trim().length > 0) {{
const results = [];
let titles = {list(titles)};
for (const title of titles) {{ // Assuming 'titles' is an array defined elsewhere
if (results.length > 3) {{
break;
}} else {{
if (title.toLowerCase().includes(searchIn.toLowerCase())) {{ // JavaScript's equivalent to Python's 'in'
results.push(title);
}}
}}
}}
// Handle UI elements (Explanation below)
const resultElements = [1, 2, 3].map(index => {{
return results[index - 1] || '';
}});
if (resultElements[0] == '') {{
document.getElementById('search_r1').style.display = 'none';
}} else {{
document.getElementById('search_r1').style.display = 'block';
}}
if (resultElements[1] == '') {{
document.getElementById('search_r2').style.display = 'none';
}} else {{
document.getElementById('search_r2').style.display = 'block';
}}
if (resultElements[2] == '') {{
document.getElementById('search_r3').style.display = 'none';
}} else {{
document.getElementById('search_r3').style.display = 'block';
}}
return resultElements;
}} else {{
document.getElementById('search_r1').style.display = 'none';
document.getElementById('search_r2').style.display = 'none';
document.getElementById('search_r3').style.display = 'none';
return ['', '', '']
}}
}}
"""
def set_date(title):
paper = title2qna[title]
date = paper["target_date"].strftime("%Y-%m-%d")
return date
def set_papers(date, title):
papers = [paper["title"] for paper in date2qna[date]]
return (
gr.Dropdown(choices=papers, value=title),
gr.Textbox("")
)
with gr.Blocks(css=STYLE) as demo:
gr.Markdown("# Let's explore papers with auto generated Q&As")
with gr.Column(elem_classes=["group"]):
with gr.Row():
date_dd = gr.Dropdown(
sorted_dates,
value=last_date,
label="Select date",
interactive=True,
scale=3,
)
papers_dd = gr.Dropdown(
[paper["title"] for paper in last_papers],
value=selected_paper["title"],
label="Select paper title",
interactive=True,
scale=7,
)
with gr.Column(elem_classes=["no-gap"]):
search_in = gr.Textbox("", placeholder="Enter keywords to search...", elem_id="search_input")
search_r1 = gr.Button(visible=False, elem_id="search_r1", elem_classes=["no-radius"])
search_r2 = gr.Button(visible=False, elem_id="search_r2", elem_classes=["no-radius"])
search_r3 = gr.Button(visible=False, elem_id="search_r3", elem_classes=["no-radius"])
title = gr.Markdown(f"# {selected_paper['title']}")
summary = gr.Markdown(f"{selected_paper['summary']}", elem_classes=["small-font"])
with gr.Row():
with gr.Column(scale=7):
gr.Markdown("## Auto generated Questions & Answers")
exp_type = gr.Radio(choices=["ELI5", "Technical"], value="ELI5", elem_id="exp-type", scale=3)
# 1
with gr.Column(elem_classes=["group"], visible=True) as q_0:
basic_q_0 = gr.Markdown(f"## πŸ™‹ {selected_paper['0_question']}")
basic_q_eli5_0 = gr.Markdown(f"β†ͺ **(ELI5)** {selected_paper['0_answers:eli5']}", elem_classes=["small-font"])
basic_q_expert_0 = gr.Markdown(f"β†ͺ **(Technical)** {selected_paper['0_answers:expert']}", visible=False, elem_classes=["small-font"])
with gr.Accordion("Additional question #1", open=False, elem_classes=["accordion"]) as aq_0_0:
depth_q_0 = gr.Markdown(f"## πŸ™‹πŸ™‹ {selected_paper['0_additional_depth_q:follow up question']}")
depth_q_eli5_0 = gr.Markdown(f"β†ͺ **(ELI5)** {selected_paper['0_additional_depth_q:answers:eli5']}", elem_classes=["small-font"])
depth_q_expert_0 = gr.Markdown(f"β†ͺ **(Technical)** {selected_paper['0_additional_depth_q:answers:expert']}", visible=False, elem_classes=["small-font"])
with gr.Accordion("Additional question #2", open=False, elem_classes=["accordion"]) as aq_0_1:
breath_q_0 = gr.Markdown(f"## πŸ™‹πŸ™‹ {selected_paper['0_additional_breath_q:follow up question']}")
breath_q_eli5_0 = gr.Markdown(f"β†ͺ **(ELI5)** {selected_paper['0_additional_breath_q:answers:eli5']}", elem_classes=["small-font"])
breath_q_expert_0 = gr.Markdown(f"β†ͺ **(Technical)** {selected_paper['0_additional_breath_q:answers:expert']}", visible=False, elem_classes=["small-font"])
# 2
with gr.Column(elem_classes=["group"], visible=True) as q_1:
basic_q_1 = gr.Markdown(f"## πŸ™‹ {selected_paper['1_question']}")
basic_q_eli5_1 = gr.Markdown(f"β†ͺ **(ELI5)** {selected_paper['1_answers:eli5']}", elem_classes=["small-font"])
basic_q_expert_1 = gr.Markdown(f"β†ͺ **(Technical)** {selected_paper['1_answers:expert']}", visible=False, elem_classes=["small-font"])
with gr.Accordion("Additional question #1", open=False, elem_classes=["accordion"]) as aq_1_0:
depth_q_1 = gr.Markdown(f"## πŸ™‹πŸ™‹ {selected_paper['1_additional_depth_q:follow up question']}")
depth_q_eli5_1 = gr.Markdown(f"β†ͺ **(ELI5)** {selected_paper['1_additional_depth_q:answers:eli5']}", elem_classes=["small-font"])
depth_q_expert_1 = gr.Markdown(f"β†ͺ **(Technical)** {selected_paper['1_additional_depth_q:answers:expert']}", visible=False, elem_classes=["small-font"])
with gr.Accordion("Additional question #2", open=False, elem_classes=["accordion"]) as aq_1_1:
breath_q_1 = gr.Markdown(f"## πŸ™‹πŸ™‹ {selected_paper['1_additional_breath_q:follow up question']}")
breath_q_eli5_1 = gr.Markdown(f"β†ͺ **(ELI5)** {selected_paper['1_additional_breath_q:answers:eli5']}", elem_classes=["small-font"])
breath_q_expert_1 = gr.Markdown(f"β†ͺ **(Technical)** {selected_paper['1_additional_breath_q:answers:expert']}", visible=False, elem_classes=["small-font"])
# 3
with gr.Column(elem_classes=["group"], visible=True) as q_2:
basic_q_2 = gr.Markdown(f"## πŸ™‹ {selected_paper['2_question']}")
basic_q_eli5_2 = gr.Markdown(f"β†ͺ **(ELI5)** {selected_paper['2_answers:eli5']}", elem_classes=["small-font"])
basic_q_expert_2 = gr.Markdown(f"β†ͺ **(Technical)** {selected_paper['2_answers:expert']}", visible=False, elem_classes=["small-font"])
with gr.Accordion("Additional question #1", open=False, elem_classes=["accordion"]) as aq_2_0:
depth_q_2 = gr.Markdown(f"## πŸ™‹πŸ™‹ {selected_paper['2_additional_depth_q:follow up question']}")
depth_q_eli5_2 = gr.Markdown(f"β†ͺ **(ELI5)** {selected_paper['2_additional_depth_q:answers:eli5']}", elem_classes=["small-font"])
depth_q_expert_2 = gr.Markdown(f"β†ͺ **(Technical)** {selected_paper['2_additional_depth_q:answers:expert']}", visible=False, elem_classes=["small-font"])
with gr.Accordion("Additional question #2", open=False, elem_classes=["accordion"]) as aq_2_1:
breath_q_2 = gr.Markdown(f"## πŸ™‹πŸ™‹ {selected_paper['2_additional_breath_q:follow up question']}")
breath_q_eli5_2 = gr.Markdown(f"β†ͺ **(ELI5)** {selected_paper['2_additional_breath_q:answers:eli5']}", elem_classes=["small-font"])
breath_q_expert_2 = gr.Markdown(f"β†ͺ **(Technical)** {selected_paper['2_additional_breath_q:answers:expert']}", visible=False, elem_classes=["small-font"])
gr.Markdown("The target papers are collected from [Hugging Face πŸ€— Daily Papers](https://huggingface.co/papers) on a daily basis. "
"The entire data is generated by [Google's Gemini 1.0](https://deepmind.google/technologies/gemini/) Pro. "
"If you are curious how it is done, visit the [Auto Paper Q&A Generation project repository](https://github.com/deep-diver/auto-paper-analysis) "
"Also, the generated dataset is hosted on Hugging Face πŸ€— Dataset repository as well([Link](https://huggingface.co/datasets/chansung/auto-paper-qa2)). ")
search_r1.click(
set_date,
search_r1,
date_dd
).then(
set_papers,
inputs=[date_dd, search_r1],
outputs=[papers_dd, search_in]
)
search_r2.click(
set_date,
search_r2,
date_dd
).then(
set_papers,
inputs=[date_dd, search_r2],
outputs=[papers_dd, search_in]
)
search_r3.click(
set_date,
search_r3,
date_dd
).then(
set_papers,
inputs=[date_dd, search_r3],
outputs=[papers_dd, search_in]
)
date_dd.input(
get_papers,
date_dd,
papers_dd
).then(
set_paper,
[date_dd, papers_dd],
[
title, summary,
basic_q_0, basic_q_eli5_0, basic_q_expert_0,
depth_q_0, depth_q_eli5_0, depth_q_expert_0,
breath_q_0, breath_q_eli5_0, breath_q_expert_0,
basic_q_1, basic_q_eli5_1, basic_q_expert_1,
depth_q_1, depth_q_eli5_1, depth_q_expert_1,
breath_q_1, breath_q_eli5_1, breath_q_expert_1,
basic_q_2, basic_q_eli5_2, basic_q_expert_2,
depth_q_2, depth_q_eli5_2, depth_q_expert_2,
breath_q_2, breath_q_eli5_2, breath_q_expert_2
]
)
papers_dd.change(
set_paper,
[date_dd, papers_dd],
[
title, summary,
basic_q_0, basic_q_eli5_0, basic_q_expert_0,
depth_q_0, depth_q_eli5_0, depth_q_expert_0,
breath_q_0, breath_q_eli5_0, breath_q_expert_0,
basic_q_1, basic_q_eli5_1, basic_q_expert_1,
depth_q_1, depth_q_eli5_1, depth_q_expert_1,
breath_q_1, breath_q_eli5_1, breath_q_expert_1,
basic_q_2, basic_q_eli5_2, basic_q_expert_2,
depth_q_2, depth_q_eli5_2, depth_q_expert_2,
breath_q_2, breath_q_eli5_2, breath_q_expert_2
]
)
search_in.change(
inputs=[search_in],
outputs=[search_r1, search_r2, search_r3],
js=UPDATE_SEARCH_RESULTS,
fn=None
)
exp_type.select(
change_exp_type,
exp_type,
[
basic_q_eli5_0, basic_q_expert_0, depth_q_eli5_0, depth_q_expert_0, breath_q_eli5_0, breath_q_expert_0,
basic_q_eli5_1, basic_q_expert_1, depth_q_eli5_1, depth_q_expert_1, breath_q_eli5_1, breath_q_expert_1,
basic_q_eli5_2, basic_q_expert_2, depth_q_eli5_2, depth_q_expert_2, breath_q_eli5_2, breath_q_expert_2
]
)
demo.launch(share=True)