bibliodash 1.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- bibliodash-1.0.0/MANIFEST.in +9 -0
- bibliodash-1.0.0/PKG-INFO +349 -0
- bibliodash-1.0.0/README.md +303 -0
- bibliodash-1.0.0/bibliodash.egg-info/PKG-INFO +349 -0
- bibliodash-1.0.0/bibliodash.egg-info/SOURCES.txt +157 -0
- bibliodash-1.0.0/bibliodash.egg-info/dependency_links.txt +1 -0
- bibliodash-1.0.0/bibliodash.egg-info/entry_points.txt +2 -0
- bibliodash-1.0.0/bibliodash.egg-info/requires.txt +30 -0
- bibliodash-1.0.0/bibliodash.egg-info/top_level.txt +1 -0
- bibliodash-1.0.0/biblioflow/__init__.py +6 -0
- bibliodash-1.0.0/biblioflow/_server/Public/BiblioFlow-LOGO.png +0 -0
- bibliodash-1.0.0/biblioflow/_server/Public/BiblioFlow_Workflow.png +0 -0
- bibliodash-1.0.0/biblioflow/_server/Public/BiblioFlow_logo.png +0 -0
- bibliodash-1.0.0/biblioflow/_server/__init__.py +0 -0
- bibliodash-1.0.0/biblioflow/_server/app.py +164 -0
- bibliodash-1.0.0/biblioflow/_server/assets/biblioflow_logo.png +0 -0
- bibliodash-1.0.0/biblioflow/_server/assets/style.css +529 -0
- bibliodash-1.0.0/biblioflow/_server/components.py +388 -0
- bibliodash-1.0.0/biblioflow/_server/config.py +43 -0
- bibliodash-1.0.0/biblioflow/_server/data_loader.py +77 -0
- bibliodash-1.0.0/biblioflow/_server/database/__init__.py +0 -0
- bibliodash-1.0.0/biblioflow/_server/database/connection.py +40 -0
- bibliodash-1.0.0/biblioflow/_server/database/schema.sql +173 -0
- bibliodash-1.0.0/biblioflow/_server/db.py +61 -0
- bibliodash-1.0.0/biblioflow/_server/engine/__init__.py +27 -0
- bibliodash-1.0.0/biblioflow/_server/engine/ai_summary.py +168 -0
- bibliodash-1.0.0/biblioflow/_server/engine/authors.py +253 -0
- bibliodash-1.0.0/biblioflow/_server/engine/citations.py +57 -0
- bibliodash-1.0.0/biblioflow/_server/engine/claim_extraction.py +136 -0
- bibliodash-1.0.0/biblioflow/_server/engine/clustering.py +133 -0
- bibliodash-1.0.0/biblioflow/_server/engine/countries.py +45 -0
- bibliodash-1.0.0/biblioflow/_server/engine/dataset.py +398 -0
- bibliodash-1.0.0/biblioflow/_server/engine/documents.py +71 -0
- bibliodash-1.0.0/biblioflow/_server/engine/duplicates.py +94 -0
- bibliodash-1.0.0/biblioflow/_server/engine/evidence.py +252 -0
- bibliodash-1.0.0/biblioflow/_server/engine/funding.py +134 -0
- bibliodash-1.0.0/biblioflow/_server/engine/gap_detection.py +104 -0
- bibliodash-1.0.0/biblioflow/_server/engine/institutions.py +197 -0
- bibliodash-1.0.0/biblioflow/_server/engine/intellectual_structure.py +68 -0
- bibliodash-1.0.0/biblioflow/_server/engine/journals.py +178 -0
- bibliodash-1.0.0/biblioflow/_server/engine/keywords.py +22 -0
- bibliodash-1.0.0/biblioflow/_server/engine/languages.py +78 -0
- bibliodash-1.0.0/biblioflow/_server/engine/llm.py +74 -0
- bibliodash-1.0.0/biblioflow/_server/engine/network_utils.py +102 -0
- bibliodash-1.0.0/biblioflow/_server/engine/publications.py +230 -0
- bibliodash-1.0.0/biblioflow/_server/engine/publishers.py +96 -0
- bibliodash-1.0.0/biblioflow/_server/engine/references.py +22 -0
- bibliodash-1.0.0/biblioflow/_server/engine/semantic_search.py +202 -0
- bibliodash-1.0.0/biblioflow/_server/engine/social_networks.py +74 -0
- bibliodash-1.0.0/biblioflow/_server/engine/thematic.py +108 -0
- bibliodash-1.0.0/biblioflow/_server/export/__init__.py +0 -0
- bibliodash-1.0.0/biblioflow/_server/export/bibliometrix.py +54 -0
- bibliodash-1.0.0/biblioflow/_server/export/bibtex_export.py +32 -0
- bibliodash-1.0.0/biblioflow/_server/export/csv_export.py +40 -0
- bibliodash-1.0.0/biblioflow/_server/export/json_export.py +9 -0
- bibliodash-1.0.0/biblioflow/_server/extract/__init__.py +0 -0
- bibliodash-1.0.0/biblioflow/_server/extract/checksum.py +10 -0
- bibliodash-1.0.0/biblioflow/_server/extract/docling_extract.py +96 -0
- bibliodash-1.0.0/biblioflow/_server/extract/doi.py +93 -0
- bibliodash-1.0.0/biblioflow/_server/extract/pdf_extract.py +48 -0
- bibliodash-1.0.0/biblioflow/_server/extract/text_patterns.py +74 -0
- bibliodash-1.0.0/biblioflow/_server/extract/title.py +51 -0
- bibliodash-1.0.0/biblioflow/_server/import_scopus_csv.py +154 -0
- bibliodash-1.0.0/biblioflow/_server/migrate_legacy.py +27 -0
- bibliodash-1.0.0/biblioflow/_server/models.py +93 -0
- bibliodash-1.0.0/biblioflow/_server/pages/ai.py +559 -0
- bibliodash-1.0.0/biblioflow/_server/pages/analysis_shared.py +69 -0
- bibliodash-1.0.0/biblioflow/_server/pages/api_page.py +31 -0
- bibliodash-1.0.0/biblioflow/_server/pages/authors_page.py +317 -0
- bibliodash-1.0.0/biblioflow/_server/pages/clustering.py +120 -0
- bibliodash-1.0.0/biblioflow/_server/pages/conceptual_structure.py +185 -0
- bibliodash-1.0.0/biblioflow/_server/pages/content_analysis_page.py +23 -0
- bibliodash-1.0.0/biblioflow/_server/pages/dashboard.py +274 -0
- bibliodash-1.0.0/biblioflow/_server/pages/data_page.py +31 -0
- bibliodash-1.0.0/biblioflow/_server/pages/documents_page.py +192 -0
- bibliodash-1.0.0/biblioflow/_server/pages/evidence.py +408 -0
- bibliodash-1.0.0/biblioflow/_server/pages/filters_page.py +33 -0
- bibliodash-1.0.0/biblioflow/_server/pages/gaps.py +246 -0
- bibliodash-1.0.0/biblioflow/_server/pages/import_page.py +107 -0
- bibliodash-1.0.0/biblioflow/_server/pages/info_page.py +25 -0
- bibliodash-1.0.0/biblioflow/_server/pages/library.py +85 -0
- bibliodash-1.0.0/biblioflow/_server/pages/networks.py +55 -0
- bibliodash-1.0.0/biblioflow/_server/pages/overview.py +244 -0
- bibliodash-1.0.0/biblioflow/_server/pages/paper_details.py +86 -0
- bibliodash-1.0.0/biblioflow/_server/pages/prisma_page.py +21 -0
- bibliodash-1.0.0/biblioflow/_server/pages/projects.py +133 -0
- bibliodash-1.0.0/biblioflow/_server/pages/report_page.py +35 -0
- bibliodash-1.0.0/biblioflow/_server/pages/semantic_search.py +221 -0
- bibliodash-1.0.0/biblioflow/_server/pages/settings.py +44 -0
- bibliodash-1.0.0/biblioflow/_server/pages/social_structure.py +147 -0
- bibliodash-1.0.0/biblioflow/_server/pages/sources.py +300 -0
- bibliodash-1.0.0/biblioflow/_server/pages/tall_export_page.py +21 -0
- bibliodash-1.0.0/biblioflow/_server/pages/timeline.py +187 -0
- bibliodash-1.0.0/biblioflow/_server/pipeline.py +131 -0
- bibliodash-1.0.0/biblioflow/_server/providers/__init__.py +0 -0
- bibliodash-1.0.0/biblioflow/_server/providers/base.py +12 -0
- bibliodash-1.0.0/biblioflow/_server/providers/crossref.py +14 -0
- bibliodash-1.0.0/biblioflow/_server/providers/openalex.py +81 -0
- bibliodash-1.0.0/biblioflow/_server/providers/orcid.py +34 -0
- bibliodash-1.0.0/biblioflow/_server/providers/pubmed.py +49 -0
- bibliodash-1.0.0/biblioflow/_server/providers/ror.py +31 -0
- bibliodash-1.0.0/biblioflow/_server/providers/scopus.py +15 -0
- bibliodash-1.0.0/biblioflow/_server/providers/semantic_scholar.py +72 -0
- bibliodash-1.0.0/biblioflow/_server/providers/unpaywall.py +35 -0
- bibliodash-1.0.0/biblioflow/_server/repository/__init__.py +0 -0
- bibliodash-1.0.0/biblioflow/_server/repository/event_repository.py +33 -0
- bibliodash-1.0.0/biblioflow/_server/repository/job_repository.py +32 -0
- bibliodash-1.0.0/biblioflow/_server/repository/lookup_repository.py +36 -0
- bibliodash-1.0.0/biblioflow/_server/repository/paper_repository.py +318 -0
- bibliodash-1.0.0/biblioflow/_server/repository/project_repository.py +57 -0
- bibliodash-1.0.0/biblioflow/_server/repository/provenance_repository.py +33 -0
- bibliodash-1.0.0/biblioflow/_server/scopus/__init__.py +0 -0
- bibliodash-1.0.0/biblioflow/_server/scopus/cache.py +24 -0
- bibliodash-1.0.0/biblioflow/_server/scopus/fetch.py +36 -0
- bibliodash-1.0.0/biblioflow/_server/scopus/parser.py +36 -0
- bibliodash-1.0.0/biblioflow/_server/services/__init__.py +0 -0
- bibliodash-1.0.0/biblioflow/_server/services/enrichment_service.py +194 -0
- bibliodash-1.0.0/biblioflow/_server/services/event_service.py +13 -0
- bibliodash-1.0.0/biblioflow/_server/services/import_service.py +96 -0
- bibliodash-1.0.0/biblioflow/_server/services/paper_export_service.py +41 -0
- bibliodash-1.0.0/biblioflow/_server/services/project_service.py +25 -0
- bibliodash-1.0.0/biblioflow/_server/utils/__init__.py +0 -0
- bibliodash-1.0.0/biblioflow/_server/utils/export_cache.py +15 -0
- bibliodash-1.0.0/biblioflow/_server/utils/export_utils.py +23 -0
- bibliodash-1.0.0/biblioflow/_server/verify/__init__.py +0 -0
- bibliodash-1.0.0/biblioflow/_server/verify/crossref.py +27 -0
- bibliodash-1.0.0/biblioflow/_server/verify/fuzzy.py +7 -0
- bibliodash-1.0.0/biblioflow/_server/verify/validation.py +41 -0
- bibliodash-1.0.0/biblioflow/_server/visualizations/__init__.py +0 -0
- bibliodash-1.0.0/biblioflow/_server/visualizations/area.py +20 -0
- bibliodash-1.0.0/biblioflow/_server/visualizations/boxplot.py +12 -0
- bibliodash-1.0.0/biblioflow/_server/visualizations/bradford.py +49 -0
- bibliodash-1.0.0/biblioflow/_server/visualizations/bubble.py +27 -0
- bibliodash-1.0.0/biblioflow/_server/visualizations/calendar.py +13 -0
- bibliodash-1.0.0/biblioflow/_server/visualizations/donut.py +25 -0
- bibliodash-1.0.0/biblioflow/_server/visualizations/gauge.py +27 -0
- bibliodash-1.0.0/biblioflow/_server/visualizations/geo_utils.py +47 -0
- bibliodash-1.0.0/biblioflow/_server/visualizations/heatmap.py +8 -0
- bibliodash-1.0.0/biblioflow/_server/visualizations/histogram.py +8 -0
- bibliodash-1.0.0/biblioflow/_server/visualizations/line.py +14 -0
- bibliodash-1.0.0/biblioflow/_server/visualizations/lollipop.py +45 -0
- bibliodash-1.0.0/biblioflow/_server/visualizations/network.py +132 -0
- bibliodash-1.0.0/biblioflow/_server/visualizations/radar.py +21 -0
- bibliodash-1.0.0/biblioflow/_server/visualizations/sankey.py +15 -0
- bibliodash-1.0.0/biblioflow/_server/visualizations/scatter.py +17 -0
- bibliodash-1.0.0/biblioflow/_server/visualizations/sunburst.py +16 -0
- bibliodash-1.0.0/biblioflow/_server/visualizations/theme.py +68 -0
- bibliodash-1.0.0/biblioflow/_server/visualizations/timeline.py +20 -0
- bibliodash-1.0.0/biblioflow/_server/visualizations/treemap.py +16 -0
- bibliodash-1.0.0/biblioflow/_server/visualizations/violin.py +10 -0
- bibliodash-1.0.0/biblioflow/_server/visualizations/wordcloud.py +42 -0
- bibliodash-1.0.0/biblioflow/_server/visualizations/worldmap.py +91 -0
- bibliodash-1.0.0/biblioflow/cli.py +290 -0
- bibliodash-1.0.0/biblioflow/config.py +115 -0
- bibliodash-1.0.0/biblioflow/hardware.py +175 -0
- bibliodash-1.0.0/biblioflow/wizard.py +272 -0
- bibliodash-1.0.0/biblioflow/workspace.py +65 -0
- bibliodash-1.0.0/pyproject.toml +83 -0
- bibliodash-1.0.0/setup.cfg +4 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
include README.md
|
|
2
|
+
include LICENSE
|
|
3
|
+
include pyproject.toml
|
|
4
|
+
|
|
5
|
+
recursive-include biblioflow *.py *.css *.png *.jpg *.toml *.sql
|
|
6
|
+
recursive-exclude biblioflow/_server/cache *
|
|
7
|
+
recursive-exclude biblioflow/_server/logs *
|
|
8
|
+
recursive-exclude **/__pycache__ *
|
|
9
|
+
recursive-exclude * *.pyc *.pyo
|
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: bibliodash
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Local-first bibliometric analysis platform — Research Intelligence, Flowing Insights
|
|
5
|
+
Author-email: Robin Tomar <itsrobintomar@gmail.com>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/imrobintomar/BiblioFlow
|
|
8
|
+
Project-URL: Repository, https://github.com/imrobintomar/BiblioFlow
|
|
9
|
+
Project-URL: Issues, https://github.com/imrobintomar/BiblioFlow/issues
|
|
10
|
+
Keywords: bibliometrics,research,literature review,systematic review,PDF,dash
|
|
11
|
+
Classifier: Development Status :: 4 - Beta
|
|
12
|
+
Classifier: Intended Audience :: Science/Research
|
|
13
|
+
Classifier: Programming Language :: Python :: 3
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
17
|
+
Classifier: Topic :: Scientific/Engineering :: Information Analysis
|
|
18
|
+
Requires-Python: >=3.11
|
|
19
|
+
Description-Content-Type: text/markdown
|
|
20
|
+
Requires-Dist: dash>=2.14
|
|
21
|
+
Requires-Dist: dash-bootstrap-components>=1.5
|
|
22
|
+
Requires-Dist: dash-ag-grid>=31
|
|
23
|
+
Requires-Dist: plotly>=5.18
|
|
24
|
+
Requires-Dist: networkx>=3.0
|
|
25
|
+
Requires-Dist: rapidfuzz>=3.0
|
|
26
|
+
Requires-Dist: pydantic>=2.0
|
|
27
|
+
Requires-Dist: requests>=2.28
|
|
28
|
+
Requires-Dist: openpyxl>=3.1
|
|
29
|
+
Requires-Dist: pycountry>=23
|
|
30
|
+
Requires-Dist: geonamescache>=1.6
|
|
31
|
+
Requires-Dist: psutil>=5.9
|
|
32
|
+
Requires-Dist: rich>=13.0
|
|
33
|
+
Requires-Dist: python-dotenv>=1.0
|
|
34
|
+
Provides-Extra: pdf
|
|
35
|
+
Requires-Dist: pymupdf>=1.23; extra == "pdf"
|
|
36
|
+
Requires-Dist: pdfplumber>=0.10; extra == "pdf"
|
|
37
|
+
Requires-Dist: docling>=2.0; extra == "pdf"
|
|
38
|
+
Provides-Extra: semantic
|
|
39
|
+
Requires-Dist: sentence-transformers>=2.6; extra == "semantic"
|
|
40
|
+
Requires-Dist: faiss-cpu>=1.7; extra == "semantic"
|
|
41
|
+
Requires-Dist: scikit-learn>=1.4; extra == "semantic"
|
|
42
|
+
Provides-Extra: ai
|
|
43
|
+
Requires-Dist: ollama>=0.2; extra == "ai"
|
|
44
|
+
Provides-Extra: all
|
|
45
|
+
Requires-Dist: bibliodash[ai,pdf,semantic]; extra == "all"
|
|
46
|
+
|
|
47
|
+
<div align="center">
|
|
48
|
+
<img src="src/Public/BiblioFlow_logo.png" alt="BiblioFlow" width="420" />
|
|
49
|
+
|
|
50
|
+
<h3>Research Intelligence. Flowing Insights.</h3>
|
|
51
|
+
|
|
52
|
+
<p>
|
|
53
|
+
A local-first platform that extracts structured bibliometric data from research PDFs<br/>
|
|
54
|
+
and delivers deep scholarly analysis through an interactive, publication-quality dashboard.
|
|
55
|
+
</p>
|
|
56
|
+
|
|
57
|
+
<p>
|
|
58
|
+
<img src="https://img.shields.io/badge/Python-3.13+-3776AB?style=flat-square&logo=python&logoColor=white" alt="Python 3.13+"/>
|
|
59
|
+
<img src="https://img.shields.io/badge/Dash-2.x-008DE4?style=flat-square&logo=plotly&logoColor=white" alt="Dash"/>
|
|
60
|
+
<img src="https://img.shields.io/badge/Plotly-5.x-3F4F75?style=flat-square&logo=plotly&logoColor=white" alt="Plotly"/>
|
|
61
|
+
<img src="https://img.shields.io/badge/NetworkX-3.x-orange?style=flat-square" alt="NetworkX"/>
|
|
62
|
+
<img src="https://img.shields.io/badge/SQLite-local--first-003B57?style=flat-square&logo=sqlite&logoColor=white" alt="SQLite"/>
|
|
63
|
+
<img src="https://img.shields.io/badge/Ollama-local%20AI-black?style=flat-square" alt="Ollama"/>
|
|
64
|
+
<img src="https://img.shields.io/badge/status-active-brightgreen?style=flat-square" alt="Status"/>
|
|
65
|
+
</p>
|
|
66
|
+
</div>
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## What is BiblioFlow?
|
|
71
|
+
|
|
72
|
+
**BiblioFlow** is a self-hosted bibliometric analysis tool built for researchers. You bring a collection of research PDFs — BiblioFlow does the rest.
|
|
73
|
+
|
|
74
|
+
It reads every PDF, pulls out the key scholarly metadata (title, DOI, authors, abstract, keywords, funding, citations), automatically enriches each record from open academic databases, and then presents the entire corpus through a rich, interactive analysis dashboard — all running locally on your machine with no data sent to any external service.
|
|
75
|
+
|
|
76
|
+
**The core workflow is simple:**
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
Upload PDFs → BiblioFlow extracts & enriches metadata → Explore bibliometric analysis
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Everything — from publication trends to author networks, keyword co-occurrence to AI-generated research summaries — is derived from the data inside your own PDF collection.
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## Analysis Modules
|
|
87
|
+
|
|
88
|
+
BiblioFlow provides fourteen dedicated analysis modules across four capability tiers.
|
|
89
|
+
|
|
90
|
+
### 📊 Overview
|
|
91
|
+
Annual, monthly, quarterly, and decade-level publication production. Growth rates (CAGR), cumulative output, moving averages, publication heatmaps, and forecasting — broken down by document type, country, institution, and journal.
|
|
92
|
+
|
|
93
|
+
### 📚 Sources
|
|
94
|
+
Identifies the most productive journals and publishers in your corpus. Applies Bradford's Law to reveal the core zone of journals. Shows journal H-index, citation impact, open-access distribution, and publication timelines.
|
|
95
|
+
|
|
96
|
+
### ✍️ Authors
|
|
97
|
+
Ranks authors by productivity and citation impact. Computes H-index, G-index, M-index, i10-index, citation velocity, and career trajectory for every author. Maps co-author collaboration networks with community detection.
|
|
98
|
+
|
|
99
|
+
### 📄 Documents
|
|
100
|
+
Lists the most-cited papers in your corpus. Analyses reference lists to find the most frequently co-cited works. Full funding intelligence: funder lollipop chart, category breakdown (Government / Industry / Other), year-on-year funding trends, and multi-funded paper table.
|
|
101
|
+
|
|
102
|
+
### 🔑 Conceptual Structure
|
|
103
|
+
Identifies the most frequent keywords and concepts. Builds a **Thematic Map** — plotting keyword clusters by Callon centrality versus density — to reveal motor, niche, emerging, and declining themes. Tracks how keyword sets shift over time.
|
|
104
|
+
|
|
105
|
+
### 🌐 Social Structure
|
|
106
|
+
Maps collaboration at three levels — **Author**, **Institution**, and **Country** — as interactive network graphs with Louvain community detection. Renders a choropleth world map of collaboration arcs. Shows a collaboration timeline across years.
|
|
107
|
+
|
|
108
|
+
### 🧠 Intellectual Structure
|
|
109
|
+
Uncovers the citation backbone of your field. Identifies the most co-cited reference pairs. Builds a citation historiography showing how foundational works influenced one another over time.
|
|
110
|
+
|
|
111
|
+
### 🔗 Clustering
|
|
112
|
+
Detects research communities using four network types — co-authorship, keyword co-occurrence, bibliographic coupling, and citation networks — each analysed for degree, betweenness, closeness, eigenvector, and PageRank centrality.
|
|
113
|
+
|
|
114
|
+
### 🏅 Evidence Quality
|
|
115
|
+
Per-paper **Evidence Score** (0–100) and **Reproducibility Score** (0–100) computed from nine quality signals: trial registration, ethics approval, informed consent, funding declaration, PubMed indexing, open access, figures, tables, and data availability. Signal coverage bar charts, score distribution histograms, and ranked paper tables for both scores.
|
|
116
|
+
|
|
117
|
+
### 🔍 Duplicate Detection
|
|
118
|
+
Detects duplicate papers by exact DOI match and fuzzy title similarity (≥ 90% token-sort ratio via rapidfuzz). Reports cluster count, duplicate rate, and a full table of suspect pairs grouped by cluster.
|
|
119
|
+
|
|
120
|
+
### 🗄️ Provenance Explorer
|
|
121
|
+
Field-level data provenance heatmap showing which enrichment source (CrossRef, OpenAlex, PubMed, etc.) filled each metadata field. Average confidence score per source and per field.
|
|
122
|
+
|
|
123
|
+
### 📅 Research Timeline
|
|
124
|
+
Interactive bubble scatter plot of publications over time — bubble size proportional to citation count, colour-coded by document type. Complementary year × document-type heatmap to spot activity patterns.
|
|
125
|
+
|
|
126
|
+
### 🔎 Semantic Search
|
|
127
|
+
Meaning-based full-text search over all paper titles and abstracts using `sentence-transformers` (`all-MiniLM-L6-v2`) and a FAISS cosine-similarity index. Finds topically relevant papers even without exact keyword matches. Index built once per project (~15 s) and cached to disk.
|
|
128
|
+
|
|
129
|
+
**Sub-features:**
|
|
130
|
+
- **Paper Novelty Scores** — novelty = 1 − mean cosine similarity to 5 nearest semantic neighbours. Identifies unique papers and redundant ones.
|
|
131
|
+
- **Paper Similarity** — find papers most similar to any paper in the corpus.
|
|
132
|
+
|
|
133
|
+
### 🗺️ Research Gap Detection
|
|
134
|
+
Clusters all paper abstracts with KMeans + FAISS embeddings, names each cluster with TF-IDF keywords, and scores it for research gap potential using an age–size formula. Renders an interactive bubble chart (gap level = colour) and a ranked gap card list. Typical first-run ~30 s, subsequent runs instant (cached index).
|
|
135
|
+
|
|
136
|
+
### 🤖 AI Features *(local — no API key needed)*
|
|
137
|
+
Three AI-powered views, all running via local **Ollama** (`llama3.1:8b`) with zero data leaving your machine:
|
|
138
|
+
|
|
139
|
+
| View | What it does |
|
|
140
|
+
|---|---|
|
|
141
|
+
| **AI Summary** | Corpus-level synthesis from your 50 most-cited abstracts → structured JSON: overall summary, main themes, emerging trends, research gaps, common methods, future directions, clinical implications. Cached per project. |
|
|
142
|
+
| **Research Chat** | Multi-turn RAG chat — retrieves 8 semantically relevant papers per question, injects them as grounded context into the LLM, returns cited answers with paper title references. Conversation history maintained per session. |
|
|
143
|
+
| **Claim Extraction** | Per-paper structured extraction for your top-50 cited papers: main finding, study design, sample size, key limitation, future work, evidence level. Each result cached individually. |
|
|
144
|
+
|
|
145
|
+
### 🗂️ Library & Projects
|
|
146
|
+
A full searchable, sortable table of every paper in your corpus with per-record pipeline status and detail view. Supports **multiple independent projects** — keep different research corpora separate and switch between them from the top bar.
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## How the Data Extraction Works
|
|
151
|
+
|
|
152
|
+
BiblioFlow reads your PDFs using **Docling** — a layout-aware parser that understands document structure without OCR. From each PDF, it extracts:
|
|
153
|
+
|
|
154
|
+
- Title, DOI, abstract, authors, publication year
|
|
155
|
+
- Keywords, trial IDs (NCT-pattern), ORCID identifiers
|
|
156
|
+
- Funding acknowledgement text and grant IDs
|
|
157
|
+
- Section structure, table and figure counts
|
|
158
|
+
- Reference list entries
|
|
159
|
+
|
|
160
|
+
Each extracted record then passes through an **enrichment waterfall** — a chain of open academic APIs where each source fills in only the fields the previous one left empty:
|
|
161
|
+
|
|
162
|
+
```
|
|
163
|
+
CrossRef → OpenAlex → Semantic Scholar → PubMed → Unpaywall → ROR
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
- **CrossRef:** verifies the DOI, fills publisher, document type, journal, page range
|
|
167
|
+
- **OpenAlex:** adds institutions with ROR IDs, country affiliations, full reference list, concepts, open-access status, and grants
|
|
168
|
+
- **Semantic Scholar:** adds abstract backfill, references, and fields of study
|
|
169
|
+
- **PubMed:** adds MeSH terms and grant IDs (when a PMID is resolvable)
|
|
170
|
+
- **Unpaywall:** adds open-access URL and licence information
|
|
171
|
+
- **ROR:** resolves institution names to countries where other sources missed them
|
|
172
|
+
|
|
173
|
+
Every field fill is recorded with its source, method, and confidence score in a `field_provenance` table — so you always know where each piece of data came from.
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## Architecture
|
|
178
|
+
|
|
179
|
+
<div align="center">
|
|
180
|
+
<img src="src/Public/BiblioFlow_Workflow.png" alt="BiblioFlow Architecture" width="100%" />
|
|
181
|
+
</div>
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## Installation
|
|
186
|
+
|
|
187
|
+
BiblioFlow uses **Docling** for PDF extraction, which includes large ML dependencies. A dedicated virtual environment is strongly recommended.
|
|
188
|
+
|
|
189
|
+
```bash
|
|
190
|
+
# 1. Clone the repository
|
|
191
|
+
git clone https://github.com/imrobintomar/BiblioFlow.git
|
|
192
|
+
cd BiblioFlow
|
|
193
|
+
|
|
194
|
+
# 2. Create and activate a virtual environment
|
|
195
|
+
python3 -m venv .venv
|
|
196
|
+
source .venv/bin/activate # Windows: .venv\Scripts\activate
|
|
197
|
+
|
|
198
|
+
# 3. Install core dependencies
|
|
199
|
+
pip install -r requirements.txt
|
|
200
|
+
|
|
201
|
+
# 4. (Optional) Semantic search, novelty, gaps, similarity
|
|
202
|
+
pip install sentence-transformers faiss-cpu scikit-learn
|
|
203
|
+
|
|
204
|
+
# 5. (Optional) AI features — install Ollama then pull a model
|
|
205
|
+
# https://ollama.com
|
|
206
|
+
ollama pull llama3.1:8b
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## Usage
|
|
212
|
+
|
|
213
|
+
### Launch the Dashboard
|
|
214
|
+
|
|
215
|
+
```bash
|
|
216
|
+
cd src
|
|
217
|
+
../.venv/bin/python3 app.py
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
Open **http://127.0.0.1:8050** — then use **Import** in the sidebar to point BiblioFlow at a folder of PDFs. The pipeline runs as a background job with live progress updates.
|
|
221
|
+
|
|
222
|
+
### Import from a Scopus CSV Export
|
|
223
|
+
|
|
224
|
+
If you already have a Scopus export CSV, import it directly without running the PDF pipeline:
|
|
225
|
+
|
|
226
|
+
```bash
|
|
227
|
+
cd src
|
|
228
|
+
../.venv/bin/python3 import_scopus_csv.py path/to/scopus_export.csv
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
### Run the Pipeline from the Command Line
|
|
232
|
+
|
|
233
|
+
```bash
|
|
234
|
+
../.venv/bin/python3 src/pipeline.py --input PDF/ --output out/
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
| Flag | Effect |
|
|
238
|
+
|---|---|
|
|
239
|
+
| `--no-scopus` | Skip the Scopus enrichment stage |
|
|
240
|
+
| `--force` | Reprocess all PDFs, including unchanged ones |
|
|
241
|
+
|
|
242
|
+
### Rebuild the Warehouse
|
|
243
|
+
|
|
244
|
+
The warehouse database (`src/biblioflow.sqlite`) is fully derived from the pipeline output — safe to delete and recreate at any time:
|
|
245
|
+
|
|
246
|
+
```bash
|
|
247
|
+
cd src
|
|
248
|
+
../.venv/bin/python3 migrate_legacy.py
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
---
|
|
252
|
+
|
|
253
|
+
## Tech Stack
|
|
254
|
+
|
|
255
|
+
| Component | Technology |
|
|
256
|
+
|---|---|
|
|
257
|
+
| **Dashboard** | [Dash](https://dash.plotly.com/) 2.x + [Plotly](https://plotly.com/) 5.x |
|
|
258
|
+
| **PDF extraction** | [Docling](https://github.com/DS4SD/docling) · PyMuPDF · pdfplumber |
|
|
259
|
+
| **Metadata enrichment** | CrossRef · OpenAlex · Semantic Scholar · PubMed · Unpaywall · ROR |
|
|
260
|
+
| **Network analysis** | [NetworkX](https://networkx.org/) 3.x — Louvain · centrality · spring layout |
|
|
261
|
+
| **Semantic search** | sentence-transformers (`all-MiniLM-L6-v2`) + FAISS (`IndexFlatIP`) |
|
|
262
|
+
| **Gap detection** | scikit-learn KMeans + TF-IDF + PCA |
|
|
263
|
+
| **Duplicate detection** | rapidfuzz `token_sort_ratio` |
|
|
264
|
+
| **AI features** | [Ollama](https://ollama.com) local LLM (`llama3.1:8b`) |
|
|
265
|
+
| **Storage** | SQLite — normalised warehouse + checksum cache |
|
|
266
|
+
| **Data tables** | dash-ag-grid · dash-table |
|
|
267
|
+
| **Geocoding** | geonamescache · pycountry |
|
|
268
|
+
| **Language** | Python 3.13+ |
|
|
269
|
+
|
|
270
|
+
---
|
|
271
|
+
|
|
272
|
+
## Project Structure
|
|
273
|
+
|
|
274
|
+
```
|
|
275
|
+
BiblioFlow/
|
|
276
|
+
├── src/
|
|
277
|
+
│ ├── app.py # Dashboard entry point
|
|
278
|
+
│ ├── components.py # Topbar, sidebar, shared panel components
|
|
279
|
+
│ ├── import_scopus_csv.py # Standalone Scopus CSV importer
|
|
280
|
+
│ ├── pages/ # One module per analysis section
|
|
281
|
+
│ │ ├── dashboard.py # KPI cards, trends, donut, gauge
|
|
282
|
+
│ │ ├── overview.py # Publication production analysis
|
|
283
|
+
│ │ ├── sources.py # Journals, Bradford's Law, publishers
|
|
284
|
+
│ │ ├── authors_page.py # Author metrics and co-author networks
|
|
285
|
+
│ │ ├── documents_page.py # Citations, references, funding intelligence
|
|
286
|
+
│ │ ├── conceptual_structure.py # Keywords and thematic map
|
|
287
|
+
│ │ ├── social_structure.py # Collaboration networks and world map
|
|
288
|
+
│ │ ├── clustering.py # Network clustering analysis
|
|
289
|
+
│ │ ├── networks.py # Intellectual structure / historiograph
|
|
290
|
+
│ │ ├── evidence.py # Evidence scores, reproducibility, duplicates,
|
|
291
|
+
│ │ │ # provenance, novelty
|
|
292
|
+
│ │ ├── timeline.py # Research timeline bubble + heatmap
|
|
293
|
+
│ │ ├── semantic_search.py # Semantic search with example chips
|
|
294
|
+
│ │ ├── gaps.py # Research gap detection bubble map
|
|
295
|
+
│ │ ├── ai.py # AI Summary · Research Chat · Claim Extraction
|
|
296
|
+
│ │ └── library.py # Full paper corpus table
|
|
297
|
+
│ ├── engine/ # Analysis engines
|
|
298
|
+
│ │ ├── evidence.py # Evidence & reproducibility scoring
|
|
299
|
+
│ │ ├── duplicates.py # Fuzzy + DOI duplicate detection
|
|
300
|
+
│ │ ├── funding.py # Funder categorisation and trends
|
|
301
|
+
│ │ ├── semantic_search.py # FAISS index · search · novelty · similarity
|
|
302
|
+
│ │ ├── gap_detection.py # KMeans gap scoring
|
|
303
|
+
│ │ ├── llm.py # Ollama client wrapper
|
|
304
|
+
│ │ ├── ai_summary.py # Corpus-level AI summary
|
|
305
|
+
│ │ └── claim_extraction.py # Per-paper claim extraction
|
|
306
|
+
│ ├── repository/ # Data access layer
|
|
307
|
+
│ ├── services/ # Import, enrichment, export services
|
|
308
|
+
│ ├── providers/ # CrossRef, OpenAlex, PubMed, … clients
|
|
309
|
+
│ ├── database/ # SQLite schema and connection helpers
|
|
310
|
+
│ ├── visualizations/ # Plotly chart builders and theme
|
|
311
|
+
│ │ ├── theme.py # Dark palette, apply_theme()
|
|
312
|
+
│ │ ├── lollipop.py # Horizontal lollipop chart
|
|
313
|
+
│ │ ├── donut.py # Donut / pie chart
|
|
314
|
+
│ │ ├── gauge.py # Completeness gauge
|
|
315
|
+
│ │ └── worldmap.py # Choropleth collaboration map
|
|
316
|
+
│ ├── extract/ # PDF extraction pipeline
|
|
317
|
+
│ ├── cache/ # FAISS index, AI summary, claim caches
|
|
318
|
+
│ └── assets/ # CSS and static files
|
|
319
|
+
├── requirements.txt
|
|
320
|
+
└── README.md
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
---
|
|
324
|
+
|
|
325
|
+
## Current Limitations
|
|
326
|
+
|
|
327
|
+
| Area | Status |
|
|
328
|
+
|---|---|
|
|
329
|
+
| Author–institution attribution | Paper-level only — cannot isolate a specific co-author's affiliation |
|
|
330
|
+
| Citation Half-Life | Not computable — APIs return cumulative citation counts, not per-year breakdowns |
|
|
331
|
+
| Author/Journal co-citation | Not implemented — requires resolving individual reference metadata per paper |
|
|
332
|
+
| Bibliographic coupling | Accuracy bounded by DOI resolution in reference lists |
|
|
333
|
+
| Entity deduplication | Institution and country name variants across providers are not yet merged |
|
|
334
|
+
| Evidence signals (PDF) | Trial IDs, ethics statements, figure counts require PDF extraction to be populated; Scopus CSV imports will show 0 for these fields |
|
|
335
|
+
| AI chat streaming | Responses appear after full generation — streaming output not yet implemented |
|
|
336
|
+
| Report export (PDF/Word/PPT) | Planned — marked "Soon" in the UI |
|
|
337
|
+
|
|
338
|
+
---
|
|
339
|
+
|
|
340
|
+
## Author
|
|
341
|
+
|
|
342
|
+
**Robin Tomar** — [itsrobintomar@gmail.com](mailto:itsrobintomar@gmail.com)
|
|
343
|
+
**Dr Prabudh Goel's Lab, AIIMS New Delhi**
|
|
344
|
+
|
|
345
|
+
---
|
|
346
|
+
|
|
347
|
+
<div align="center">
|
|
348
|
+
<sub>BiblioFlow © 2026 · Built for researchers, by researchers · Made with ♥ in India</sub>
|
|
349
|
+
</div>
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
<img src="src/Public/BiblioFlow_logo.png" alt="BiblioFlow" width="420" />
|
|
3
|
+
|
|
4
|
+
<h3>Research Intelligence. Flowing Insights.</h3>
|
|
5
|
+
|
|
6
|
+
<p>
|
|
7
|
+
A local-first platform that extracts structured bibliometric data from research PDFs<br/>
|
|
8
|
+
and delivers deep scholarly analysis through an interactive, publication-quality dashboard.
|
|
9
|
+
</p>
|
|
10
|
+
|
|
11
|
+
<p>
|
|
12
|
+
<img src="https://img.shields.io/badge/Python-3.13+-3776AB?style=flat-square&logo=python&logoColor=white" alt="Python 3.13+"/>
|
|
13
|
+
<img src="https://img.shields.io/badge/Dash-2.x-008DE4?style=flat-square&logo=plotly&logoColor=white" alt="Dash"/>
|
|
14
|
+
<img src="https://img.shields.io/badge/Plotly-5.x-3F4F75?style=flat-square&logo=plotly&logoColor=white" alt="Plotly"/>
|
|
15
|
+
<img src="https://img.shields.io/badge/NetworkX-3.x-orange?style=flat-square" alt="NetworkX"/>
|
|
16
|
+
<img src="https://img.shields.io/badge/SQLite-local--first-003B57?style=flat-square&logo=sqlite&logoColor=white" alt="SQLite"/>
|
|
17
|
+
<img src="https://img.shields.io/badge/Ollama-local%20AI-black?style=flat-square" alt="Ollama"/>
|
|
18
|
+
<img src="https://img.shields.io/badge/status-active-brightgreen?style=flat-square" alt="Status"/>
|
|
19
|
+
</p>
|
|
20
|
+
</div>
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## What is BiblioFlow?
|
|
25
|
+
|
|
26
|
+
**BiblioFlow** is a self-hosted bibliometric analysis tool built for researchers. You bring a collection of research PDFs — BiblioFlow does the rest.
|
|
27
|
+
|
|
28
|
+
It reads every PDF, pulls out the key scholarly metadata (title, DOI, authors, abstract, keywords, funding, citations), automatically enriches each record from open academic databases, and then presents the entire corpus through a rich, interactive analysis dashboard — all running locally on your machine with no data sent to any external service.
|
|
29
|
+
|
|
30
|
+
**The core workflow is simple:**
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
Upload PDFs → BiblioFlow extracts & enriches metadata → Explore bibliometric analysis
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Everything — from publication trends to author networks, keyword co-occurrence to AI-generated research summaries — is derived from the data inside your own PDF collection.
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Analysis Modules
|
|
41
|
+
|
|
42
|
+
BiblioFlow provides fourteen dedicated analysis modules across four capability tiers.
|
|
43
|
+
|
|
44
|
+
### 📊 Overview
|
|
45
|
+
Annual, monthly, quarterly, and decade-level publication production. Growth rates (CAGR), cumulative output, moving averages, publication heatmaps, and forecasting — broken down by document type, country, institution, and journal.
|
|
46
|
+
|
|
47
|
+
### 📚 Sources
|
|
48
|
+
Identifies the most productive journals and publishers in your corpus. Applies Bradford's Law to reveal the core zone of journals. Shows journal H-index, citation impact, open-access distribution, and publication timelines.
|
|
49
|
+
|
|
50
|
+
### ✍️ Authors
|
|
51
|
+
Ranks authors by productivity and citation impact. Computes H-index, G-index, M-index, i10-index, citation velocity, and career trajectory for every author. Maps co-author collaboration networks with community detection.
|
|
52
|
+
|
|
53
|
+
### 📄 Documents
|
|
54
|
+
Lists the most-cited papers in your corpus. Analyses reference lists to find the most frequently co-cited works. Full funding intelligence: funder lollipop chart, category breakdown (Government / Industry / Other), year-on-year funding trends, and multi-funded paper table.
|
|
55
|
+
|
|
56
|
+
### 🔑 Conceptual Structure
|
|
57
|
+
Identifies the most frequent keywords and concepts. Builds a **Thematic Map** — plotting keyword clusters by Callon centrality versus density — to reveal motor, niche, emerging, and declining themes. Tracks how keyword sets shift over time.
|
|
58
|
+
|
|
59
|
+
### 🌐 Social Structure
|
|
60
|
+
Maps collaboration at three levels — **Author**, **Institution**, and **Country** — as interactive network graphs with Louvain community detection. Renders a choropleth world map of collaboration arcs. Shows a collaboration timeline across years.
|
|
61
|
+
|
|
62
|
+
### 🧠 Intellectual Structure
|
|
63
|
+
Uncovers the citation backbone of your field. Identifies the most co-cited reference pairs. Builds a citation historiography showing how foundational works influenced one another over time.
|
|
64
|
+
|
|
65
|
+
### 🔗 Clustering
|
|
66
|
+
Detects research communities using four network types — co-authorship, keyword co-occurrence, bibliographic coupling, and citation networks — each analysed for degree, betweenness, closeness, eigenvector, and PageRank centrality.
|
|
67
|
+
|
|
68
|
+
### 🏅 Evidence Quality
|
|
69
|
+
Per-paper **Evidence Score** (0–100) and **Reproducibility Score** (0–100) computed from nine quality signals: trial registration, ethics approval, informed consent, funding declaration, PubMed indexing, open access, figures, tables, and data availability. Signal coverage bar charts, score distribution histograms, and ranked paper tables for both scores.
|
|
70
|
+
|
|
71
|
+
### 🔍 Duplicate Detection
|
|
72
|
+
Detects duplicate papers by exact DOI match and fuzzy title similarity (≥ 90% token-sort ratio via rapidfuzz). Reports cluster count, duplicate rate, and a full table of suspect pairs grouped by cluster.
|
|
73
|
+
|
|
74
|
+
### 🗄️ Provenance Explorer
|
|
75
|
+
Field-level data provenance heatmap showing which enrichment source (CrossRef, OpenAlex, PubMed, etc.) filled each metadata field. Average confidence score per source and per field.
|
|
76
|
+
|
|
77
|
+
### 📅 Research Timeline
|
|
78
|
+
Interactive bubble scatter plot of publications over time — bubble size proportional to citation count, colour-coded by document type. Complementary year × document-type heatmap to spot activity patterns.
|
|
79
|
+
|
|
80
|
+
### 🔎 Semantic Search
|
|
81
|
+
Meaning-based full-text search over all paper titles and abstracts using `sentence-transformers` (`all-MiniLM-L6-v2`) and a FAISS cosine-similarity index. Finds topically relevant papers even without exact keyword matches. Index built once per project (~15 s) and cached to disk.
|
|
82
|
+
|
|
83
|
+
**Sub-features:**
|
|
84
|
+
- **Paper Novelty Scores** — novelty = 1 − mean cosine similarity to 5 nearest semantic neighbours. Identifies unique papers and redundant ones.
|
|
85
|
+
- **Paper Similarity** — find papers most similar to any paper in the corpus.
|
|
86
|
+
|
|
87
|
+
### 🗺️ Research Gap Detection
|
|
88
|
+
Clusters all paper abstracts with KMeans + FAISS embeddings, names each cluster with TF-IDF keywords, and scores it for research gap potential using an age–size formula. Renders an interactive bubble chart (gap level = colour) and a ranked gap card list. Typical first-run ~30 s, subsequent runs instant (cached index).
|
|
89
|
+
|
|
90
|
+
### 🤖 AI Features *(local — no API key needed)*
|
|
91
|
+
Three AI-powered views, all running via local **Ollama** (`llama3.1:8b`) with zero data leaving your machine:
|
|
92
|
+
|
|
93
|
+
| View | What it does |
|
|
94
|
+
|---|---|
|
|
95
|
+
| **AI Summary** | Corpus-level synthesis from your 50 most-cited abstracts → structured JSON: overall summary, main themes, emerging trends, research gaps, common methods, future directions, clinical implications. Cached per project. |
|
|
96
|
+
| **Research Chat** | Multi-turn RAG chat — retrieves 8 semantically relevant papers per question, injects them as grounded context into the LLM, returns cited answers with paper title references. Conversation history maintained per session. |
|
|
97
|
+
| **Claim Extraction** | Per-paper structured extraction for your top-50 cited papers: main finding, study design, sample size, key limitation, future work, evidence level. Each result cached individually. |
|
|
98
|
+
|
|
99
|
+
### 🗂️ Library & Projects
|
|
100
|
+
A full searchable, sortable table of every paper in your corpus with per-record pipeline status and detail view. Supports **multiple independent projects** — keep different research corpora separate and switch between them from the top bar.
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## How the Data Extraction Works
|
|
105
|
+
|
|
106
|
+
BiblioFlow reads your PDFs using **Docling** — a layout-aware parser that understands document structure without OCR. From each PDF, it extracts:
|
|
107
|
+
|
|
108
|
+
- Title, DOI, abstract, authors, publication year
|
|
109
|
+
- Keywords, trial IDs (NCT-pattern), ORCID identifiers
|
|
110
|
+
- Funding acknowledgement text and grant IDs
|
|
111
|
+
- Section structure, table and figure counts
|
|
112
|
+
- Reference list entries
|
|
113
|
+
|
|
114
|
+
Each extracted record then passes through an **enrichment waterfall** — a chain of open academic APIs where each source fills in only the fields the previous one left empty:
|
|
115
|
+
|
|
116
|
+
```
|
|
117
|
+
CrossRef → OpenAlex → Semantic Scholar → PubMed → Unpaywall → ROR
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
- **CrossRef:** verifies the DOI, fills publisher, document type, journal, page range
|
|
121
|
+
- **OpenAlex:** adds institutions with ROR IDs, country affiliations, full reference list, concepts, open-access status, and grants
|
|
122
|
+
- **Semantic Scholar:** adds abstract backfill, references, and fields of study
|
|
123
|
+
- **PubMed:** adds MeSH terms and grant IDs (when a PMID is resolvable)
|
|
124
|
+
- **Unpaywall:** adds open-access URL and licence information
|
|
125
|
+
- **ROR:** resolves institution names to countries where other sources missed them
|
|
126
|
+
|
|
127
|
+
Every field fill is recorded with its source, method, and confidence score in a `field_provenance` table — so you always know where each piece of data came from.
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## Architecture
|
|
132
|
+
|
|
133
|
+
<div align="center">
|
|
134
|
+
<img src="src/Public/BiblioFlow_Workflow.png" alt="BiblioFlow Architecture" width="100%" />
|
|
135
|
+
</div>
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## Installation
|
|
140
|
+
|
|
141
|
+
BiblioFlow uses **Docling** for PDF extraction, which includes large ML dependencies. A dedicated virtual environment is strongly recommended.
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
# 1. Clone the repository
|
|
145
|
+
git clone https://github.com/imrobintomar/BiblioFlow.git
|
|
146
|
+
cd BiblioFlow
|
|
147
|
+
|
|
148
|
+
# 2. Create and activate a virtual environment
|
|
149
|
+
python3 -m venv .venv
|
|
150
|
+
source .venv/bin/activate # Windows: .venv\Scripts\activate
|
|
151
|
+
|
|
152
|
+
# 3. Install core dependencies
|
|
153
|
+
pip install -r requirements.txt
|
|
154
|
+
|
|
155
|
+
# 4. (Optional) Semantic search, novelty, gaps, similarity
|
|
156
|
+
pip install sentence-transformers faiss-cpu scikit-learn
|
|
157
|
+
|
|
158
|
+
# 5. (Optional) AI features — install Ollama then pull a model
|
|
159
|
+
# https://ollama.com
|
|
160
|
+
ollama pull llama3.1:8b
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## Usage
|
|
166
|
+
|
|
167
|
+
### Launch the Dashboard
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
cd src
|
|
171
|
+
../.venv/bin/python3 app.py
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
Open **http://127.0.0.1:8050** — then use **Import** in the sidebar to point BiblioFlow at a folder of PDFs. The pipeline runs as a background job with live progress updates.
|
|
175
|
+
|
|
176
|
+
### Import from a Scopus CSV Export
|
|
177
|
+
|
|
178
|
+
If you already have a Scopus export CSV, import it directly without running the PDF pipeline:
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
cd src
|
|
182
|
+
../.venv/bin/python3 import_scopus_csv.py path/to/scopus_export.csv
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
### Run the Pipeline from the Command Line
|
|
186
|
+
|
|
187
|
+
```bash
|
|
188
|
+
../.venv/bin/python3 src/pipeline.py --input PDF/ --output out/
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
| Flag | Effect |
|
|
192
|
+
|---|---|
|
|
193
|
+
| `--no-scopus` | Skip the Scopus enrichment stage |
|
|
194
|
+
| `--force` | Reprocess all PDFs, including unchanged ones |
|
|
195
|
+
|
|
196
|
+
### Rebuild the Warehouse
|
|
197
|
+
|
|
198
|
+
The warehouse database (`src/biblioflow.sqlite`) is fully derived from the pipeline output — safe to delete and recreate at any time:
|
|
199
|
+
|
|
200
|
+
```bash
|
|
201
|
+
cd src
|
|
202
|
+
../.venv/bin/python3 migrate_legacy.py
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
---
|
|
206
|
+
|
|
207
|
+
## Tech Stack
|
|
208
|
+
|
|
209
|
+
| Component | Technology |
|
|
210
|
+
|---|---|
|
|
211
|
+
| **Dashboard** | [Dash](https://dash.plotly.com/) 2.x + [Plotly](https://plotly.com/) 5.x |
|
|
212
|
+
| **PDF extraction** | [Docling](https://github.com/DS4SD/docling) · PyMuPDF · pdfplumber |
|
|
213
|
+
| **Metadata enrichment** | CrossRef · OpenAlex · Semantic Scholar · PubMed · Unpaywall · ROR |
|
|
214
|
+
| **Network analysis** | [NetworkX](https://networkx.org/) 3.x — Louvain · centrality · spring layout |
|
|
215
|
+
| **Semantic search** | sentence-transformers (`all-MiniLM-L6-v2`) + FAISS (`IndexFlatIP`) |
|
|
216
|
+
| **Gap detection** | scikit-learn KMeans + TF-IDF + PCA |
|
|
217
|
+
| **Duplicate detection** | rapidfuzz `token_sort_ratio` |
|
|
218
|
+
| **AI features** | [Ollama](https://ollama.com) local LLM (`llama3.1:8b`) |
|
|
219
|
+
| **Storage** | SQLite — normalised warehouse + checksum cache |
|
|
220
|
+
| **Data tables** | dash-ag-grid · dash-table |
|
|
221
|
+
| **Geocoding** | geonamescache · pycountry |
|
|
222
|
+
| **Language** | Python 3.13+ |
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
## Project Structure
|
|
227
|
+
|
|
228
|
+
```
|
|
229
|
+
BiblioFlow/
|
|
230
|
+
├── src/
|
|
231
|
+
│ ├── app.py # Dashboard entry point
|
|
232
|
+
│ ├── components.py # Topbar, sidebar, shared panel components
|
|
233
|
+
│ ├── import_scopus_csv.py # Standalone Scopus CSV importer
|
|
234
|
+
│ ├── pages/ # One module per analysis section
|
|
235
|
+
│ │ ├── dashboard.py # KPI cards, trends, donut, gauge
|
|
236
|
+
│ │ ├── overview.py # Publication production analysis
|
|
237
|
+
│ │ ├── sources.py # Journals, Bradford's Law, publishers
|
|
238
|
+
│ │ ├── authors_page.py # Author metrics and co-author networks
|
|
239
|
+
│ │ ├── documents_page.py # Citations, references, funding intelligence
|
|
240
|
+
│ │ ├── conceptual_structure.py # Keywords and thematic map
|
|
241
|
+
│ │ ├── social_structure.py # Collaboration networks and world map
|
|
242
|
+
│ │ ├── clustering.py # Network clustering analysis
|
|
243
|
+
│ │ ├── networks.py # Intellectual structure / historiograph
|
|
244
|
+
│ │ ├── evidence.py # Evidence scores, reproducibility, duplicates,
|
|
245
|
+
│ │ │ # provenance, novelty
|
|
246
|
+
│ │ ├── timeline.py # Research timeline bubble + heatmap
|
|
247
|
+
│ │ ├── semantic_search.py # Semantic search with example chips
|
|
248
|
+
│ │ ├── gaps.py # Research gap detection bubble map
|
|
249
|
+
│ │ ├── ai.py # AI Summary · Research Chat · Claim Extraction
|
|
250
|
+
│ │ └── library.py # Full paper corpus table
|
|
251
|
+
│ ├── engine/ # Analysis engines
|
|
252
|
+
│ │ ├── evidence.py # Evidence & reproducibility scoring
|
|
253
|
+
│ │ ├── duplicates.py # Fuzzy + DOI duplicate detection
|
|
254
|
+
│ │ ├── funding.py # Funder categorisation and trends
|
|
255
|
+
│ │ ├── semantic_search.py # FAISS index · search · novelty · similarity
|
|
256
|
+
│ │ ├── gap_detection.py # KMeans gap scoring
|
|
257
|
+
│ │ ├── llm.py # Ollama client wrapper
|
|
258
|
+
│ │ ├── ai_summary.py # Corpus-level AI summary
|
|
259
|
+
│ │ └── claim_extraction.py # Per-paper claim extraction
|
|
260
|
+
│ ├── repository/ # Data access layer
|
|
261
|
+
│ ├── services/ # Import, enrichment, export services
|
|
262
|
+
│ ├── providers/ # CrossRef, OpenAlex, PubMed, … clients
|
|
263
|
+
│ ├── database/ # SQLite schema and connection helpers
|
|
264
|
+
│ ├── visualizations/ # Plotly chart builders and theme
|
|
265
|
+
│ │ ├── theme.py # Dark palette, apply_theme()
|
|
266
|
+
│ │ ├── lollipop.py # Horizontal lollipop chart
|
|
267
|
+
│ │ ├── donut.py # Donut / pie chart
|
|
268
|
+
│ │ ├── gauge.py # Completeness gauge
|
|
269
|
+
│ │ └── worldmap.py # Choropleth collaboration map
|
|
270
|
+
│ ├── extract/ # PDF extraction pipeline
|
|
271
|
+
│ ├── cache/ # FAISS index, AI summary, claim caches
|
|
272
|
+
│ └── assets/ # CSS and static files
|
|
273
|
+
├── requirements.txt
|
|
274
|
+
└── README.md
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
---
|
|
278
|
+
|
|
279
|
+
## Current Limitations
|
|
280
|
+
|
|
281
|
+
| Area | Status |
|
|
282
|
+
|---|---|
|
|
283
|
+
| Author–institution attribution | Paper-level only — cannot isolate a specific co-author's affiliation |
|
|
284
|
+
| Citation Half-Life | Not computable — APIs return cumulative citation counts, not per-year breakdowns |
|
|
285
|
+
| Author/Journal co-citation | Not implemented — requires resolving individual reference metadata per paper |
|
|
286
|
+
| Bibliographic coupling | Accuracy bounded by DOI resolution in reference lists |
|
|
287
|
+
| Entity deduplication | Institution and country name variants across providers are not yet merged |
|
|
288
|
+
| Evidence signals (PDF) | Trial IDs, ethics statements, figure counts require PDF extraction to be populated; Scopus CSV imports will show 0 for these fields |
|
|
289
|
+
| AI chat streaming | Responses appear after full generation — streaming output not yet implemented |
|
|
290
|
+
| Report export (PDF/Word/PPT) | Planned — marked "Soon" in the UI |
|
|
291
|
+
|
|
292
|
+
---
|
|
293
|
+
|
|
294
|
+
## Author
|
|
295
|
+
|
|
296
|
+
**Robin Tomar** — [itsrobintomar@gmail.com](mailto:itsrobintomar@gmail.com)
|
|
297
|
+
**Dr Prabudh Goel's Lab, AIIMS New Delhi**
|
|
298
|
+
|
|
299
|
+
---
|
|
300
|
+
|
|
301
|
+
<div align="center">
|
|
302
|
+
<sub>BiblioFlow © 2026 · Built for researchers, by researchers · Made with ♥ in India</sub>
|
|
303
|
+
</div>
|