Spaces:
Running
Running
File size: 4,272 Bytes
b6d30d7 1e510a5 b6d30d7 1e510a5 b6d30d7 1e510a5 1c9f0c5 b6d30d7 b616ac6 b6d30d7 29cfaca b6d30d7 1c9f0c5 b6d30d7 a58582b b6d30d7 1c9f0c5 b6d30d7 1c9f0c5 b6d30d7 1c9f0c5 b6d30d7 1c9f0c5 1e510a5 1c9f0c5 55a4f2f |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 |
import gradio as gr
from Bio import Entrez
from datetime import datetime, timedelta
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):
if not mesh_terms or not email:
return "Please provide MeSH terms and email.", None, None
# Set default dates
end_date = datetime.now()
start_date = end_date - timedelta(days=7)
start_date_str = start_date.strftime("%Y-%m-%d")
end_date_str = end_date.strftime("%Y-%m-%d")
# Join MeSH terms for query
query = " AND ".join([f'"{term}"[MeSH Terms]' for term in mesh_terms.split(",")])
# Fetch PubMed IDs
pubmed_ids = fetch_pubmed(query, email, start_date_str, end_date_str)
if not pubmed_ids:
return "No articles found for the given search terms and date range.", None, None
# Fetch article details
try:
records = fetch_details(pubmed_ids)
except Exception as e:
return f"Error fetching article details: {str(e)}", None, None
# Compile markdown content
markdown_content = compile_summaries(records)
# Create temporary files
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
markdown_filename = f"pubmed_results_{timestamp}.md"
text_filename = f"pubmed_results_{timestamp}.txt"
# Save files
try:
with open(markdown_filename, "w", encoding="utf-8") as f:
f.write(markdown_content)
with open(text_filename, "w", encoding="utf-8") as f:
f.write(markdown_content)
except Exception as e:
return f"Error saving files: {str(e)}", None, None
return "Search completed successfully!", markdown_filename, text_filename
# 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
# Gradio interface components
with gr.Blocks() as app:
gr.Markdown("# PubMed Search Tool for 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
)
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)
# 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],
outputs=[status_output, markdown_file, text_file]
)
app.launch()
|