diff --git a/week1/community-contributions/day1-research_paper_summarizer_by_name.ipynb b/week1/community-contributions/day1-research_paper_summarizer_by_name.ipynb new file mode 100644 index 0000000..f4075e6 --- /dev/null +++ b/week1/community-contributions/day1-research_paper_summarizer_by_name.ipynb @@ -0,0 +1,273 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "a15135e6-3ba5-44ae-b14b-dc67674a5ca3", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "# Resarch Paper Summarizer by Name" + ] + }, + { + "cell_type": "markdown", + "id": "a50f02ea-0f04-4f68-ae66-d1369780065e", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "### Imports" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea6e09ac-adee-4bb8-b3bd-4f6411495751", + "metadata": {}, + "outputs": [], + "source": [ + "## If dependencies do not exist please install them\n", + "# !pip install python-dotenv openai arxiv" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e5301f2b-3037-4a85-b7cd-5e6bd700418a", + "metadata": {}, + "outputs": [], + "source": [ + "import arxiv\n", + "import os\n", + "from openai import OpenAI\n", + "from dotenv import load_dotenv\n", + "from IPython.display import Markdown, display" + ] + }, + { + "cell_type": "markdown", + "id": "ac45a1f4-0005-4e0a-be90-741182c1db9f", + "metadata": {}, + "source": [ + "### Load Open AI Key" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "381bef97-6bb7-4bdc-a71d-2ea65c8f6964", + "metadata": {}, + "outputs": [], + "source": [ + "load_dotenv()\n", + "api_key = os.getenv(\"OPENAI_API_KEY\")\n", + "\n", + "if not api_key:\n", + " print(\"āŒ No OpenAI API key found in .env file.\")\n", + "else:\n", + " print(\"āœ… API key loaded successfully.\")\n", + "\n", + "# āœ… Initialize OpenAI\n", + "openai = OpenAI(api_key=api_key)" + ] + }, + { + "cell_type": "markdown", + "id": "00817dbe-209e-418c-bb46-7b6b866fdff4", + "metadata": {}, + "source": [ + "### Main Class MLResearchFetcher" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7355ba4c-ef61-4934-bb79-4d80b4473e52", + "metadata": {}, + "outputs": [], + "source": [ + "class MLResearchFetcher:\n", + " def __init__(self, system_prompt, query=\"machine learning\", max_results=5):\n", + " self.query = query\n", + " self.max_results = max_results\n", + " self.system_prompt = system_prompt\n", + "\n", + " def fetch_papers(self):\n", + " search = arxiv.Search(\n", + " query=f'ti:\"{self.query}\"',\n", + " max_results=self.max_results,\n", + " sort_by=arxiv.SortCriterion.SubmittedDate,\n", + " sort_order=arxiv.SortOrder.Descending,\n", + " )\n", + " return list(search.results())\n", + "\n", + " def summarize_abstract(self, abstract, system_prompt):\n", + " try:\n", + " completion = openai.chat.completions.create(\n", + " model=\"gpt-4o-mini\",\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": abstract}\n", + " ]\n", + " )\n", + " return completion.choices[0].message.content.strip()\n", + " except Exception as e:\n", + " return f\"āŒ Error during summarization: {e}\"\n", + "\n", + " def display_results(self):\n", + " papers = self.fetch_papers()\n", + " for paper in papers:\n", + " display(Markdown(f\"### šŸ“„ [{paper.title}]({paper.entry_id})\"))\n", + " display(Markdown(f\"**Authors:** {', '.join(author.name for author in paper.authors)}\"))\n", + " display(Markdown(f\"**Published:** {paper.published.date()}\"))\n", + " display(Markdown(f\"**Abstract:** {paper.summary.strip()}\"))\n", + " summary = self.summarize_abstract(paper.summary, self.system_prompt)\n", + " display(Markdown(f\"**šŸ” Summary:** {summary}\"))\n", + " display(Markdown(\"---\"))" + ] + }, + { + "cell_type": "markdown", + "id": "304857ba-e832-42a3-8219-ec9202e41509", + "metadata": {}, + "source": [ + "### Helper Functions" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1be2a2da-135b-4aec-b200-dc364d319ac4", + "metadata": {}, + "outputs": [], + "source": [ + "system_prompt = \"You are an expert research paper summarizer and AI research assistant. \\\n", + "When provided with the URL or content of a research paper in the field of machine learning, artificial intelligence, or data science, perform the following: \\\n", + "1. **Extract and present** the following details in a clear, structured Markdown format: \\\n", + " - Title and Author(s) \\\n", + " - Year of Publication \\\n", + " - Objective or Aim of the Research (Why the study was conducted) \\\n", + " - Background or Introduction (What foundational knowledge or motivation led to this work) \\\n", + " - Type of Research (e.g., empirical study, theoretical analysis, experimental benchmark) \\\n", + " - Methods or Methodology (How the research was conducted: dataset, models, techniques used) \\\n", + " - Results and Key Findings (What was discovered or proven) \\\n", + " - Conclusion (Summary of insights, limitations, and proposed future work) \\\n", + "\\\n", + "2. **Evaluate** the impact and relevance of the paper: \\\n", + " - Assess the significance of the research to the broader ML/AI community \\\n", + " - Note any novelty, performance improvements, or theoretical breakthroughs \\\n", + " - Comment on the potential applications or industry relevance \\\n", + "\\\n", + "3. **Suggest new research directions**: \\\n", + " - Identify gaps, limitations, or unexplored ideas in the paper \\\n", + " - Propose at least one new research idea or follow-up paper that builds upon this work \\\n", + "\\\n", + "Respond in a clean, professional Markdown format suitable for researchers or students reviewing the literature.\"\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f8b68134-c265-4272-87c4-e16fc205e7c4", + "metadata": {}, + "outputs": [], + "source": [ + "def print_papers(papers):\n", + " for paper in papers:\n", + " title = paper.title\n", + " authors = \", \".join(author.name for author in paper.authors)\n", + " published = paper.published.strftime('%Y-%m-%d')\n", + " abstract = paper.summary.strip()\n", + " link = paper.entry_id\n", + " pdf_link = [l.href for l in paper.links if l.title == 'pdf']\n", + " categories = \", \".join(paper.categories)\n", + "\n", + " print(f\"\\nšŸ“„ Title: {title}\")\n", + " print(f\"šŸ‘„ Authors: {authors}\")\n", + " print(f\"šŸ“… Published: {published}\")\n", + " print(f\"šŸ·ļø Categories: {categories}\")\n", + " print(f\"šŸ”— Link: {link}\")\n", + " if pdf_link:\n", + " print(f\"šŸ“„ PDF: {pdf_link[0]}\")\n", + " print(f\"\\nšŸ“ Abstract:\\n{abstract}\")\n", + " print(\"-\" * 80)\n" + ] + }, + { + "cell_type": "markdown", + "id": "9e688bbd-d3dd-4f2b-a7c3-d6e550ec9667", + "metadata": {}, + "source": [ + "#### Get the papers given the name of the paper" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6dcf9639-d6b5-4194-b6a2-5260329fcbe7", + "metadata": {}, + "outputs": [], + "source": [ + "fetcher = MLResearchFetcher(system_prompt, query=\"QWEN2 TECHNICAL REPORT\", max_results=3)\n", + "papers = fetcher.fetch_papers()\n", + "print_papers(papers)" + ] + }, + { + "cell_type": "markdown", + "id": "a04e219b-389f-4e0a-9645-662d966d4055", + "metadata": {}, + "source": [ + "### Call the model and get the results" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "297e915b-078a-49c7-836f-3c4ddf8e17dc", + "metadata": {}, + "outputs": [], + "source": [ + "fetcher.display_results()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2344499c-3b39-4497-a0bf-1cff83117fdc", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}