From 31ca812896a355fec44406968e2a1c59a4528f51 Mon Sep 17 00:00:00 2001 From: Raymond Cen Date: Fri, 24 Apr 2026 18:37:58 -0700 Subject: [PATCH 01/22] update documentation Co-authored-by: Copilot --- documentation/CONTRIBUTING.md | 151 ++++++++++++++++++++++++++++++---- 1 file changed, 133 insertions(+), 18 deletions(-) diff --git a/documentation/CONTRIBUTING.md b/documentation/CONTRIBUTING.md index 7702319..f6f7860 100644 --- a/documentation/CONTRIBUTING.md +++ b/documentation/CONTRIBUTING.md @@ -3,23 +3,33 @@ How to set up, code, test, review, and release so contributions meet our Definit of Done. ## Code of Conduct All contributors must follow the Oregon State University Student Code of Conduct and the team’s charter agreement. -* Treat all collaborators with respect and proffessionalism. +* Treat all collaborators with respect and professionalism. * Provide decent participation during meetings and reviews. * Raise the issue privately with the team first. * Issues of academic or ethical concern should be reported directly to the instructor. * Report any inappropriate or unprofessional behavior to the TA, instructor or project manager. **Owner**: Bradley Rule -**Next Review**: 11/26/25 +**Next Review**: 05/15/26 ## Getting Started +> **Pipeline diagram**: [`documentation/architecture.png`](architecture.png) - visual overview of the full extraction pipeline. + * ### Prerequisites * Python 3.10 + * pip installed * Access to GitHub repository + * [Ollama](https://ollama.com) installed and running locally + * Minimum hardware: 8 GB RAM (16 GB recommended for `llama3.1:8b`) + * Pull the required models before running the classify/extract pipeline: + ```bash + ollama pull llama3.1:8b # default extraction model (~5 GB) + ollama pull qwen2.5:7b # alternative model (~5 GB) + ``` + * Verify Ollama is running: `ollama list` * ### Setup Instructions ``` - git clone https://github.com/marknovak/FracFeedExtractor.git + git clone https://github.com/NovakLabOSU/FracFeedExtractor.git cd FracFeedExtractor python -m venv venv source venv/bin/activate @@ -46,12 +56,68 @@ All contributors must follow the Oregon State University Student Code of Conduct python scripts/full_pipeline.py --api ``` * Note: You will need access to the .env file -* ### Enviorment Variables +* ### Running the classify/extract pipeline + Use `classify_extract.py` to classify PDFs and extract structured diet data in a single step. + Requires trained model artifacts in `src/model/models/` (run the full pipeline first, + or see [Retraining the Classifier](#retraining-the-classifier-and-extending-extraction) below). + ```bash + # Single PDF + python classify_extract.py path/to/file.pdf + + # Folder of PDFs (sequential) + python classify_extract.py path/to/pdfs/ + + # All options + python classify_extract.py path/to/pdfs/ \ + --model-dir src/model/models \ + --llm-model llama3.1:8b \ + --output-dir data/results \ + --confidence-threshold 0.70 \ + --max-chars 12000 \ + --num-ctx 4096 \ + --workers 4 + ``` + | Flag | Default | Description | + |------|---------|-------------| + | `--model-dir` | `src/model/models` | Directory containing classifier artifacts | + | `--llm-model` | `llama3.1:8b` | Ollama model for extraction | + | `--output-dir` | `data/results` | Destination for JSON results and summary CSV | + | `--confidence-threshold` | `0.70` | Probability threshold for "useful" classification | + | `--max-chars` | `12000` | Maximum characters sent to the LLM | + | `--num-ctx` | `4096` | Ollama context window size (tokens) | + | `--workers` | `1` | Parallel worker processes (`1` = sequential) | + +* ### Sample Output + Each PDF classified as "useful" produces a JSON file in `data/results/metrics/`: + ```json + { + "source_file": "Smith_2002.pdf", + "extracted_at": "2026-04-24T14:32:00", + "metrics": { + "species_name": "Esox lucius", + "study_location": "Lake Windermere, UK", + "study_date": "1998-2000", + "num_empty_stomachs": 42, + "num_nonempty_stomachs": 158, + "sample_size": 200, + "fraction_feeding": 0.79 + } + } + ``` + A timestamped summary CSV is written to `data/results/summaries/pipeline_summary_.csv` + with one row per PDF: + + | filename | classification | confidence | pred_prob | extraction_status | species_name | study_location | study_date | sample_size | num_empty_stomachs | num_nonempty_stomachs | fraction_feeding | + |----------|----------------|------------|-----------|-------------------|--------------|----------------|------------|-------------|--------------------|-----------------------|------------------| + | Smith_2002.pdf | useful | 0.9231 | 0.9231 | success | Esox lucius | Lake Windermere, UK | 1998-2000 | 200 | 42 | 158 | 0.79 | + | Jones_1999.pdf | not useful | 0.1204 | 0.1204 | skipped_not_useful | | | | | | | | + +* ### Environment Variables * Sensitive information such as API keys will be stored in a local .env file which will be excluded by .gitignore. * Never hardcode secrets **Owner**: Raymond Cen -**Next Review**: 11/26/25 +**Next Review**: 05/15/26 ## Branching & Workflow We will use the feature-branch workflow with all merges handled through PRs. @@ -62,7 +128,7 @@ We will use the feature-branch workflow with all merges handled through PRs. * Rebase your working branch with main, and often, before submitting a PR (simpler conflict resolution) **Owner**: Zahra Zahir Ahmed Alsulaimawi -**Next Review**: 11/26/25 +**Next Review**: 05/15/26 ## Issues & Planning Issue titles should start with the following tags to designate intent: @@ -88,7 +154,7 @@ Feature Description: ``` **Owner**: Zahra Zahir Ahmed Alsulaimawi -**Next Review**: 11/26/25 +**Next Review**: 05/15/26 ## Commit Messages We will use the [Conventional Commit](https://www.conventionalcommits.org/en/v1.0.0/) format for clarity and traceability @@ -106,7 +172,7 @@ fix(ci): update pytest command in workflow [#42] docs(readme): add setup section ``` **Owner**: Raymond Cen -**Next Review**: 11/26/25 +**Next Review**: 05/15/26 ## Code Style, Linting & Formatting We use Black for automatic code formatting and Flake8 for linting to maintain consistent style and prevent common Python errors. @@ -123,7 +189,7 @@ We use Black for automatic code formatting and Flake8 for linting to maintain co black src tests ``` -* ### Formatter: Black +* ### Linter: Flake8 - Config file: `pyproject.toml` - Install `pip install flake8` - Local usage: @@ -133,7 +199,7 @@ We use Black for automatic code formatting and Flake8 for linting to maintain co - Configured to ignore line length violations (E501) and other minor style differences. **Owner**: Sean Clayton -**Next Review**: 11/26/25 +**Next Review**: 05/15/26 ## Testing @@ -151,7 +217,7 @@ We use Black for automatic code formatting and Flake8 for linting to maintain co coverage html ``` **Owner**: Sean Clayton -**Next Review**: 11/26/25 +**Next Review**: 05/15/26 * ### Expectations - New features must include unit or integration tests. @@ -174,7 +240,7 @@ We use Black for automatic code formatting and Flake8 for linting to maintain co - PRs should be rebased on the latest `main` branch before merge if there are conflicts. **Owner**: Bradley Rule -**Next Review**: 11/26/25 +**Next Review**: 05/15/26 ## CI/CD Continuous integration ensures all contributions meet quality standards automatically. @@ -198,7 +264,7 @@ Continuous integration ensures all contributions meet quality standards automati - Artifacts (e.g., coverage reports) are uploaded automatically and can be reviewed. **Owner**: Sean Clayton -**Next Review**: 11/26/25 +**Next Review**: 05/15/26 ## Security & Secrets State how to report vulnerabilities, prohibited patterns (hard-coded secrets), @@ -211,7 +277,7 @@ dependency update policy, and scanning tools. * Security issues or potential breaches should be reported privately to the Project Manager and TA. **Owner**: Raymond Cen -**Next Review**: 11/26/25 +**Next Review**: 05/15/26 ## Documentation Expectations @@ -223,7 +289,7 @@ dependency update policy, and scanning tools. - Inline comments should be reserved for places where the function of code is difficult to understand or infer. **Owner**: Zahra Zahir Ahmed Alsulaimawi -**Next Review**: 11/26/25 +**Next Review**: 05/15/26 ## Release Process ### Versioning Scheme @@ -278,12 +344,61 @@ Example entry: 4) Notify the team and project partner of the rollback. **Owner**: Bradley Rule -**Next Review**: 11/26/25 +**Next Review**: 05/15/26 + +## Retraining the Classifier and Extending Extraction + +### Retraining the XGBoost Classifier + +The classifier artifacts are saved in `src/model/models/`. To retrain with new or updated labeled data: + +1. **Add labeled text files** to `data/processed-text/` and update `data/labels.json` + with `"filename.txt": "useful"` or `"filename.txt": "not useful"` entries. + +2. **Run the trainer directly:** + ```bash + python src/model/train_model.py + ``` + This reads from `data/processed-text/` and `data/labels.json`, trains a TF-IDF + + XGBoost model, and saves three artifacts: + - `src/model/models/pdf_classifier.json` - XGBoost model + - `src/model/models/tfidf_vectorizer.pkl` - TF-IDF vectorizer + - `src/model/models/label_encoder.pkl` - LabelEncoder + +3. **Or run the full pipeline**, which trains the model as a final step: + ```bash + python scripts/full_pipeline.py --local + ``` + +Key tunable parameters in `src/model/train_model.py`: +- `max_features` in `TfidfVectorizer` (default: 10,000) +- `eta`, `max_depth`, `subsample` in the XGBoost `params` dict +- `early_stopping_rounds` (default: 20) + +### Adding New Extraction Fields to the LLM Extractor + +Extraction fields are defined in two places: + +1. **`src/llm/models.py`** - the `PredatorDietMetrics` Pydantic model. + Add a new optional field with the appropriate type and a `None` default: + ```python + prey_taxa: Optional[list[str]] = None + ``` + +2. **`src/llm/llm_client.py`** - the system prompt that instructs the LLM. + Add a description of the new field and its expected format to the prompt string. + +3. **`classify_extract.py`** and **`extract-from-txt.py`** - update the `row` dict + and `fieldnames` list in the summary CSV writer to include the new column. + +After adding a field, run `pytest tests/test_llm_text.py` to verify that the prompt +changes do not break existing extraction tests. + ## Support & Contact -* **Primaty Communciations**: Slack and Teams +* **Primary Communications**: Slack and Teams * **Meetings**: Fridays 1 PM PST * **Project Partner**: Mark Novak, Fridays 8:30AM PST (biweekly check-ins) * **TA Meetings**: Thursdays 1:30PM PST **Owner**: Zahra Zahir Ahmed Alsulaimawi -**Next Review**: 11/26/25 \ No newline at end of file +**Next Review**: 05/15/26 \ No newline at end of file From 6abb551270a17a94c6456aadd019eddfe9d6031e Mon Sep 17 00:00:00 2001 From: Raymond Cen Date: Fri, 24 Apr 2026 18:39:23 -0700 Subject: [PATCH 02/22] removed table --- documentation/CONTRIBUTING.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/documentation/CONTRIBUTING.md b/documentation/CONTRIBUTING.md index f6f7860..7e95624 100644 --- a/documentation/CONTRIBUTING.md +++ b/documentation/CONTRIBUTING.md @@ -104,14 +104,6 @@ All contributors must follow the Oregon State University Student Code of Conduct } } ``` - A timestamped summary CSV is written to `data/results/summaries/pipeline_summary_.csv` - with one row per PDF: - - | filename | classification | confidence | pred_prob | extraction_status | species_name | study_location | study_date | sample_size | num_empty_stomachs | num_nonempty_stomachs | fraction_feeding | - |----------|----------------|------------|-----------|-------------------|--------------|----------------|------------|-------------|--------------------|-----------------------|------------------| - | Smith_2002.pdf | useful | 0.9231 | 0.9231 | success | Esox lucius | Lake Windermere, UK | 1998-2000 | 200 | 42 | 158 | 0.79 | - | Jones_1999.pdf | not useful | 0.1204 | 0.1204 | skipped_not_useful | | | | | | | | - * ### Environment Variables * Sensitive information such as API keys will be stored in a local .env file which will be excluded by .gitignore. * Never hardcode secrets From 536665985a098c851b9b536a8fe0e316c63293bf Mon Sep 17 00:00:00 2001 From: Raymond Cen Date: Fri, 24 Apr 2026 18:48:45 -0700 Subject: [PATCH 03/22] Added CONTRIBUTING.md and archeticture to README Co-authored-by: Copilot --- README.md | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 46410a0..835e15f 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,20 @@ -# FracFeedExtractor - _LLMs for the fraction of feeding predators_ +# FracFeedExtractor - LLMs for the fraction of feeding predators ## Project Description -This project will contribute to validating a novel metric of predator-prey interactions to inform ecosystem-based resource management and ecological theory. It will do so by using a global database of predator diet surveys to train large language models for the purpose of identifying additional publications and extracting key data to overcome the limitations that have hindered the empirical validation of the new metric thus far. +This project contributes to validating a novel metric of predator-prey interactions to inform ecosystem-based resource management and ecological theory. It does so by using a global database of predator diet surveys to train large language models for the purpose of identifying additional publications and extracting key data to overcome the limitations that have hindered the empirical validation of the new metric thus far. ## Motivation -Predator–prey interactions are central to ecosystem stability, yet a key parameter that quantifies predator-prey interaction strength—predator feeding rates—is rarely used in practice because the data required to estimate it are difficult to obtain. Our research has shown that the fraction of feeding individuals, defined as the proportion of predators with non‑empty stomachs, can be easily obtained from routine predator diet surveys and is analytically linked to a species' metabolic demand, body size, temperature, mortality rate, extinction susceptibility, biological control effectiveness, and population resilience to perturbations. To validate this metric for mainstream resource management and ecological theory, a scalable method is needed to harvest the untapped data that exists in the vast ecological literature. +Predator-prey interactions are central to ecosystem stability, yet a key parameter that quantifies predator-prey interaction strength (predator feeding rates) is rarely used in practice because the data required to estimate it are difficult to obtain. Our research has shown that the fraction of feeding individuals, defined as the proportion of predators with non-empty stomachs, can be easily obtained from routine predator diet surveys and is analytically linked to a species' metabolic demand, body size, temperature, mortality rate, extinction susceptibility, biological control effectiveness, and population resilience to perturbations. To validate this metric for mainstream resource management and ecological theory, a scalable method is needed to harvest the untapped data that exists in the vast ecological literature. -The project will train large language models for two tasks: 1) classifying scientific publications as containing useful predator diet survey information, and 2) extracting the numbers of empty- and non-empty stomachs counted and key covariates (predator identity, survey location, survey year, etc.). By fine-tuning with a large database of hand-annotated publications containing diet surveys conducted across the globe over the last 135 years, the models will learn to recognize relevant publications and parse tabular and narrative data into structured fields. The resulting pipeline will enable the generation of a comprehensive, covariate‑rich database for subsequent analyses and applications. +The project trained large language models for two tasks: 1) classifying scientific publications as containing useful predator diet survey information, and 2) extracting the numbers of empty- and non-empty stomachs counted and key covariates (predator identity, survey location, survey year, etc.). By fine-tuning with a large database of hand-annotated publications containing diet surveys conducted across the globe over the last 135 years, the models learned to recognize relevant publications and parse tabular and narrative data into structured fields. The resulting pipeline enables the generation of a comprehensive, covariate-rich database for subsequent analyses and applications. ## Objectives/Deliverables -1. A fully trained, fine‑tuned Python implementation of a large language model (or pair of models) that ingests a publication's pdf and returns a classification and/or the extracted data as well as descriptors of the classification and extraction provenance and uncertainty. +1. A fully trained, fine-tuned Python implementation of a large language model (or pair of models) that ingests a publication's pdf and returns a classification and/or the extracted data as well as descriptors of the classification and extraction provenance and uncertainty. 2. A Python pipeline that accepts a single pdf or a folder of pdfs, parses the text of each, queries the model for each, and exports the classification and data extraction results with clear provenance and uncertainty. 3. A clean, reproducible training and evaluation pipeline (including pdf preprocessing and model evaluation metrics) documented in a GitHub repository. -4. A technical report detailing model architecture, training procedure, validation results, and guidance for future extensions. +4. A technical report detailing model architecture, training procedure, validation results, and guidance for future extensions. ## Data sources [FracFeed: Global database of the fraction of feeding predators](https://github.com/marknovak/FracFeed_DB) @@ -27,3 +27,7 @@ The project will train large language models for two tasks: 1) classifying scien - Bradley Rule – Contributor License: Pending partner confirmation + +## Documentation +- [Contributing Guide](documentation/CONTRIBUTING.md) +- [Pipeline Architecture Diagram](documentation/architecture.png) From e19b9c0414509880c59187fccc41b472d0191e35 Mon Sep 17 00:00:00 2001 From: Raymond Cen Date: Sun, 26 Apr 2026 00:44:59 -0700 Subject: [PATCH 04/22] update README.md Co-authored-by: Copilot --- README.md | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 835e15f..3b2104a 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,59 @@ # FracFeedExtractor - LLMs for the fraction of feeding predators +This project contributes to validating a novel metric of predator-prey interactions to inform ecosystem-based resource management and ecological theory. + +![Build Status](https://img.shields.io/badge/build-passing-brightgreen?style=flat-square) +![Python Version](https://img.shields.io/badge/python-3.10%2B-blue?style=flat-square) +![License](https://img.shields.io/badge/license-pending-lightgrey?style=flat-square) +![GitHub Issues](https://img.shields.io/github/issues/NovakLabOSU/FracFeedExtractor?style=flat-square) + ## Project Description This project contributes to validating a novel metric of predator-prey interactions to inform ecosystem-based resource management and ecological theory. It does so by using a global database of predator diet surveys to train large language models for the purpose of identifying additional publications and extracting key data to overcome the limitations that have hindered the empirical validation of the new metric thus far. +## Key Features +- **PDF Classification** - Fine-tuned LLMs identify which scientific publications contain useful predator diet survey data. +- **Structured Data Extraction** - Automatically parses empty and non-empty stomach counts and key covariates (predator identity, survey location, survey year, and more) from tabular and narrative text. +- **Batch Processing** - Accepts a single PDF or an entire folder of PDFs in one command. +- **Provenance & Uncertainty Reporting** - Every result includes descriptors of classification confidence and extraction provenance. +- **Reproducible Pipeline** - A clean training and evaluation pipeline with PDF preprocessing and model evaluation metrics is fully documented in this repository. + +## Get Started + +### Prerequisites +- **Python 3.10+** +- **[Ollama](https://ollama.com)** installed and running locally (minimum 8 GB RAM; 16 GB recommended) +- Pull the required model before running the pipeline: + ```bash + ollama pull llama3.1:8b # default extraction model (~5 GB) + ``` + Verify Ollama is running: `ollama list` + +### Installation +```bash +git clone https://github.com/NovakLabOSU/FracFeedExtractor.git +cd FracFeedExtractor +pip install -r requirements.txt +``` + +### Quick Start +```bash +# Classify and extract data from a folder of PDFs +python classify_extract.py path/to/pdfs/ +``` + +For full setup details, virtual environment configuration, available CLI flags, and contribution guidelines, see the [Contributing Guide](documentation/CONTRIBUTING.md). + +## Pipeline Demo + +[IMAGE: Terminal screenshot showing the pipeline running on a folder of PDFs, displaying classifier output and extraction results per file] + +*Terminal screenshot showing the pipeline running on a folder of PDFs, displaying classifier output and extraction results per file.* + +--- + +[IMAGE: Side-by-side comparison of a dense academic PDF on the left and the clean extracted JSON output on the right] + +*Side-by-side comparison of a dense academic PDF on the left and the clean extracted JSON output on the right.* ## Motivation Predator-prey interactions are central to ecosystem stability, yet a key parameter that quantifies predator-prey interaction strength (predator feeding rates) is rarely used in practice because the data required to estimate it are difficult to obtain. Our research has shown that the fraction of feeding individuals, defined as the proportion of predators with non-empty stomachs, can be easily obtained from routine predator diet surveys and is analytically linked to a species' metabolic demand, body size, temperature, mortality rate, extinction susceptibility, biological control effectiveness, and population resilience to perturbations. To validate this metric for mainstream resource management and ecological theory, a scalable method is needed to harvest the untapped data that exists in the vast ecological literature. @@ -26,8 +77,24 @@ The project trained large language models for two tasks: 1) classifying scientif - Raymond Cen – Contributor - Bradley Rule – Contributor -License: Pending partner confirmation +## Team + +| Name | Role | GitHub | +|------|------|--------| +| Mark Novak | Project Owner/Lead | [@marknovak](https://github.com/marknovak) | +| Sean Clayton | Contributor | [@SeanClas10](https://github.com/SeanClas10) | +| Zahra Alsulaimawi | Contributor | [@QuiteRocks](https://github.com/QuiteRocks) | +| Raymond Cen | Contributor | [@raymondcen](https://github.com/raymondcen) | +| Bradley Rule | Contributor | [@bradleyrule](https://github.com/bradleyrule) | + +We also thank all previous contributors - see the full list on the [GitHub Contributors page](https://github.com/NovakLabOSU/FracFeedExtractor/graphs/contributors). + +--- + +Found a bug or have a question? [Open an issue on GitHub Issues](https://github.com/NovakLabOSU/FracFeedExtractor/issues). ## Documentation - [Contributing Guide](documentation/CONTRIBUTING.md) - [Pipeline Architecture Diagram](documentation/architecture.png) + +LICENSE: Pending partner confirmation From 9c1c4f7dbc5b32a86a902585a02ff511e796075a Mon Sep 17 00:00:00 2001 From: Raymond Cen Date: Sun, 26 Apr 2026 00:52:58 -0700 Subject: [PATCH 05/22] fixed github username typo, added tessract note, removed duplicate team member Co-authored-by: Copilot --- README.md | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 3b2104a..f29668f 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # FracFeedExtractor - LLMs for the fraction of feeding predators -This project contributes to validating a novel metric of predator-prey interactions to inform ecosystem-based resource management and ecological theory. +FracFeedExtractor automatically identifies predator diet studies in scientific literature and extracts key structured data using machine learning and LLMs. ![Build Status](https://img.shields.io/badge/build-passing-brightgreen?style=flat-square) ![Python Version](https://img.shields.io/badge/python-3.10%2B-blue?style=flat-square) @@ -11,7 +11,7 @@ This project contributes to validating a novel metric of predator-prey interacti This project contributes to validating a novel metric of predator-prey interactions to inform ecosystem-based resource management and ecological theory. It does so by using a global database of predator diet surveys to train large language models for the purpose of identifying additional publications and extracting key data to overcome the limitations that have hindered the empirical validation of the new metric thus far. ## Key Features -- **PDF Classification** - Fine-tuned LLMs identify which scientific publications contain useful predator diet survey data. +- **PDF Classification** - An XGBoost classifier identifies which scientific publications contain useful predator diet survey data, filtering out irrelevant papers before they reach the LLM. - **Structured Data Extraction** - Automatically parses empty and non-empty stomach counts and key covariates (predator identity, survey location, survey year, and more) from tabular and narrative text. - **Batch Processing** - Accepts a single PDF or an entire folder of PDFs in one command. - **Provenance & Uncertainty Reporting** - Every result includes descriptors of classification confidence and extraction provenance. @@ -24,7 +24,7 @@ This project contributes to validating a novel metric of predator-prey interacti - **[Ollama](https://ollama.com)** installed and running locally (minimum 8 GB RAM; 16 GB recommended) - Pull the required model before running the pipeline: ```bash - ollama pull llama3.1:8b # default extraction model (~5 GB) + ollama pull qwen2.5:7b # default extraction model (~5 GB) ``` Verify Ollama is running: `ollama list` @@ -35,6 +35,8 @@ cd FracFeedExtractor pip install -r requirements.txt ``` +> **Note:** Tesseract OCR must be installed separately as a system dependency. See the [Contributing Guide](documentation/CONTRIBUTING.md) for platform-specific instructions. + ### Quick Start ```bash # Classify and extract data from a folder of PDFs @@ -70,19 +72,12 @@ The project trained large language models for two tasks: 1) classifying scientif ## Data sources [FracFeed: Global database of the fraction of feeding predators](https://github.com/marknovak/FracFeed_DB) -## Team Members -- Mark Novak – Project Owner/Lead -- Sean Clayton – Contributor -- Zahra Zahir Ahmed Alsulaimawi – Contributor -- Raymond Cen – Contributor -- Bradley Rule – Contributor - ## Team | Name | Role | GitHub | |------|------|--------| | Mark Novak | Project Owner/Lead | [@marknovak](https://github.com/marknovak) | -| Sean Clayton | Contributor | [@SeanClas10](https://github.com/SeanClas10) | +| Sean Clayton | Contributor | [@SeanClay10](https://github.com/SeanClay10) | | Zahra Alsulaimawi | Contributor | [@QuiteRocks](https://github.com/QuiteRocks) | | Raymond Cen | Contributor | [@raymondcen](https://github.com/raymondcen) | | Bradley Rule | Contributor | [@bradleyrule](https://github.com/bradleyrule) | From de233cad6ce52dcbfb2b41f854601948c4e37fe0 Mon Sep 17 00:00:00 2001 From: Raymond Cen Date: Sun, 26 Apr 2026 00:55:27 -0700 Subject: [PATCH 06/22] updated first line --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index f29668f..4bc2281 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # FracFeedExtractor - LLMs for the fraction of feeding predators -FracFeedExtractor automatically identifies predator diet studies in scientific literature and extracts key structured data using machine learning and LLMs. +Using machine learning and LLMs to automatically identify predator diet studies in ecological literature and extract key data on predator feeding rates at scale. ![Build Status](https://img.shields.io/badge/build-passing-brightgreen?style=flat-square) ![Python Version](https://img.shields.io/badge/python-3.10%2B-blue?style=flat-square) @@ -74,13 +74,13 @@ The project trained large language models for two tasks: 1) classifying scientif ## Team -| Name | Role | GitHub | -|------|------|--------| -| Mark Novak | Project Owner/Lead | [@marknovak](https://github.com/marknovak) | -| Sean Clayton | Contributor | [@SeanClay10](https://github.com/SeanClay10) | -| Zahra Alsulaimawi | Contributor | [@QuiteRocks](https://github.com/QuiteRocks) | -| Raymond Cen | Contributor | [@raymondcen](https://github.com/raymondcen) | -| Bradley Rule | Contributor | [@bradleyrule](https://github.com/bradleyrule) | +| Name | Role | GitHub | +| ----------------- | ------------------ | ---------------------------------------------- | +| Mark Novak | Project Owner/Lead | [@marknovak](https://github.com/marknovak) | +| Sean Clayton | Contributor | [@SeanClay10](https://github.com/SeanClay10) | +| Zahra Alsulaimawi | Contributor | [@QuiteRocks](https://github.com/QuiteRocks) | +| Raymond Cen | Contributor | [@raymondcen](https://github.com/raymondcen) | +| Bradley Rule | Contributor | [@bradleyrule](https://github.com/bradleyrule) | We also thank all previous contributors - see the full list on the [GitHub Contributors page](https://github.com/NovakLabOSU/FracFeedExtractor/graphs/contributors). From ad5d220fd9cc7fda35a7337b031050e26873ee8d Mon Sep 17 00:00:00 2001 From: Raymond Cen Date: Sun, 26 Apr 2026 00:58:58 -0700 Subject: [PATCH 07/22] added more accuracte wording more specific to the project Co-authored-by: Copilot --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 4bc2281..4596b9f 100644 --- a/README.md +++ b/README.md @@ -60,14 +60,14 @@ For full setup details, virtual environment configuration, available CLI flags, ## Motivation Predator-prey interactions are central to ecosystem stability, yet a key parameter that quantifies predator-prey interaction strength (predator feeding rates) is rarely used in practice because the data required to estimate it are difficult to obtain. Our research has shown that the fraction of feeding individuals, defined as the proportion of predators with non-empty stomachs, can be easily obtained from routine predator diet surveys and is analytically linked to a species' metabolic demand, body size, temperature, mortality rate, extinction susceptibility, biological control effectiveness, and population resilience to perturbations. To validate this metric for mainstream resource management and ecological theory, a scalable method is needed to harvest the untapped data that exists in the vast ecological literature. -The project trained large language models for two tasks: 1) classifying scientific publications as containing useful predator diet survey information, and 2) extracting the numbers of empty- and non-empty stomachs counted and key covariates (predator identity, survey location, survey year, etc.). By fine-tuning with a large database of hand-annotated publications containing diet surveys conducted across the globe over the last 135 years, the models learned to recognize relevant publications and parse tabular and narrative data into structured fields. The resulting pipeline enables the generation of a comprehensive, covariate-rich database for subsequent analyses and applications. +The project trained an XGBoost classifier to identify which publications contain useful predator diet survey information. A pre-trained LLM running locally via Ollama then extracts the numbers of empty and non-empty stomachs counted and key covariates (predator identity, survey location, survey year, etc.). The classifier was trained on a large database of hand-annotated publications containing diet surveys conducted across the globe over the last 135 years, learning to recognize relevant publications so the LLM only processes papers likely to contain useful data. The resulting pipeline enables the generation of a comprehensive, covariate-rich database for subsequent analyses and applications. ## Objectives/Deliverables -1. A fully trained, fine-tuned Python implementation of a large language model (or pair of models) that ingests a publication's pdf and returns a classification and/or the extracted data as well as descriptors of the classification and extraction provenance and uncertainty. +1. A trained XGBoost classifier paired with a pre-trained LLM that together ingest a publication's PDF and return a classification and the extracted data with descriptors of classification confidence and extraction provenance. 2. A Python pipeline that accepts a single pdf or a folder of pdfs, parses the text of each, queries the model for each, and exports the classification and data extraction results with clear provenance and uncertainty. 3. A clean, reproducible training and evaluation pipeline (including pdf preprocessing and model evaluation metrics) documented in a GitHub repository. -4. A technical report detailing model architecture, training procedure, validation results, and guidance for future extensions. +4. A documented GitHub repository detailing the classifier architecture, training procedure and guidance for future extensions. ## Data sources [FracFeed: Global database of the fraction of feeding predators](https://github.com/marknovak/FracFeed_DB) From 7ae06bb9b9965a44507d51ecf12ff307a78ed1e9 Mon Sep 17 00:00:00 2001 From: Raymond Cen Date: Sun, 26 Apr 2026 01:00:13 -0700 Subject: [PATCH 08/22] removed "trained LLM" to "trained XGBoost and pretrained LLM" --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4596b9f..9f7edad 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ Using machine learning and LLMs to automatically identify predator diet studies ![GitHub Issues](https://img.shields.io/github/issues/NovakLabOSU/FracFeedExtractor?style=flat-square) ## Project Description -This project contributes to validating a novel metric of predator-prey interactions to inform ecosystem-based resource management and ecological theory. It does so by using a global database of predator diet surveys to train large language models for the purpose of identifying additional publications and extracting key data to overcome the limitations that have hindered the empirical validation of the new metric thus far. +This project contributes to validating a novel metric of predator-prey interactions to inform ecosystem-based resource management and ecological theory. It does so by using a global database of predator diet surveys to train an XGBoost classifier that identifies relevant publications and a pre-trained LLM running locally via Ollama that extracts key data to overcome the limitations that have hindered the empirical validation of the new metric thus far. ## Key Features - **PDF Classification** - An XGBoost classifier identifies which scientific publications contain useful predator diet survey data, filtering out irrelevant papers before they reach the LLM. From bf4f55e89a594cef97faa317b999d28a33a1a88d Mon Sep 17 00:00:00 2001 From: Raymond Cen Date: Sun, 26 Apr 2026 14:49:04 -0700 Subject: [PATCH 09/22] removed team table, used GItHub profiles instead Co-authored-by: Copilot --- README.md | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 9f7edad..1d09bf3 100644 --- a/README.md +++ b/README.md @@ -74,15 +74,9 @@ The project trained an XGBoost classifier to identify which publications contain ## Team -| Name | Role | GitHub | -| ----------------- | ------------------ | ---------------------------------------------- | -| Mark Novak | Project Owner/Lead | [@marknovak](https://github.com/marknovak) | -| Sean Clayton | Contributor | [@SeanClay10](https://github.com/SeanClay10) | -| Zahra Alsulaimawi | Contributor | [@QuiteRocks](https://github.com/QuiteRocks) | -| Raymond Cen | Contributor | [@raymondcen](https://github.com/raymondcen) | -| Bradley Rule | Contributor | [@bradleyrule](https://github.com/bradleyrule) | - -We also thank all previous contributors - see the full list on the [GitHub Contributors page](https://github.com/NovakLabOSU/FracFeedExtractor/graphs/contributors). + + Project contributors + --- From 483061bcd0a424f2ac710c4e2bf67455f1848370 Mon Sep 17 00:00:00 2001 From: Raymond Cen Date: Sun, 26 Apr 2026 14:53:18 -0700 Subject: [PATCH 10/22] reformatted to include roles and github pages --- README.md | 43 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 1d09bf3..a387ec4 100644 --- a/README.md +++ b/README.md @@ -74,9 +74,46 @@ The project trained an XGBoost classifier to identify which publications contain ## Team - - Project contributors - + + + + + + + + +
+ + Mark Novak
+ Mark Novak
+ Project Owner/Lead +
+
+ + Sean Clayton
+ Sean Clayton
+ Contributor +
+
+ + Zahra Alsulaimawi
+ Zahra Alsulaimawi
+ Contributor +
+
+ + Raymond Cen
+ Raymond Cen
+ Contributor +
+
+ + Bradley Rule
+ Bradley Rule
+ Contributor +
+
+ --- From 32b6dd97614114ccf228bd9df1c7bb8b4a679109 Mon Sep 17 00:00:00 2001 From: SeanClay10 Date: Sun, 26 Apr 2026 16:14:30 -0700 Subject: [PATCH 11/22] update README for project landing page --- README.md | 200 +++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 144 insertions(+), 56 deletions(-) diff --git a/README.md b/README.md index a387ec4..f1de579 100644 --- a/README.md +++ b/README.md @@ -1,76 +1,156 @@ -# FracFeedExtractor - LLMs for the fraction of feeding predators +# FracFeedExtractor — LLMs for the Fraction of Feeding Predators -Using machine learning and LLMs to automatically identify predator diet studies in ecological literature and extract key data on predator feeding rates at scale. +**An automated pipeline that reads ecological literature and extracts predator feeding-rate data — turning hundreds of PDFs into a structured, analysis-ready database.** -![Build Status](https://img.shields.io/badge/build-passing-brightgreen?style=flat-square) ![Python Version](https://img.shields.io/badge/python-3.10%2B-blue?style=flat-square) +![Build Status](https://img.shields.io/badge/build-passing-brightgreen?style=flat-square) ![License](https://img.shields.io/badge/license-pending-lightgrey?style=flat-square) -![GitHub Issues](https://img.shields.io/github/issues/NovakLabOSU/FracFeedExtractor?style=flat-square) +[![GitHub Issues](https://img.shields.io/github/issues/NovakLabOSU/FracFeedExtractor?style=flat-square)](https://github.com/NovakLabOSU/FracFeedExtractor/issues) + +*2025–2026 Oregon State University Senior Capstone Project, in collaboration with [Mark Novak's lab at OSU](https://github.com/NovakLabOSU).* + +--- ## Project Description -This project contributes to validating a novel metric of predator-prey interactions to inform ecosystem-based resource management and ecological theory. It does so by using a global database of predator diet surveys to train an XGBoost classifier that identifies relevant publications and a pre-trained LLM running locally via Ollama that extracts key data to overcome the limitations that have hindered the empirical validation of the new metric thus far. + +This project contributes to validating a novel metric of predator-prey interaction strength — the **fraction of feeding individuals** — that has the potential to inform ecosystem-based resource management and ecological theory at scale. Given a folder of PDFs from the ecological literature, our pipeline screens each paper with a trained XGBoost classifier, routes relevant papers to a locally-run LLM for structured data extraction, and exports a covariate-rich database with classification confidence and extraction provenance attached to every record — overcoming the data-harvesting bottleneck that has hindered empirical validation of this metric. + +--- + +## What is the Fraction of Feeding Individuals? + +The **fraction of feeding individuals** is defined as the proportion of predators found to have non-empty stomachs at the time of sampling — a quantity that can be obtained directly from routine predator diet surveys. Research from [Mark Novak's lab at Oregon State University](https://github.com/NovakLabOSU) has established that this metric is analytically linked to a species' metabolic demand, body size, temperature, mortality rate, extinction susceptibility, biological control effectiveness, and population resilience to perturbation — making it a powerful and underutilized parameter for ecosystem-based resource management. + +Despite its potential, the metric is rarely used in practice. The underlying data exists across more than a century of published predator diet surveys, but harvesting it by hand from the primary literature is prohibitively slow at the scale required for meaningful cross-species analysis. FracFeedExtractor was built to solve that bottleneck: given a collection of PDFs, it automatically identifies which papers contain usable diet survey data and extracts the key numbers and covariates needed to compute the fraction of feeding individuals. + +--- ## Key Features -- **PDF Classification** - An XGBoost classifier identifies which scientific publications contain useful predator diet survey data, filtering out irrelevant papers before they reach the LLM. -- **Structured Data Extraction** - Automatically parses empty and non-empty stomach counts and key covariates (predator identity, survey location, survey year, and more) from tabular and narrative text. -- **Batch Processing** - Accepts a single PDF or an entire folder of PDFs in one command. -- **Provenance & Uncertainty Reporting** - Every result includes descriptors of classification confidence and extraction provenance. -- **Reproducible Pipeline** - A clean training and evaluation pipeline with PDF preprocessing and model evaluation metrics is fully documented in this repository. + +- **PDF Classification** — A trained XGBoost classifier identifies which scientific publications contain useful predator diet survey data, filtering out irrelevant papers before they reach the LLM. +- **Structured Data Extraction** — Automatically parses empty and non-empty stomach counts and key covariates (predator identity, survey location, survey year, and more) from tabular and narrative text. +- **Batch Processing** — Accepts a single PDF or an entire folder of PDFs in one command. +- **Provenance & Uncertainty Reporting** — Every result includes the classifier confidence score and an extraction provenance descriptor identifying the source sentence or table for each field, making downstream QA straightforward. +- **Locally-Run LLM** — The extraction model runs entirely on-device via [Ollama](https://ollama.com). Unpublished manuscripts and proprietary datasets never leave the researcher's environment. + +--- + +## Motivation + +Predator-prey interactions are central to ecosystem stability, yet predator feeding rates are rarely used in practice because the data required to estimate them are difficult to obtain at scale. To validate the fraction of feeding individuals metric for mainstream resource management and ecological theory, a scalable method is needed to harvest the untapped data that already exists in the vast ecological literature — accumulated over more than a century of field surveys conducted across the globe. + +We trained an XGBoost classifier on the [FracFeed global database](https://github.com/marknovak/FracFeed_DB) — a hand-annotated collection of predator diet surveys spanning 135 years and multiple continents — to recognize relevant publications so the LLM only processes papers likely to yield usable data. A pre-trained LLM running locally via Ollama then extracts the numbers of empty and non-empty stomachs and key covariates from each relevant paper. The resulting pipeline enables the generation of a comprehensive, covariate-rich database for subsequent analyses and applications. + +--- + +## Model Performance + +The classifier was evaluated on a held-out test set of 234 papers. It achieves **94% accuracy** across both relevant and irrelevant publications, with strong and balanced precision and recall. + +| Class | Precision | Recall | F1-score | Support | +|---|---|---|---|---| +| Not useful (0) | 0.96 | 0.91 | 0.93 | 110 | +| Useful (1) | 0.92 | 0.97 | 0.94 | 124 | +| **Overall** | **0.94** | **0.94** | **0.94** | **234** | + +

