Spaces:
Running
Running
import gradio as gr | |
from Bio import Entrez | |
from datetime import datetime | |
import os | |
# Function to fetch PubMed articles | |
def fetch_pubmed(query, email, start_date, end_date, max_results=100): | |
Entrez.email = email | |
handle = Entrez.esearch( | |
db="pubmed", | |
term=query, | |
retmax=max_results, | |
sort="pub_date", | |
mindate=start_date, | |
maxdate=end_date, | |
datetype="pdat" | |
) | |
results = Entrez.read(handle) | |
handle.close() | |
ids = results["IdList"] | |
return ids | |
# Function to fetch article details | |
def fetch_details(pubmed_ids): | |
handle = Entrez.efetch(db="pubmed", id=",".join(pubmed_ids), retmode="xml") | |
records = Entrez.read(handle) | |
handle.close() | |
return records | |
# Function to compile Markdown content | |
def compile_summaries(records): | |
content = "# PubMed Search Results\n\n" | |
for record in records["PubmedArticle"]: | |
title = record["MedlineCitation"]["Article"]["ArticleTitle"] | |
abstract = record["MedlineCitation"]["Article"].get("Abstract", {}).get("AbstractText", ["No abstract available."])[0] | |
url = f'https://pubmed.ncbi.nlm.nih.gov/{record["MedlineCitation"]["PMID"]}/' | |
content += f"## [{title}]({url})\n\n{abstract}\n\n" | |
return content | |
# Main function for the Gradio interface | |
def pubmed_search(mesh_terms, email, start_date, end_date): | |
if not mesh_terms or not email: | |
return "Please provide MeSH terms and email.", None, None | |
# Join MeSH terms for query | |
query = " AND ".join([f'"{term}"[MeSH Terms]' for term in mesh_terms]) | |
# Fetch PubMed IDs | |
pubmed_ids = fetch_pubmed(query, email, start_date, end_date) | |
if not pubmed_ids: | |
return "No articles found for the given search terms and date range.", None, None | |
# Fetch article details | |
records = fetch_details(pubmed_ids) | |
if not records["PubmedArticle"]: | |
return "No detailed articles found.", None, None | |
# Compile summaries | |
markdown_content = compile_summaries(records) | |
text_content = markdown_content.replace("\n", "\r\n") | |
# Save files temporarily for download | |
with open("results.md", "w") as md_file: | |
md_file.write(markdown_content) | |
with open("results.txt", "w") as txt_file: | |
txt_file.write(text_content) | |
return "Search completed successfully. Download your files below.", "results.md", "results.txt" | |
# Gradio interface components | |
with gr.Blocks() as app: | |
gr.Markdown("# PubMed Search Tool for Thyroid AI Research") | |
with gr.Row(): | |
mesh_term_input = gr.Textbox(label="Enter a MeSH Term", placeholder="e.g., thyroid", interactive=True) | |
add_button = gr.Button("Add MeSH Term") | |
mesh_terms_box = gr.Textbox(label="Added MeSH Terms", interactive=False, lines=2) | |
start_date = gr.Textbox(label="Start Date (YYYY-MM-DD)", placeholder="e.g., 2025-01-01") | |
end_date = gr.Textbox(label="End Date (YYYY-MM-DD)", placeholder="e.g., 2025-01-07") | |
email_input = gr.Textbox(label="Email", placeholder="Your email (required by PubMed API)", interactive=True) | |
search_button = gr.Button("Search PubMed") | |
status_output = gr.Textbox(label="Status") | |
markdown_file = gr.File(label="Markdown File", interactive=False) | |
text_file = gr.File(label="Text File", interactive=False) | |
# Logic for adding MeSH terms | |
def add_mesh_term(term, terms): | |
if term.strip(): | |
terms = terms.split(",") if terms else [] | |
terms.append(term.strip()) | |
return ", ".join(terms) | |
return terms | |
# Bind functions to interface | |
add_button.click(fn=add_mesh_term, inputs=[mesh_term_input, mesh_terms_box], outputs=mesh_terms_box) | |
search_button.click(fn=pubmed_search, inputs=[mesh_terms_box, email_input, start_date, end_date], outputs=[status_output, markdown_file, text_file]) | |
# Launch app | |
app.launch() | |