Techymom's picture
Update app.py
68b0c4f verified
# !pip install --upgrade gradio
import tempfile
import os
import gradio as gr
import requests
import xml.etree.ElementTree as ET
import pandas as pd
import csv
from io import StringIO
from datetime import datetime
import os
import tempfile
# Correctly defined functions for fetching articles and converting them to CSV format
def fetch_articles(keyword, max_results=10):
search_url = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi"
search_params = {"db": "pubmed", "term": keyword, "retmax": max_results, "usehistory": "y"}
search_response = requests.get(search_url, params=search_params)
search_tree = ET.fromstring(search_response.content)
id_list = [id_.text for id_ in search_tree.findall('.//Id')]
fetch_url = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi"
fetch_params = {"db": "pubmed", "id": ",".join(id_list), "retmode": "xml"}
fetch_response = requests.get(fetch_url, params=fetch_params)
fetch_tree = ET.fromstring(fetch_response.content)
articles = []
for article in fetch_tree.findall('.//PubmedArticle'):
title = article.find('.//ArticleTitle').text
authors_list = [author.find('.//LastName').text + " " + author.find('.//ForeName').text for author in article.findall('.//Author') if author.find('.//LastName') is not None and author.find('.//ForeName') is not None]
authors_formatted = ", ".join(authors_list) if len(authors_list) <= 2 else authors_list[0] + " et al."
pub_date_element = article.find('.//PubDate')
year = "Unknown"
if pub_date_element is not None:
year_element = pub_date_element.find('Year')
if year_element is not None:
year = year_element.text
journal = article.find('.//Journal/Title').text if article.find('.//Journal/Title') is not None else 'No Journal'
abstract = article.find('.//Abstract/AbstractText').text if article.find('.//Abstract/AbstractText') is not None else 'No Abstract'
article_doi = article.find(".//ArticleId[@IdType='doi']")
doi = article_doi.text if article_doi is not None else "No DOI available"
doi_link = f"https://doi.org/{doi}" if doi != "No DOI available" else ""
articles.append({
"Title": title,
"Authors": authors_formatted,
"Year": year,
"DOI": doi_link,
"Abstract": abstract,
"Journal": journal,
})
return articles
def write_articles_to_csv(articles, filename="articles.csv"):
with open(filename, mode='w', newline='', encoding='utf-8') as file:
writer = csv.writer(file)
writer.writerow(['', 'Authors', 'Year', 'Title', 'DOI', 'Abstract', 'Journal'])
for article in articles:
writer.writerow(['[]', article['Authors'], article['Year'], article['Title'], article['DOI'], article['Abstract'], article['Journal']])
print(f"Articles written to {filename}: {len(articles)}")
def articles_to_csv_string(articles):
output = StringIO()
writer = csv.writer(output)
# writer.writerow(['Authors', 'Year', 'Title', 'DOI', 'Abstract', 'Journal'])
writer.writerow(['Year', 'Title', 'Abstract', 'DOI'])
for article in articles:
# writer.writerow([article['Authors'], article['Year'], article['Title'], article['DOI'], article['Abstract'], article['Journal']])
writer.writerow([article['Year'], article['Title'], article['Abstract'], article['DOI']])
output.seek(0)
return output.getvalue()
def generate_filename(keyword1, keyword2, keyword3):
# Format the current timestamp
timestamp = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
# Create a filename that includes the keywords and timestamp
# Note: Filenames need to be safe for the filesystem, so replace or remove characters as necessary
filename = f"articles_{keyword1}_{keyword2}_{keyword3}_{timestamp}.csv".replace(' ', '_').replace('/', '_')
# Ensure the filename length does not exceed filesystem limits
return filename[:255]
def process_inputs(keyword1, keyword2, keyword3):
try:
keywords = f"{keyword1} AND {keyword2} AND {keyword3}"
articles = fetch_articles(keywords, max_results=10)
if not articles: # If no articles were found
df_empty = pd.DataFrame({"Error": ["No articles found or an error occurred."]})
# Generate a nicer filename
filename = generate_filename(keyword1, keyword2, keyword3)
# Create a temporary file with the specified filename
temp_file_path = os.path.join(tempfile.gettempdir(), filename)
df_empty.to_csv(temp_file_path, index=False)
return df_empty, temp_file_path
# If articles were found
csv_string = articles_to_csv_string(articles)
df = pd.read_csv(StringIO(csv_string))
filename = generate_filename(keyword1, keyword2, keyword3)
temp_file_path = os.path.join(tempfile.gettempdir(), filename)
df.to_csv(temp_file_path, index=False)
return df, temp_file_path
except Exception as e:
print(f"An error occurred: {e}")
df_empty = pd.DataFrame({"Error": ["An error occurred during processing."]})
filename = generate_filename(keyword1, keyword2, keyword3)
temp_file_path = os.path.join(tempfile.gettempdir(), filename)
df_empty.to_csv(temp_file_path, index=False)
return df_empty, temp_file_path
iface = gr.Interface(
fn=process_inputs,
inputs=[
# gr.Textbox(label="First Name", placeholder="Enter your first name here..."),
# gr.Textbox(label="How can I help you today?", placeholder="Your answer (under 50 characters)"),
gr.Textbox(label="Describe your overall concern in life, such as a specific diagnosis?", placeholder="ADHD, CPTSD, depression..."),
gr.Textbox(label="If you had a magic genie, what life situation would you ask to fix?", placeholder="Pressures of University..."),
gr.Textbox(label="Is there a specific therapeutic approach you are intersted in? Leave this blank if there isn't", placeholder="Art therapy, dbt (dialectic behavior therapy), narrative...")
],
outputs=[
gr.Dataframe(label="Here are some Research Articles that may interest you today"),
gr.File(label="Download Articles Here. This file will open in a spreadsheet format with links to the recommended articles")
],
title="MindMender",
description="This tool helps you find research articles related to your mental health concerns. Enter your parameters as keywords."
)
iface.launch(debug=True)