+ XGBoost training curve showing train and validation log-loss converging over 585 boosting rounds, with minimum validation loss of 0.193 at the best iteration +

+ +

XGBoost classifier training curve. Log-loss for train (blue) and validation (dashed orange) sets across 600 boosting rounds. Early stopping selected round 585 as the best iteration (min val loss: 0.193).

+ +--- + +## Pipeline Architecture + +Our two-stage pipeline combines a lightweight classifier with a locally-run LLM to minimize cost and runtime at scale. The classifier acts as a gate — only papers it scores as useful proceed to the more expensive extraction step. + +

+ Architecture diagram showing the two-stage FracFeedExtractor pipeline: XGBoost classifier stage followed by Ollama LLM extraction stage +

+ +The pipeline consists of the following components: + +1. **PDF Text Extraction** — PyMuPDF parses each PDF; Tesseract OCR handles scanned documents. +2. **Text Cleaning & Section Filtering** — References, captions, and irrelevant paragraphs are stripped to reduce noise before classification. +3. **XGBoost Classifier** — TF-IDF features feed a trained XGBoost model that scores each paper as useful or not useful with a confidence score. +4. **LLM Extraction** — Relevant papers are passed to a locally-run LLM (via Ollama) with a structured prompt, returning a `PredatorDietMetrics` JSON object containing stomach counts, predator identity, survey location, and survey year. +5. **Output** — Per-paper JSON files and a pipeline summary CSV are written to `data/results/`. + +--- + +## Pipeline Demo + +Below is a condensed view of a typical pipeline run on a folder of PDFs. The classifier scores each paper and routes it; relevant papers proceed to LLM extraction. + +``` +$ python classify_extract.py data/demo/ + +[1/4] Bakaloudis_2012.pdf → useful (confidence: 0.91) + Extracted: Buteo buteo | Greece | 2001–2006 | 143 stomachs (88 non-empty) + +[2/4] Hales_2008.pdf → useful (confidence: 0.87) + Extracted: Gadus morhua | North Sea | 2005–2007 | 312 stomachs (201 non-empty) + +[3/4] GenericReview.pdf → not useful (confidence: 0.78) + Skipped — no stomach count data detected. + +[4/4] Insley_2021.pdf → useful (confidence: 0.95) + Extracted: Enhydra lutris | Alaska | 2018–2020 | 97 stomachs (82 non-empty) + +Results written to: + data/results/metrics/ ← per-paper JSON + data/results/summaries/ ← pipeline_summary.csv +``` + +--- ## Get Started ### Prerequisites -- **Python 3.10+** -- **[Ollama](https://ollama.com)** installed and running locally (minimum 8 GB RAM; 16 GB recommended) -- Pull the required model before running the pipeline: - ```bash - ollama pull qwen2.5:7b # default extraction model (~5 GB) - ``` - Verify Ollama is running: `ollama list` + +| Dependency | Notes | +|---|---| +| Python 3.10+ | Tested on 3.10–3.12 | +| [Ollama](https://ollama.com) | Must be running locally; 8 GB RAM minimum, 16 GB recommended | +| Tesseract OCR | System-level install required for scanned PDFs — see [Contributing Guide](documentation/CONTRIBUTING.md) for platform-specific instructions | + +Pull the default extraction model before running: + +```bash +ollama pull qwen2.5:7b # ~5 GB +ollama list # confirm it's available +``` ### Installation + ```bash git clone https://github.com/NovakLabOSU/FracFeedExtractor.git cd FracFeedExtractor pip install -r requirements.txt ``` -> **Note:** Tesseract OCR must be installed separately as a system dependency. See the [Contributing Guide](documentation/CONTRIBUTING.md) for platform-specific instructions. - ### Quick Start + ```bash -# Classify and extract data from a folder of PDFs +# Classify and extract from a folder of PDFs python classify_extract.py path/to/pdfs/ -``` - -For full setup details, virtual environment configuration, available CLI flags, and contribution guidelines, see the [Contributing Guide](documentation/CONTRIBUTING.md). -## Pipeline Demo +# Adjust the LLM model or confidence threshold +python classify_extract.py path/to/pdfs/ --llm-model llama3.1:8b --confidence-threshold 0.70 +``` -[IMAGE: Terminal screenshot showing the pipeline running on a folder of PDFs, displaying classifier output and extraction results per file] +Results are written to `data/results/metrics/` (per-paper JSON) and `data/results/summaries/` (pipeline CSV). -*Terminal screenshot showing the pipeline running on a folder of PDFs, displaying classifier output and extraction results per file.* +> For virtual environment setup, full CLI flag reference, and contribution guidelines, see the [Contributing Guide](documentation/CONTRIBUTING.md). --- -[IMAGE: Side-by-side comparison of a dense academic PDF on the left and the clean extracted JSON output on the right] - -*Side-by-side comparison of a dense academic PDF on the left and the clean extracted JSON output on the right.* - -## Motivation -Predator-prey interactions are central to ecosystem stability, yet a key parameter that quantifies predator-prey interaction strength (predator feeding rates) is rarely used in practice because the data required to estimate it are difficult to obtain. Our research has shown that the fraction of feeding individuals, defined as the proportion of predators with non-empty stomachs, can be easily obtained from routine predator diet surveys and is analytically linked to a species' metabolic demand, body size, temperature, mortality rate, extinction susceptibility, biological control effectiveness, and population resilience to perturbations. To validate this metric for mainstream resource management and ecological theory, a scalable method is needed to harvest the untapped data that exists in the vast ecological literature. - -The project trained an XGBoost classifier to identify which publications contain useful predator diet survey information. A pre-trained LLM running locally via Ollama then extracts the numbers of empty and non-empty stomachs counted and key covariates (predator identity, survey location, survey year, etc.). The classifier was trained on a large database of hand-annotated publications containing diet surveys conducted across the globe over the last 135 years, learning to recognize relevant publications so the LLM only processes papers likely to contain useful data. The resulting pipeline enables the generation of a comprehensive, covariate-rich database for subsequent analyses and applications. - +## Data Source -## Objectives/Deliverables -1. A trained XGBoost classifier paired with a pre-trained LLM that together ingest a publication's PDF and return a classification and the extracted data with descriptors of classification confidence and extraction provenance. -2. A Python pipeline that accepts a single pdf or a folder of pdfs, parses the text of each, queries the model for each, and exports the classification and data extraction results with clear provenance and uncertainty. -3. A clean, reproducible training and evaluation pipeline (including pdf preprocessing and model evaluation metrics) documented in a GitHub repository. -4. A documented GitHub repository detailing the classifier architecture, training procedure and guidance for future extensions. +We trained the classifier on the [FracFeed global database](https://github.com/marknovak/FracFeed_DB) — a hand-annotated collection of predator diet surveys from the primary ecological literature. -## Data sources -[FracFeed: Global database of the fraction of feeding predators](https://github.com/marknovak/FracFeed_DB) +--- ## Team @@ -78,49 +158,57 @@ The project trained an XGBoost classifier to identify which publications contain - Mark Novak
+ GitHub avatar for Mark Novak
Mark Novak
- Project Owner/Lead + Project Lead
- Sean Clayton
+ GitHub avatar for Sean Clayton
Sean Clayton
- Contributor + ML Pipeline & Backend
+
claytose@oregonstate.edu - Zahra Alsulaimawi
+ GitHub avatar for Zahra Alsulaimawi
Zahra Alsulaimawi
- Contributor + LLM Integration & Evaluation
+
alsulaza@oregonstate.edu - Raymond Cen
+ GitHub avatar for Raymond Cen
Raymond Cen
- Contributor + Data Processing & Testing
+
cenra@oregonstate.edu - Bradley Rule
+ GitHub avatar for Bradley Rule
Bradley Rule
- Contributor + PDF Extraction & OCR
+
ruleb@oregonstate.edu - --- -Found a bug or have a question? [Open an issue on GitHub Issues](https://github.com/NovakLabOSU/FracFeedExtractor/issues). +## Questions and Feedback + +Found a bug or have a question? [Open an issue on GitHub](https://github.com/NovakLabOSU/FracFeedExtractor/issues) — it's the fastest way to reach the team. + +--- ## Documentation -- [Contributing Guide](documentation/CONTRIBUTING.md) + +- [Contributing Guide](documentation/CONTRIBUTING.md) — setup, CLI reference, and contribution workflow - [Pipeline Architecture Diagram](documentation/architecture.png) -LICENSE: Pending partner confirmation +*License: Pending partner confirmation.* From ee414d13b902c295b84967b3b8da79c8d7171a9a Mon Sep 17 00:00:00 2001 From: SeanClay10 Date: Sun, 26 Apr 2026 16:18:54 -0700 Subject: [PATCH 12/22] feat: add training curve graph --- assets/training_curve.png | Bin 0 -> 155553 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/training_curve.png diff --git a/assets/training_curve.png b/assets/training_curve.png new file mode 100644 index 0000000000000000000000000000000000000000..68fcc960a7789839253745c755492597a6dada19 GIT binary patch literal 155553 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 literal 0 HcmV?d00001 From 4d9ee491ddc9601bf72a549b4f6addd8bb55857b Mon Sep 17 00:00:00 2001 From: SeanClay10 Date: Sun, 26 Apr 2026 16:49:28 -0700 Subject: [PATCH 13/22] feat: add new architecture document --- README.md | 57 +++++++------- assets/architecture.svg | 160 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 189 insertions(+), 28 deletions(-) create mode 100644 assets/architecture.svg diff --git a/README.md b/README.md index f1de579..df45666 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ ![License](https://img.shields.io/badge/license-pending-lightgrey?style=flat-square) [![GitHub Issues](https://img.shields.io/github/issues/NovakLabOSU/FracFeedExtractor?style=flat-square)](https://github.com/NovakLabOSU/FracFeedExtractor/issues) -*2025–2026 Oregon State University Senior Capstone Project, in collaboration with [Mark Novak's lab at OSU](https://github.com/NovakLabOSU).* +*2025–2026 Oregon State University Senior Capstone Project, in collaboration with Mark Novak.* --- @@ -66,7 +66,7 @@ The classifier was evaluated on a held-out test set of 234 papers. It achieves * Our two-stage pipeline combines a lightweight classifier with a locally-run LLM to minimize cost and runtime at scale. The classifier acts as a gate — only papers it scores as useful proceed to the more expensive extraction step.

- Architecture diagram showing the two-stage FracFeedExtractor pipeline: XGBoost classifier stage followed by Ollama LLM extraction stage + Architecture diagram showing the FracFeedExtractor pipeline: PDF input flows through text extraction, cleaning, XGBoost classification, and LLM extraction to produce structured JSON and CSV output

The pipeline consists of the following components: @@ -158,42 +158,43 @@ We trained the classifier on the [FracFeed global database](https://github.com/m
- GitHub avatar for Mark Novak
- Mark Novak
- Project Lead -
+ GitHub avatar for Mark Novak +
+ Mark Novak
+ Project Lead
+ Mark.Novak@oregonstate.edu - GitHub avatar for Sean Clayton
- Sean Clayton
- ML Pipeline & Backend
-
claytose@oregonstate.edu - + GitHub avatar for Sean Clayton +
+ Sean Clayton
+ ML Pipeline & Backend
+ claytose@oregonstate.edu - GitHub avatar for Zahra Alsulaimawi
- Zahra Alsulaimawi
- LLM Integration & Evaluation
-
alsulaza@oregonstate.edu - + GitHub avatar for Zahra Alsulaimawi +
+ Zahra Alsulaimawi
+ LLM Integration & Evaluation
+ alsulaza@oregonstate.edu - GitHub avatar for Raymond Cen
- Raymond Cen
- Data Processing & Testing
-
cenra@oregonstate.edu - + GitHub avatar for Raymond Cen +
+ Raymond Cen
+ Data Processing & Testing
+ cenra@oregonstate.edu - GitHub avatar for Bradley Rule
- Bradley Rule
- PDF Extraction & OCR
-
ruleb@oregonstate.edu - + GitHub avatar for Bradley Rule +
+ Bradley Rule
+ PDF Extraction & OCR
+ ruleb@oregonstate.edu @@ -202,13 +203,13 @@ We trained the classifier on the [FracFeed global database](https://github.com/m ## Questions and Feedback -Found a bug or have a question? [Open an issue on GitHub](https://github.com/NovakLabOSU/FracFeedExtractor/issues) — it's the fastest way to reach the team. +Found a bug or have a question? [Open an issue on GitHub](https://github.com/NovakLabOSU/FracFeedExtractor/issues). --- ## Documentation - [Contributing Guide](documentation/CONTRIBUTING.md) — setup, CLI reference, and contribution workflow -- [Pipeline Architecture Diagram](documentation/architecture.png) +- [Pipeline Architecture Diagram](assets/architecture.svg) *License: Pending partner confirmation.* diff --git a/assets/architecture.svg b/assets/architecture.svg new file mode 100644 index 0000000..e1268c6 --- /dev/null +++ b/assets/architecture.svg @@ -0,0 +1,160 @@ + + + + + + + + + + + + + + + + + + + + + STAGE I · INPUT + + + + STAGE II · PREPROCESSING + + + + STAGE III · CLASSIFICATION + + + + STAGE IV · EXTRACTION + + + + STAGE V · OUTPUT + + + + + + PDF Files + single file or folder + + + + Text Extraction + PyMuPDF · Tesseract OCR + + + + + + + Text Cleaning + Section Filtering + + + + TF-IDF Vectorizer + Feature extraction + + + + + + + XGBoost Classifier + Binary classification + + + + LLM Extraction + Ollama (local) + + + + JSON + structured metrics + + + + Pipeline Summary + aggregated CSV + + + + + + + + + + + + Useful + + + + + + + + + + + Not Useful + + + confidence score recorded — paper skipped + + From 7933e7389b64ef69b1c332d4b205ebb109ff0352 Mon Sep 17 00:00:00 2001 From: SeanClay10 Date: Sun, 26 Apr 2026 16:58:00 -0700 Subject: [PATCH 14/22] fix: add colors to architecture doc --- assets/architecture.svg | 54 ++++++++++++++++++++--------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/assets/architecture.svg b/assets/architecture.svg index e1268c6..4d9099d 100644 --- a/assets/architecture.svg +++ b/assets/architecture.svg @@ -19,33 +19,33 @@ - + + fill="#FEF0F3" stroke="#AAAAAA" stroke-width="0.8" stroke-dasharray="4,3"/> STAGE I · INPUT - + + fill="#EEF5FB" stroke="#AAAAAA" stroke-width="0.8" stroke-dasharray="4,3"/> STAGE II · PREPROCESSING - + + fill="#FEFAF0" stroke="#AAAAAA" stroke-width="0.8" stroke-dasharray="4,3"/> STAGE III · CLASSIFICATION - + + fill="#EEF8F1" stroke="#AAAAAA" stroke-width="0.8" stroke-dasharray="4,3"/> STAGE IV · EXTRACTION - + + fill="#F4EEFB" stroke="#AAAAAA" stroke-width="0.8" stroke-dasharray="4,3"/> STAGE V · OUTPUT @@ -53,19 +53,19 @@ + fill="#F8C0CC" stroke="#444444" stroke-width="0.9"/> PDF Files single file or folder + font-size="8.5" fill="#555555">Single file or folder + fill="#D9EDF7" stroke="#444444" stroke-width="0.9"/> Text Extraction PyMuPDF · Tesseract OCR + font-size="8.5" fill="#555555">PyMuPDF · Tesseract OCR + fill="#D9EDF7" stroke="#444444" stroke-width="0.9"/> Text Cleaning Section Filtering + font-size="8.5" fill="#555555">Section Filtering + fill="#FDEFC3" stroke="#444444" stroke-width="0.9"/> TF-IDF Vectorizer Feature extraction + font-size="8.5" fill="#555555">Feature extraction + fill="#FDEFC3" stroke="#444444" stroke-width="0.9"/> XGBoost Classifier Binary classification + font-size="8.5" fill="#555555">Binary classification + fill="#C9EDD4" stroke="#444444" stroke-width="0.9"/> LLM Extraction Ollama (local) + font-size="8.5" fill="#555555">Ollama (local) - + + fill="#E8D9F5" stroke="#444444" stroke-width="0.9"/> JSON structured metrics + font-size="8.5" fill="#555555">Structured metrics + fill="#E8D9F5" stroke="#444444" stroke-width="0.9"/> Pipeline Summary aggregated CSV + font-size="8.5" fill="#555555">Aggregated CSV From c3f70c1e0ae83428d15ad13d0040a6777aeb5e25 Mon Sep 17 00:00:00 2001 From: bradley Date: Sun, 26 Apr 2026 17:05:25 -0700 Subject: [PATCH 15/22] fix: updated installation instructions --- README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/README.md b/README.md index df45666..6e57ef5 100644 --- a/README.md +++ b/README.md @@ -125,8 +125,20 @@ ollama list # confirm it's available ### Installation ```bash +# Linux git clone https://github.com/NovakLabOSU/FracFeedExtractor.git cd FracFeedExtractor +python3 -m venv venv +source venv/bin/activate +pip install -r requirements.txt +``` + +```bash +# Windows PowerShell +git clone https://github.com/NovakLabOSU/FracFeedExtractor.git +cd FracFeedExtractor +py -m venv venv +./venv/Scripts/activate pip install -r requirements.txt ``` From c59701669ee7fb9b77e8346416fe18c7b25c2fa7 Mon Sep 17 00:00:00 2001 From: SeanClay10 Date: Sun, 26 Apr 2026 17:14:17 -0700 Subject: [PATCH 16/22] fix: add pipeline demo to README --- README.md | 24 +++------- assets/terminal_demo.svg | 97 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+), 19 deletions(-) create mode 100644 assets/terminal_demo.svg diff --git a/README.md b/README.md index df45666..dc3675e 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,10 @@ --- +

+ Illustration introducing the fraction of feeding predators concept +

+ ## Project Description This project contributes to validating a novel metric of predator-prey interaction strength — the **fraction of feeding individuals** — that has the potential to inform ecosystem-based resource management and ecological theory at scale. Given a folder of PDFs from the ecological literature, our pipeline screens each paper with a trained XGBoost classifier, routes relevant papers to a locally-run LLM for structured data extraction, and exports a covariate-rich database with classification confidence and extraction provenance attached to every record — overcoming the data-harvesting bottleneck that has hindered empirical validation of this metric. @@ -83,25 +87,7 @@ The pipeline consists of the following components: Below is a condensed view of a typical pipeline run on a folder of PDFs. The classifier scores each paper and routes it; relevant papers proceed to LLM extraction. -``` -$ python classify_extract.py data/demo/ - -[1/4] Bakaloudis_2012.pdf → useful (confidence: 0.91) - Extracted: Buteo buteo | Greece | 2001–2006 | 143 stomachs (88 non-empty) - -[2/4] Hales_2008.pdf → useful (confidence: 0.87) - Extracted: Gadus morhua | North Sea | 2005–2007 | 312 stomachs (201 non-empty) - -[3/4] GenericReview.pdf → not useful (confidence: 0.78) - Skipped — no stomach count data detected. - -[4/4] Insley_2021.pdf → useful (confidence: 0.95) - Extracted: Enhydra lutris | Alaska | 2018–2020 | 97 stomachs (82 non-empty) - -Results written to: - data/results/metrics/ ← per-paper JSON - data/results/summaries/ ← pipeline_summary.csv -``` +Terminal output showing FracFeedExtractor classifying four PDFs: three marked useful with extracted species data, one marked not useful and skipped --- diff --git a/assets/terminal_demo.svg b/assets/terminal_demo.svg new file mode 100644 index 0000000..beb0a27 --- /dev/null +++ b/assets/terminal_demo.svg @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + classify_extract.py + + + + $ + python classify_extract.py data/ + + + + + [1/4] + Bakaloudis_2012.pdf → + useful + (confidence: 0.91) + + + + + Extracted: + Buteo buteo | Greece | 2001–2006 | 143 stomachs (88 non-empty) + + + + + [2/4] + Hales_2008.pdf → + useful + (confidence: 0.87) + + + + + Extracted: + Gadus morhua | North Sea | 2005–2007 | 312 stomachs (201 non-empty) + + + + + [3/4] + Barry_1996.pdf → + not useful + (confidence: 0.38) + + + + + Skipped — confidence below threshold (0.70). + + + + + [4/4] + Insley_2021.pdf → + useful + (confidence: 0.95) + + + + + Extracted: + Enhydra lutris | Alaska | 2018–2020 | 97 stomachs (82 non-empty) + + + + Results written to: + + + + data/results/metrics/ + ← per-paper JSON + + + + + data/results/summaries/ + ← pipeline_summary.csv + + + From 68798795858b079f149c68672eb767df77ceaddb Mon Sep 17 00:00:00 2001 From: SeanClay10 Date: Sun, 26 Apr 2026 17:18:33 -0700 Subject: [PATCH 17/22] fix: minor wording fix --- README.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 6c6c894..37a87c7 100644 --- a/README.md +++ b/README.md @@ -17,13 +17,13 @@ ## Project Description -This project contributes to validating a novel metric of predator-prey interaction strength — the **fraction of feeding individuals** — that has the potential to inform ecosystem-based resource management and ecological theory at scale. Given a folder of PDFs from the ecological literature, our pipeline screens each paper with a trained XGBoost classifier, routes relevant papers to a locally-run LLM for structured data extraction, and exports a covariate-rich database with classification confidence and extraction provenance attached to every record — overcoming the data-harvesting bottleneck that has hindered empirical validation of this metric. +This project contributes to validating a novel metric of predator-prey interaction, the **fraction of feeding individuals**, that has the potential to inform ecosystem-based resource management and ecological theory at scale. Given a folder of PDFs from the ecological literature, our pipeline screens each paper with a trained XGBoost classifier, routes relevant papers to a locally-run LLM for structured data extraction, and exports a JSON with classification confidence and extraction provenance attached to every record, overcoming the data harvesting bottleneck that has hindered validation of this metric. --- ## What is the Fraction of Feeding Individuals? -The **fraction of feeding individuals** is defined as the proportion of predators found to have non-empty stomachs at the time of sampling — a quantity that can be obtained directly from routine predator diet surveys. Research from [Mark Novak's lab at Oregon State University](https://github.com/NovakLabOSU) has established that this metric is analytically linked to a species' metabolic demand, body size, temperature, mortality rate, extinction susceptibility, biological control effectiveness, and population resilience to perturbation — making it a powerful and underutilized parameter for ecosystem-based resource management. +The **fraction of feeding individuals** is defined as the proportion of predators found to have non-empty stomachs at the time of sampling. This is a quantity that can be obtained directly from routine predator diet surveys. Research from [Mark Novak's lab at Oregon State University](https://github.com/NovakLabOSU) has established that this metric is analytically linked to a species' metabolic demand, body size, temperature, mortality rate, extinction susceptibility, biological control effectiveness, and population resilience to perturbation, making it a powerful and underutilized parameter for ecosystem-based resource management. Despite its potential, the metric is rarely used in practice. The underlying data exists across more than a century of published predator diet surveys, but harvesting it by hand from the primary literature is prohibitively slow at the scale required for meaningful cross-species analysis. FracFeedExtractor was built to solve that bottleneck: given a collection of PDFs, it automatically identifies which papers contain usable diet survey data and extracts the key numbers and covariates needed to compute the fraction of feeding individuals. @@ -41,9 +41,9 @@ Despite its potential, the metric is rarely used in practice. The underlying dat ## Motivation -Predator-prey interactions are central to ecosystem stability, yet predator feeding rates are rarely used in practice because the data required to estimate them are difficult to obtain at scale. To validate the fraction of feeding individuals metric for mainstream resource management and ecological theory, a scalable method is needed to harvest the untapped data that already exists in the vast ecological literature — accumulated over more than a century of field surveys conducted across the globe. +Predator-prey interactions are central to ecosystem stability, yet predator feeding rates are rarely used in practice because the data required to estimate them are difficult to obtain at scale. To validate the fraction of feeding individuals metric for mainstream resource management and ecological theory, a scalable method is needed to harvest the untapped data that already exists in the vast ecological literature, accumulated over more than a century of field surveys conducted across the globe. -We trained an XGBoost classifier on the [FracFeed global database](https://github.com/marknovak/FracFeed_DB) — a hand-annotated collection of predator diet surveys spanning 135 years and multiple continents — to recognize relevant publications so the LLM only processes papers likely to yield usable data. A pre-trained LLM running locally via Ollama then extracts the numbers of empty and non-empty stomachs and key covariates from each relevant paper. The resulting pipeline enables the generation of a comprehensive, covariate-rich database for subsequent analyses and applications. +We trained an XGBoost classifier on the [FracFeed global database](https://github.com/marknovak/FracFeed_DB), a hand-annotated collection of predator diet surveys spanning 135 years and multiple continents, to recognize relevant publications so the LLM only processes papers likely to yield usable data. An LLM running locally via Ollama then extracts the numbers of empty and non-empty stomachs and key covariates from each relevant paper. The resulting pipeline enables the generation of a comprehensive database for subsequent analyses and applications. --- @@ -201,7 +201,8 @@ We trained the classifier on the [FracFeed global database](https://github.com/m ## Questions and Feedback -Found a bug or have a question? [Open an issue on GitHub](https://github.com/NovakLabOSU/FracFeedExtractor/issues). +Found a bug or have a question? +[Open an issue on GitHub](https://github.com/NovakLabOSU/FracFeedExtractor/issues). --- From 0b650c70f7907bc35d8930904bdf7d7800d65ee2 Mon Sep 17 00:00:00 2001 From: SeanClay10 Date: Sun, 26 Apr 2026 17:23:16 -0700 Subject: [PATCH 18/22] fix: README image updates --- README.md | 6 ++++-- assets/fraction-feeding-preds.jfif | Bin 0 -> 25448 bytes 2 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 assets/fraction-feeding-preds.jfif diff --git a/README.md b/README.md index 37a87c7..d069204 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ ---

- Illustration introducing the fraction of feeding predators concept + Predator diet surveys form the foundation for estimating the fraction of feeding individuals across species.

## Project Description @@ -58,7 +58,7 @@ The classifier was evaluated on a held-out test set of 234 papers. It achieves * | **Overall** | **0.94** | **0.94** | **0.94** | **234** |

- XGBoost training curve showing train and validation log-loss converging over 585 boosting rounds, with minimum validation loss of 0.193 at the best iteration + XGBoost training curve showing train and validation log-loss converging over 585 boosting rounds, with minimum validation loss of 0.193 at the best iteration

XGBoost classifier training curve. Log-loss for train (blue) and validation (dashed orange) sets across 600 boosting rounds. Early stopping selected round 585 as the best iteration (min val loss: 0.193).

@@ -73,6 +73,8 @@ Our two-stage pipeline combines a lightweight classifier with a locally-run LLM Architecture diagram showing the FracFeedExtractor pipeline: PDF input flows through text extraction, cleaning, XGBoost classification, and LLM extraction to produce structured JSON and CSV output

+

Five-stage pipeline architecture. PDF files are preprocessed, filtered, and classified before useful papers proceed to LLM data extraction and structured output.

+ The pipeline consists of the following components: 1. **PDF Text Extraction** — PyMuPDF parses each PDF; Tesseract OCR handles scanned documents. diff --git a/assets/fraction-feeding-preds.jfif b/assets/fraction-feeding-preds.jfif new file mode 100644 index 0000000000000000000000000000000000000000..96216d7c411506bb7f3d9bd968cc5a5002f652c2 GIT binary patch literal 25448 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 literal 0 HcmV?d00001 From 805238dbae1b57a218f98d3d30d15aa888c59658 Mon Sep 17 00:00:00 2001 From: SeanClay10 Date: Sun, 26 Apr 2026 17:24:39 -0700 Subject: [PATCH 19/22] fix: image size update --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d069204..2adf768 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ ---

- Predator diet surveys form the foundation for estimating the fraction of feeding individuals across species. + Predator diet surveys form the foundation for estimating the fraction of feeding individuals across species.

## Project Description @@ -58,7 +58,7 @@ The classifier was evaluated on a held-out test set of 234 papers. It achieves * | **Overall** | **0.94** | **0.94** | **0.94** | **234** |

- XGBoost training curve showing train and validation log-loss converging over 585 boosting rounds, with minimum validation loss of 0.193 at the best iteration + XGBoost training curve showing train and validation log-loss converging over 585 boosting rounds, with minimum validation loss of 0.193 at the best iteration

XGBoost classifier training curve. Log-loss for train (blue) and validation (dashed orange) sets across 600 boosting rounds. Early stopping selected round 585 as the best iteration (min val loss: 0.193).

From 72db306e62da32d8b0daf57c26b31c16b000c2fa Mon Sep 17 00:00:00 2001 From: SeanClay10 Date: Sun, 26 Apr 2026 17:35:39 -0700 Subject: [PATCH 20/22] fix: formatting fix --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2adf768..29eca14 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,8 @@ *2025–2026 Oregon State University Senior Capstone Project, in collaboration with Mark Novak.* +[**→ Try It Yourself**](#get-started) + ---

@@ -107,7 +109,7 @@ Pull the default extraction model before running: ```bash ollama pull qwen2.5:7b # ~5 GB -ollama list # confirm it's available +ollama list ``` ### Installation @@ -204,7 +206,7 @@ We trained the classifier on the [FracFeed global database](https://github.com/m ## Questions and Feedback Found a bug or have a question? -[Open an issue on GitHub](https://github.com/NovakLabOSU/FracFeedExtractor/issues). +[Open an issue on GitHub](https://github.com/NovakLabOSU/FracFeedExtractor/issues) --- From 0cdbabd37ba0efa7d86be7abfa265d9db5fddc3f Mon Sep 17 00:00:00 2001 From: SeanClay10 Date: Sun, 26 Apr 2026 17:51:43 -0700 Subject: [PATCH 21/22] fix: captions --- README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 29eca14..d4aaf16 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,7 @@

Predator diet surveys form the foundation for estimating the fraction of feeding individuals across species.

+

Predator diet surveys form the foundation for estimating the fraction of feeding individuals across species.

## Project Description @@ -89,9 +90,12 @@ The pipeline consists of the following components: ## Pipeline Demo -Below is a condensed view of a typical pipeline run on a folder of PDFs. The classifier scores each paper and routes it; relevant papers proceed to LLM extraction. +Below is a condensed view of a typical pipeline run on a folder of PDFs. The classifier scores each paper and routes it while relevant papers proceed to LLM extraction. -Terminal output showing FracFeedExtractor classifying four PDFs: three marked useful with extracted species data, one marked not useful and skipped +

+ Terminal output showing FracFeedExtractor classifying four PDFs: three marked useful with extracted species data, one marked not useful and skipped +

+

FracFeedExtractor pipeline run on a folder of PDFs.

--- From 1efe7da072f619e5e442af97db6d10925fee7076 Mon Sep 17 00:00:00 2001 From: SeanClay10 Date: Sun, 26 Apr 2026 17:54:47 -0700 Subject: [PATCH 22/22] fix: reorder README sections --- README.md | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index d4aaf16..9d33fb9 100644 --- a/README.md +++ b/README.md @@ -50,25 +50,8 @@ We trained an XGBoost classifier on the [FracFeed global database](https://githu --- -## Model Performance - -The classifier was evaluated on a held-out test set of 234 papers. It achieves **94% accuracy** across both relevant and irrelevant publications, with strong and balanced precision and recall. - -| Class | Precision | Recall | F1-score | Support | -|---|---|---|---|---| -| Not useful (0) | 0.96 | 0.91 | 0.93 | 110 | -| Useful (1) | 0.92 | 0.97 | 0.94 | 124 | -| **Overall** | **0.94** | **0.94** | **0.94** | **234** | -

- XGBoost training curve showing train and validation log-loss converging over 585 boosting rounds, with minimum validation loss of 0.193 at the best iteration -

- -

XGBoost classifier training curve. Log-loss for train (blue) and validation (dashed orange) sets across 600 boosting rounds. Early stopping selected round 585 as the best iteration (min val loss: 0.193).

- ---- - -## Pipeline Architecture +## System Architecture Our two-stage pipeline combines a lightweight classifier with a locally-run LLM to minimize cost and runtime at scale. The classifier acts as a gate — only papers it scores as useful proceed to the more expensive extraction step. @@ -99,6 +82,24 @@ Below is a condensed view of a typical pipeline run on a folder of PDFs. The cla --- +## Model Performance + +The classifier was evaluated on a held-out test set of 234 papers. It achieves **94% accuracy** across both relevant and irrelevant publications, with strong and balanced precision and recall. + +| Class | Precision | Recall | F1-score | Support | +|---|---|---|---|---| +| Not useful (0) | 0.96 | 0.91 | 0.93 | 110 | +| Useful (1) | 0.92 | 0.97 | 0.94 | 124 | +| **Overall** | **0.94** | **0.94** | **0.94** | **234** | + +

+ XGBoost training curve showing train and validation log-loss converging over 585 boosting rounds, with minimum validation loss of 0.193 at the best iteration +

+ +

XGBoost classifier training curve. Log-loss for train (blue) and validation (dashed orange) sets across 600 boosting rounds. Early stopping selected round 585 as the best iteration (min val loss: 0.193).

+ +--- + ## Get Started ### Prerequisites @@ -217,6 +218,6 @@ Found a bug or have a question? ## Documentation - [Contributing Guide](documentation/CONTRIBUTING.md) — setup, CLI reference, and contribution workflow -- [Pipeline Architecture Diagram](assets/architecture.svg) +- [System Architecture Diagram](assets/architecture.svg) *License: Pending partner confirmation.*