I say my friend using python code to filter research papers using specific key words. Researchers usually do this for their research process. i want to build an application which basically takes keywords and journals as inputs and outputs the research papers that it found on the journals. Build this application using python - streamlit
To upload files, please first save the app
import streamlit as st
import pandas as pd
from scholarly import scholarly
import time
def search_papers(keywords, max_results=10):
"""Search for papers using given keywords"""
search_query = ' '.join(keywords)
try:
search_results = scholarly.search_pubs(search_query)
papers = []
count = 0
for result in search_results:
if count >= max_results:
break
paper = {
'title': result['bib'].get('title', 'N/A'),
'authors': ', '.join(result['bib'].get('author', ['N/A'])),
'year': result['bib'].get('year', 'N/A'),
'abstract': result['bib'].get('abstract', 'N/A'),
'url': result.get('pub_url', 'N/A'),
'citations': result.get('num_citations', 0)
}
papers.append(paper)
count += 1
return papers
except Exception as e:
st.error(f"An error occurred while searching: {str(e)}")
return []
def main():
st.title("Research Paper Finder 📚")
st.markdown("""
This application helps you find research papers based on keywords.
Enter your search terms below to get started.
""")
# Input for keywords
with st.form("search_form"):
keywords_input = st.text_input("Enter keywords (separate multiple keywords with commas)")
max_results = st.slider("Maximum number of results", 5, 50, 10)
search_button = st.form_submit_button("Search Papers")
if search_button and keywords_input:
keywords = [k.strip() for k in keywords_input.split(',')]
with st.spinner('Searching for papers...'):
papers = search_papers(keywords, max_results)
if papers:
st.success(f"Found {len(papers)} papers matching your criteria!")
# Display results
for i, paper in enumerate(papers, 1):
with st.expander(f"{i}. {paper['title']}"):
st.markdown(f"**Authors:** {paper['authors']}")
st.markdown(f"**Year:** {paper['year']}")
st.markdown(f"**Citations:** {paper['citations']}")
st.markdown("**Abstract:**")
st.markdown(paper['abstract'])
if paper['url'] != 'N/A':
st.markdown(f"[Link to paper]({paper['url']})")
# Add to collection button
if 'saved_papers' not in st.session_state:
st.session_state.saved_papers = set()
paper_id = paper['title']
if paper_id not in st.session_state.saved_papers:
if st.button('Save to Collection', key=f"save_{i}"):
st.session_state.saved_papers.add(paper_id)
st.success("Paper saved to your collection!")
else:
st.info("This paper is in your collection")
else:
st.warning("No papers found matching your criteria. Try different keywords.")
# Display saved papers
if 'saved_papers' in st.session_state and st.session_state.saved_papers:
st.sidebar.title("Your Collection")
for paper_id in st.session_state.saved_papers:
st.sidebar.markdown(f"- {paper_id}")
if __name__ == "__main__":
main()
Hi! I can help you with any questions about Streamlit and Python. What would you like to know?