Spaces:
Sleeping
Sleeping
File size: 6,645 Bytes
43e28bd cd8fd5f 43e28bd cd8fd5f 2519293 4b973eb 2519293 e767bb3 4b973eb 2519293 4b973eb 2519293 68b0c4f 4b973eb 68b0c4f 2519293 4b973eb 68b0c4f 2519293 43e28bd 2519293 375a784 2519293 43e28bd 375a784 43e28bd 375a784 2519293 |
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 136 |
# !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)
|